Instructions and Overview

In this lab, you will begin to outline a research plan for a data ethnography and analysis project. In the first part of this lab, you will document what you currently know about a topic, along with some research questions that, when addressed, could further your understanding on the topic. In the second part of the assignment, you will begin searching for data that could help address some of the empirical research questions that you devise. Throughout this document, you will be expected to fill responses to prompts into code chunks that have been set to not evaluate when run. You will also be expected to fill in a series of tables. Be sure to reference lab 1 if you are unsure how to go about filling in these sections.

Topic Selection

I have taught this data ethnography and analysis project in a UC Davis course called Data Sense and Exploration twice now, and each time, to help students scope research topics, I have proposed a theme. In Spring 2019, the theme was “social and environmental challenges facing California.” In Spring 2020, the theme was “US social vulnerability in the wake of a pandemic.” In these courses students have selected topics such as:

  • the extent of student debt post-graduation
  • social support for homelessness in major cities
  • changes in avian migratory patterns
  • the impact of industrial GHG emissions on marginalized communities
  • FEMA response to wildfire damage
  • differences in eligibility for supplemental nutrition programs across the US
  • changes domestic violence prevalence over time
  • access to broadband and Internet infrastructure in NYC

The notebooks in this Lab Book are designed to support data research on just about any topic. With this in mind, if you are not already coming to this Lab Book with a particular topic in mind, as you go about selecting a topic, you may consider what issues most matter to you, your family, and your community in the contemporary moment.

What topic am I investigating? (just one phrase here is fine.)

Fill response here. 

Why is this topic important to study right now?

Fill response here. 

Project Contexts

At this point, we are going to begin mapping out some of the project contexts. By this I mean that we are going to put your topic into temporal, geographic, and social-cultural perspective. Imagine that your topic is somehow depicted in the center of a plain white sheet of paper. What details would we need to fill into the background in order to bring this topic to life? We would need to add people. We would need to add environments. We would need to communicate the time and place in which the topic was being depicted. The eight questions below encourage you to draw out these contexts. Note that there is not necessarily a wrong way to answer these questions, and you absolutely do not need to answer them comprehensively. If we tried to respond to them “fully,” we’d probably go on writing forever! Instead I’d like you curate just a few things that come to mind when you consider your topic. Having some of these contexts written out will help you as you are searching for data. For each question below, please respond in 1-2+ complete sentences.

What are some key events, dates, or years relevant to this topic? This might be a long span of time or a specific event.

Fill response here. 

What are some key sites, locations, or geographies relevant to this topic? This might be a large boundary like a country or a small community.

Fill response here. 

What social groups are impacted by this topic, and how?

Fill response here. 

How is the environment implicated in this topic?

Fill response here. 

How is the economy implicated in this topic?

Fill response here. 

How are politics implicated in this topic?

Fill response here. 

How are you implicated in this topic?

Fill response here. 

What are some of the most common ways different social groups talk about this topic?

Fill response here. 

Research Questions

Empirical research questions are questions that an analyst can assess evidence to address. Examples of social-theoretical questions include:

  • Do United States hospitals have enough beds to accommodate the expected influx in Covid-19 cases? At what point will there not be enough beds available?
  • In which US states are hospitals better equipped with beds and staff to take on an influx in patients over the course of the next month?

Empirical research questions are specific to a particular time and place. Notice how I delimit my questions to the US above and the second question to a specific month. Now think about your topic. What questions could you ask about your topic that would contribute to an understanding of the topic’s prevalence, how the topic impacts diverse communities, how the topic has changed over time, or how communities are equipped to respond to the topic? Be sure that your question is one that you can assess evidence to address, and that it is specific to a certain time and place. If your topic is mental health, you might ask:

  • In 2020, how many people in the United States have insurance that covers therapy visits?

Note how, with the right data I could answer this question definitively.

What empirical research questions might I address in my research? List at least two.

Fill response here. 

Beware of setting up your question as a dichotomy! Did you use the word ‘or’ in your question above? I’ve seen many students do this in past assignments - asking questions like “Was this legislation beneficial to local communities, or was it harmful?” or “Did this technology fix inequities in the community, or did it sustain them?” In each of these questions, we have structured our research to test two conditions only. Yet, when it comes to studying complex contemporary issues, things are never black and white. It is highly likely that the situation we are examining in our research is much more complicated than these two conditions can capture. We should avoid structuring our research questions to test mutually exclusive categories. In placing false dichotomies in our research questions, we run the risk of oversimplifying complex causation, and we limit what the research can say.

Social-Theoretical questions are questions about how certain social, political, or environmental phenomena operate at a broad scale. They are much broader than empirical research questions. We often cannot answer these questions with one research project. However, we often aim to increase understanding of these questions through a research project. Examples of social-theoretical questions include:

  • How has the United States prioritized critical health infrastructure?
  • How do national hospital business models implicate social vulnerability in the wake of a public health crisis?
  • How are existing structural inequalities exacerbated in a pandemic?

Note how for each of these questions I would need to examine lots of different data and carry out a number of different projects to answer them.

Now think about your topic. What broader questions about how social, political, or environmental phenomena operate might you wish to address through research?

What social-theoretical questions might I address in my research? List at least two.

Fill response here. 

What “ideal datasets” would help me address my empirical research questions?

Fill in the table below with at least 5 datasets that would help you address your empirical research questions. Be specific, filling out their geographic scope and the timespan they would cover. In the first column characterize the topic of the dataset. In the second and third column, describe the geographic and temporal scope. Finally, in the last column, mark whether you believe such a dataset is accessible.

Dataset Geography Timespan Do you think this data is accessible?
Number of confirmed cases of Covid-19 All countries across the globe January 2020 to present Yes
Fill Fill Fill Fill
Fill Fill Fill Fill
Fill Fill Fill Fill
Fill Fill Fill Fill
Fill Fill Fill Fill

Background on Open Government Data

In May 2009, Data.gov - a web portal for accessing US government datasets - was launched by then federal Chief Information Officer Vivek Kundra. Following this, in December 2009, then US President Barack Obama signed the Open Government Data Directive, requiring that all federal agencies post at least 3 high value datasets on data.gov within 45 day. A few years later in May 2013, Pres. Obama signed an Executive Order to: “M”ak[e] Open and Machine Readable the New Default for Government Information."

The Order required that the US Office of Management and Budgeting, in collaboration with the CIO and CTO, put out and oversee an Open Data Policy. This policy required the following:

  • Data needs to be published in machine-readable formats
  • Data needs to be licensed openly
  • Data needs to be described with metadata

See here for more details.

Note that these are only requirements for data produced through the federal government. Cities, states, and counties have their own open data programs, policies, and laws, which are sometimes more and sometimes less stringent than the federal policy. However, most open data policies, in some way, deal with the three issues listed above - machine-readability, licensing, and metadata.

Let’s talk about what each of these issues entail:

Machine-readable

Last quarter, in my Hack for California research cluster, one project was examining gentrification over the past ten years around and near the UC Davis Medical Center in Sacramento. One of the indicators we were examining in relation to gentrification was the number of construction permits the city had awarded in that area for demolitions, new buildings, and remodeling. The City of Sacramento has construction permit data from 2012 to present stored in Excel files on their website - one file of permits per month. One of the students in the research cluster (and in fact one of your stellar classmates) was able to write a script to download each of these files and bind them into one large file. However, we were examining gentrification over a much longer period of time and needed construction permits dating back to 1990. We knew that the City had this data because they had produced a public map, where you could search for an address in Sacramento and retrieve every construction permit it had been awarded since the early 1980s. We needed a data file that listed this for every address in the city. With this in mind, I submitted a public records request asking for the following: “I’m looking for a data file of all construction permits issued across Sacramento from 1990 to present in a downloadable, machine-readable format.”

Two weeks later they sent me back a 9,543-page PDF document listing every construction permit awarded in the city since 1990. I took a deep breath. Had they sent this in a CSV file, we could have gotten to work immediately. It would take hours to get this hefty document into a format we could work with. I really hate PDFs.

Machine-readable data are data that can be readily processed by a computer. Typically machine-readable data are structured in ways that many different computer applications can recognize. As my story above indicates, there are different degrees of machine-readability of digital data:

  • Data stored in tables in PDFs (files with extension .pdf) are perhaps some of the least machine-readable data that we will encounter in our data research. This is because data in tables in PDFs are not structured in such a way that computer software can easily reference and operate on specific values.
  • Data stored in Excel (files with extension .xls) files are a bit more machine-readable. We can import data stored into an Excel file into Excel, and the software will recognize how the data are structured, aggregate values into separate cells, and thus present it to us in a way that we can operate on it. However, to open Excel, we need access to Microsoft products, which we have to pay for. This means that the Excel file is not stored in an open format.
  • Data stored in Comma Separated Value (files with extension .csv) files are more machine-readable than data stored in Excel files. This is because data in CSV files are structured in an open format - or a format that is not dependent on proprietary software. A CSV file is a text file structured so that each line in the file designates a record and various fields for describing that record are separated by commas. If we were to open a CSV file in a basic text editor, it would look something like this:

Name, Age, Birth Month, Time on Phone

Sally, 23, 3, 42

Julie, 40, 2, 98

Mark, 14, 8, 120

However, if we were to open the same file in Excel, each value would be separated into its own cell. A CSV file is software independent. As a standardized way of displaying data, just about any computer application that displays data is prepared to read a CSV file and format it for display.

While we won’t work with such formats in this course, data can be made even more machine-readable than a CSV file. Formats like XML and RDF allow us to structure data with much more specificity. They are often considered the gold standards of machine-readability. Sir Tim Berners-Lee, the inventor of the World Wide Web, often uses this diagram to outline the degrees of machine-readability of open data (if you want to really get me going, ask me the difference between the Internet and the Web!):

5-star open data

In the above chart, the acronyms are short for the following:

  • OL: Available online
  • RE: Machine-readable
  • OF: Open format
  • URI: Each observation has a unique resource identifier so that we may refer to it persistently
  • LD: Data is linked to other datasets

Licensed Openly

Just because something is available on the Web does not necessarily mean that we are free to download and use it as we please. Historically, different government agencies would allow access to certain datasets for a fee that would help to cover the costs of running public data programs. (Oftentimes, we hear this referred to as data being behind a “paywall.”) With the US Open Government Directive, all data produced by any federal US agency would default to the public domain. When data is in the public domain, they are owned by the the public. The data are not subject to any copyright or intellectual property law and can be accessed, modified, reproduced, and distributed without any restrictions.

Data acquired by any federal US agency needed to be given an open data license that met the following criteria:

  1. The license allowed for data reuse and modifications.
  2. The license could not restrict any form of redistribution of the data.
  3. The license could not discriminate any person or group from these rights.

There are a few global licenses that government agencies can apply to data that meet this criteria. One such license is the Creative Commons Universal Public Domain License (CC0 1.0).

Creative Commons is a non-profit organization that aims to increase the availability of creative works that the public can remix and share. Creative Commons has created a number of free licenses that the public can apply to their own creative works in order to designate the extent to which others can modify and redistribute them. These licenses indicate whether individuals other than the content creator may share the work, remix the work, and/or make money off of the work, along with whether such individuals have to attribute the content creator when sharing it. The following image outlines a number of Creative Commons licenses from most open to least open. You’ll notice that CC0 1.0 - the license compatible with each of the criteria listed above is at the top of the image.

CC Licenses

In the image above, BY means that the license requires that the content creator be attributed whenever the creative work is shared. SA means that the license requires that any derivatives of the original work be given the same license as the original work. NC means that the license restricts the work from being used for commercial purposes. ND means that the license restricts other individuals from modifying the original work.

See this dataset of Towed Cars for the Past Thirty Days in Hartford, CT, which has been licensed with the CC0 1.0.

Hartford License

Another open license that meets the criteria listed above is the Open Data Commons Public Domain and Dedication License (PDDL). You can read more about the specifics of this license here. See this dataset of City Hall Electricity Usage in Boston, which has been licensed with the PDDL: Boston License

Different cities and states throughout the US will have different laws about the degree to which data should be openly licensed. In most open government data portals, you will be able to discern how data licensed in its administrative metadata - to which we will turn next.

Metadata

Metadata is data about data. There are two kinds of metadata:

  1. Administrative metadata: data about how a dataset is/should be managed
  2. Descriptive metadata: data about what is inside a dataset

Administrative metadata will answer questions such as:

  • Who created this data?
  • When did they create it?
  • When was it last updated?
  • How often will it be updated?
  • Who published it?
  • Who owns the data, and how is it licensed?

Check out the administrative metadata available for this open dataset detailing Baltimore 911 Police Calls for Service. Here is a screenshot of the linked page:

Administrative Open Data Under the About this Dataset section on the page, you’ll see a number of fields describing the data - how frequently the data is updated, who published the data, who to contact regarding the data, who has rights to use and distribute the data, when the data was created, and when the data was last updated. All of this metadata provides us with information about how this data is managed; in other words, it provides administrative metadata. Why is administrative metadata so important? Here are just a few reasons:

  • If we run into errors in the data or if we have questions regarding the data, we need to know who to contact.
  • We need to know how often it is updated to get a sense of its timeliness. Data that is rarely updated may be less relevant than they were when first published.
  • We need to know how it is licensed so that we understand whether we have permission to use it, to distribute it, or to publish it.
  • We need to know who created it in order to understand what perspective the data represents.
  • Just like when we cite quotes in a paper, we need to cite data when we reference it. All of this information communicates to us how to cite the data.

As an example of why this is important, consider this dataset documenting traffic accidents in Denver. There is a long preamble to the data, indicating important information about how the dataset gets updated. Every time an accident occurs it is entered into the dataset. However, when first reported, the Denver Police Department likely does not have all of the information about the accident. That information becomes available through investigations, and as it becomes available, the entries associated with that accident in the dataset are updated. The following disclaimer on the data portal provides important administrative metadata:

“Incidents that occurred at least 30 days ago tend to be the most accurate, although records are returned for incidents that happened yesterday. For motor vehicle crashes that are still under investigation and involve a serious bodily or fatal injury, some attributes will appear as,”UNDER INVESTIGATION." This is to help ensure that any court proceedings related to these incidents are not inadvertently hindered. Once the investigation is closed, all of the incident’s attributes will be visible. This dynamic nature of motor vehicle crash data means that content provided here today will probably differ from content provided a week from now. Likewise, content provided on this site will probably differ somewhat from crime statistics published elsewhere by the City and County of Denver, even though they draw from the same database."

While administrative metadata characterizes how the data is managed, descriptive metadata tells us about the content of a dataset. With descriptive metadata, we should be able to answer questions such as:

  • How many columns are in the dataset, and how many rows?
  • What does each row represent?
  • What does each column name refer to?
  • What are the possible values in each column?
  • How was the data collected, and what standards of measurement were used?
  • What assumptions were made when the data was collected, and how will those assumptions be presented in the data?

Check out some of the descriptive metadata for the same Baltimore 911 Police Calls for Service above. Descriptive Metadata

As part of this basic descriptive metadata, we can see that there are 7.61 million rows in the dataset and 17 columns. We can see that each row (or observation) in the dataset represents a call, and we can see each of the columns (or variables) in dataset that describe a call.

This dataset is published in Baltimore’s open data portal. Many cities, counties, states, and countries now have their own versions of an open data portal where various government agencies under their jurisdictions publish datasets. You’ll notice that many of these portals look very similar. This is because, for the past decade, Socrata - a company that has designed a data asset management platform specifically for open government - has become a go-to resource for opening government data. A considerable number of open data platforms run on Socrata and will thus look and feel similar.

As we continue our labs we are going to keep coming back to a key point: any count that we produce or any measurement that we produce will always be dependent on how we define what we are counting or measuring. If we are going to count the number of cars on the road, we have to ask: What counts as a car? What will I include in the count and what will I exclude? If we were going to measure the height of a chair, we have to ask: According to what units am I going to measure the height? The numbers that we produce will be shaped by the choices we make regarding data collection. Without documenting those choices, the values won’t make much sense to others. Again, we must first define things in order to count or measure them. This is why it is so important that when we share our data, others can look up the definitions that we are using to produce our values.

With this mind, descriptive metadata is often documented in what is called a data dictionary. Data dictionaries are tools for looking up what various variables and codes in a dataset refer to. With a data dictionary, a data analyst can look up how values were defined much like they would look up the definition of a word in the Oxford English Dictionary. For instance, San Francisco also publishes a dataset documenting [911 Calls for Service] (https://data.sfgov.org/Public-Safety/Police-Department-Calls-for-Service/hz9m-tj6z), and in addition to the information available above, they provide an attachment to a document identifying what number codes and abbreviations in the dataset refer to:

attachments codes

New Orleans also publishes a version of the 911 calls for service dataset. They have created a separate data dictionary document for recording descriptive metadata about the dataset.

attachments Data Dictionary

Check out this really nice piece on FiveThirtyEight, detailing the extent to which different cities and states have made crime data available for public analysis.

Data dictionaries are often very important for crime data as there are a number of caveats to what can be publicly reported with regards to crime. Consider something I learned while working in NYC.

nyc_arrests <- read.csv("https://data.cityofnewyork.us/api/views/uip8-fykc/rows.csv", stringsAsFactors = FALSE)

NYC publishes a dataset documenting each arrest, the date it occurred, where it occurred, the crime suspected, and demographic details about the person arrested from the start of the year to the present.

nyc_arrests %>% head()

However, for certain crimes, such as rape, sharing the location of where the crime occurred can put individuals at considerable risk. When we filter this data to only represent rape arrests that have occurred in Manhattan, and then map it, you will notice that there are very few locations represented on the graph - 19 at the writing of this lab.

To view this map, enter the following into your console, and then run the code below:

install.packages(“leaflet”)

library(leaflet)
library(tidyverse)

nyc_arrests %>%
  filter(OFNS_DESC == "RAPE" & ARREST_BORO == "M") %>%
  leaflet() %>% 
  addProviderTiles(providers$CartoDB.Positron) %>%
  addMarkers(~Longitude, ~Latitude)

Does this mean that only 19 arrests have been made for rapes in Manhattan since the start of the year? It does not. From examining the data documentation, we learn that unlike other crimes in NYC, the location of all rape arrests are geocoded in the dataset to the address of the police station house of the police precinct where the rape occurred. This is to protect the privacy and anonymity of the victim.

Some data dictionaries are very robust, detailing not only what each column refers to, but also the expected type of data in that column, every value that can appear in that column, where data might be missing in that column and why, and information about how the values in that column were generated. Other data dictionaries include much less information, forcing a data analyst to make assumptions about what values mean. Sometimes, a data dictionary is easily accessible with a dataset. However, sometimes, it can be much harder to find descriptive metadata - at times because it is buried within complicated user interfaces, and at other times, because it has not been created at all.

In an ideal world, we would have rich metadata for every dataset published on an open government data portal. Unfortunately, this is rarely the case. The robustness of the data documentation, along with its ease of accessibility, can indicate the extent to which data publishers have prioritized responsible stewardship of the data. It can also indicate the human, financial, and technical resources various governments have available for data management and stewardship. When I worked in NYC, there were some agencies that published dozens of datasets on the open data portal with just one person at their agency responsible for managing the publication and stewardship of all of those datasets, in addition to that person’s other duties.

Notably, without descriptive metadata, it is much more likely that we will make poor assumptions about what certain terms mean in the data. If you ever find yourself in a situation where you don’t know what a term in an open government dataset means, this is where administrative metadata can be important. Before drawing conclusions from the data, you should contact the designated contact person with a detailed message explaining points of confusion in the data. (You may also want to encourage them to document their response in a data dictionary!) In future labs, I will describe a number of examples where we have had to do this in past iterations of this course.


Dataset Hopping

Now you will begin to search for open government or academic datasets related to your chosen topic. Below I have some recommendations to open data portals where students have found related to their topics in the past. However, I also encourage you to search for data in city and state open data portals.

Environment

Based on your research, fill the datasets most suitable for examining your topic into the chart below. Be sure to respond to each of the questions in the chart. I’ve included a data dictionary below so that you may reference what each column means.

Data Dictionary for Dataset Hopping Chart

  • Dataset?: What is the title of the dataset?
  • Found?: Where did you find it? (Provide a link.)
  • Formats?: In what formats is it available for download?
  • DD?: Is there a data dictionary or data documentation available for download?
  • Timespan?: What range of time does it cover?
  • Geography? What geographic range does it cover?
  • Row?: What does each row in the dataset represent?
  • Update?: How often is the dataset updated?
  • Source?: What organization created this dataset? Is this organization reputable?

Dataset Hopping Chart

I’ve included an example of a dataset we will use as an example for labs in the first row.

Dataset? Found? Formats? DD? Timespan? Geography? Row? Update?
2019 Novel Coronavirus COVID-19 https://github.com/CSSEGISandData/COVID-19 .csv No Jan 22, 2020 to Present Global by Province/Country Cases per day by Province/Country Daily
Fill Fill Fill Fill Fill Fill Fill Fill
Fill Fill Fill Fill Fill Fill Fill Fill
Fill Fill Fill Fill Fill Fill Fill Fill

Note that certain datasets will work better for these assignments than others. When these labs are being completed in the context of one of my courses, I help students determine which datasets are most appropriate for the following assignments. Here are some things that I take into consideration while providing guidance to the student.

  • First, it will be very difficult to complete the following assignments for a dataset that has zero documentation. This does not mean that such datasets don’t deserve critical attention. It just means that they deserve a different type of attention than the following labs can afford.
  • Second, these assignments are designed to support engagement with rectangular datasets - i.e. datasets that are structured into a series of rows of equal length and columns of equal length. While it can be important to study data structured in other ways, these labs are not designed to support that kind of engagement.
  • Third, these labs will work better for datasets that are at most three-dimensional. What do I mean by this? As we went over in lab 1, each row in a rectangular dataset represents an observation. In one-dimensional data, you should be able to uniquely identify each row in the dataset with just one variable. Every row represents one thing - a hospital, a person, a location, etc. In two-dimensional data, you should be able to uniquely identify each row in the dataset with two variables. For instance, perhaps the dataset is reporting information about a county each year. In this case, you would need both the year and the county to uniquely identify each row. In three-dimensional data, you should be able to uniquely identify each row in the dataset with three variables. For instance, perhaps the dataset is reporting information about different policy types in each county in each year. In this case, you would need all three of these variables to uniquely identify this row. We will go over this more in lab 4. For now, you should just keep in mind that data requiring more than three variables to uniquely identify each row will not work well for these labs.
LS0tCnRpdGxlOiAiTGFiIDIgLSBSZXNlYXJjaCBQbGFuIGFuZCBEYXRhc2V0IEhvcHBpbmciCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMycKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCiMjIEluc3RydWN0aW9ucyBhbmQgT3ZlcnZpZXcKCkluIHRoaXMgbGFiLCB5b3Ugd2lsbCBiZWdpbiB0byBvdXRsaW5lIGEgcmVzZWFyY2ggcGxhbiBmb3IgYSBkYXRhIGV0aG5vZ3JhcGh5IGFuZCBhbmFseXNpcyBwcm9qZWN0LiBJbiB0aGUgZmlyc3QgcGFydCBvZiB0aGlzIGxhYiwgeW91IHdpbGwgZG9jdW1lbnQgd2hhdCB5b3UgY3VycmVudGx5IGtub3cgYWJvdXQgYSB0b3BpYywgYWxvbmcgd2l0aCBzb21lIHJlc2VhcmNoIHF1ZXN0aW9ucyB0aGF0LCB3aGVuIGFkZHJlc3NlZCwgY291bGQgZnVydGhlciB5b3VyIHVuZGVyc3RhbmRpbmcgb24gdGhlIHRvcGljLiBJbiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGFzc2lnbm1lbnQsIHlvdSB3aWxsIGJlZ2luIHNlYXJjaGluZyBmb3IgZGF0YSB0aGF0IGNvdWxkIGhlbHAgYWRkcmVzcyBzb21lIG9mIHRoZSBlbXBpcmljYWwgcmVzZWFyY2ggcXVlc3Rpb25zIHRoYXQgeW91IGRldmlzZS4gVGhyb3VnaG91dCB0aGlzIGRvY3VtZW50LCB5b3Ugd2lsbCBiZSBleHBlY3RlZCB0byBmaWxsIHJlc3BvbnNlcyB0byBwcm9tcHRzIGludG8gY29kZSBjaHVua3MgdGhhdCBoYXZlIGJlZW4gc2V0IHRvIG5vdCBldmFsdWF0ZSB3aGVuIHJ1bi4gWW91IHdpbGwgYWxzbyBiZSBleHBlY3RlZCB0byBmaWxsIGluIGEgc2VyaWVzIG9mIHRhYmxlcy4gQmUgc3VyZSB0byByZWZlcmVuY2UgbGFiIDEgaWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGdvIGFib3V0IGZpbGxpbmcgaW4gdGhlc2Ugc2VjdGlvbnMuCgojIyBUb3BpYyBTZWxlY3Rpb24KCkkgaGF2ZSB0YXVnaHQgdGhpcyBkYXRhIGV0aG5vZ3JhcGh5IGFuZCBhbmFseXNpcyBwcm9qZWN0IGluIGEgVUMgRGF2aXMgY291cnNlIGNhbGxlZCAqRGF0YSBTZW5zZSBhbmQgRXhwbG9yYXRpb24qIHR3aWNlIG5vdywgYW5kIGVhY2ggdGltZSwgdG8gaGVscCBzdHVkZW50cyBzY29wZSByZXNlYXJjaCB0b3BpY3MsIEkgaGF2ZSBwcm9wb3NlZCBhIHRoZW1lLiBJbiBTcHJpbmcgMjAxOSwgdGhlIHRoZW1lIHdhcyAic29jaWFsIGFuZCBlbnZpcm9ubWVudGFsIGNoYWxsZW5nZXMgZmFjaW5nIENhbGlmb3JuaWEuIiBJbiBTcHJpbmcgMjAyMCwgdGhlIHRoZW1lIHdhcyAiVVMgc29jaWFsIHZ1bG5lcmFiaWxpdHkgaW4gdGhlIHdha2Ugb2YgYSBwYW5kZW1pYy4iIEluIHRoZXNlIGNvdXJzZXMgc3R1ZGVudHMgaGF2ZSBzZWxlY3RlZCB0b3BpY3Mgc3VjaCBhczoKCiogdGhlIGV4dGVudCBvZiBzdHVkZW50IGRlYnQgcG9zdC1ncmFkdWF0aW9uCiogc29jaWFsIHN1cHBvcnQgZm9yIGhvbWVsZXNzbmVzcyBpbiBtYWpvciBjaXRpZXMKKiBjaGFuZ2VzIGluIGF2aWFuIG1pZ3JhdG9yeSBwYXR0ZXJucwoqIHRoZSBpbXBhY3Qgb2YgaW5kdXN0cmlhbCBHSEcgZW1pc3Npb25zIG9uIG1hcmdpbmFsaXplZCBjb21tdW5pdGllcwoqIEZFTUEgcmVzcG9uc2UgdG8gd2lsZGZpcmUgZGFtYWdlCiogZGlmZmVyZW5jZXMgaW4gZWxpZ2liaWxpdHkgZm9yIHN1cHBsZW1lbnRhbCBudXRyaXRpb24gcHJvZ3JhbXMgYWNyb3NzIHRoZSBVUwoqIGNoYW5nZXMgZG9tZXN0aWMgdmlvbGVuY2UgcHJldmFsZW5jZSBvdmVyIHRpbWUKKiBhY2Nlc3MgdG8gYnJvYWRiYW5kIGFuZCBJbnRlcm5ldCBpbmZyYXN0cnVjdHVyZSBpbiBOWUMKClRoZSBub3RlYm9va3MgaW4gdGhpcyBMYWIgQm9vayBhcmUgZGVzaWduZWQgdG8gc3VwcG9ydCBkYXRhIHJlc2VhcmNoIG9uIGp1c3QgYWJvdXQgYW55IHRvcGljLiBXaXRoIHRoaXMgaW4gbWluZCwgaWYgeW91IGFyZSBub3QgYWxyZWFkeSBjb21pbmcgdG8gdGhpcyBMYWIgQm9vayB3aXRoIGEgcGFydGljdWxhciB0b3BpYyBpbiBtaW5kLCBhcyB5b3UgZ28gYWJvdXQgc2VsZWN0aW5nIGEgdG9waWMsIHlvdSBtYXkgY29uc2lkZXIgd2hhdCBpc3N1ZXMgbW9zdCBtYXR0ZXIgdG8geW91LCB5b3VyIGZhbWlseSwgYW5kIHlvdXIgY29tbXVuaXR5IGluIHRoZSBjb250ZW1wb3JhcnkgbW9tZW50LiAKCiMjIyBXaGF0IHRvcGljIGFtIEkgaW52ZXN0aWdhdGluZz8gKGp1c3Qgb25lIHBocmFzZSBoZXJlIGlzIGZpbmUuKQoKYGBge3IgZXZhbD1GQUxTRX0KRmlsbCByZXNwb25zZSBoZXJlLiAKYGBgCgojIyMgV2h5IGlzIHRoaXMgdG9waWMgaW1wb3J0YW50IHRvIHN0dWR5IHJpZ2h0IG5vdz8KCmBgYHtyIGV2YWw9RkFMU0V9CkZpbGwgcmVzcG9uc2UgaGVyZS4gCmBgYAoKIyMgUHJvamVjdCBDb250ZXh0cwoKQXQgdGhpcyBwb2ludCwgd2UgYXJlIGdvaW5nIHRvIGJlZ2luIG1hcHBpbmcgb3V0IHNvbWUgb2YgdGhlIHByb2plY3QgY29udGV4dHMuIEJ5IHRoaXMgSSBtZWFuIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHB1dCB5b3VyIHRvcGljIGludG8gdGVtcG9yYWwsIGdlb2dyYXBoaWMsIGFuZCBzb2NpYWwtY3VsdHVyYWwgcGVyc3BlY3RpdmUuIEltYWdpbmUgdGhhdCB5b3VyIHRvcGljIGlzIHNvbWVob3cgZGVwaWN0ZWQgaW4gdGhlIGNlbnRlciBvZiBhIHBsYWluIHdoaXRlIHNoZWV0IG9mIHBhcGVyLiBXaGF0IGRldGFpbHMgd291bGQgd2UgbmVlZCB0byBmaWxsIGludG8gdGhlIGJhY2tncm91bmQgaW4gb3JkZXIgdG8gYnJpbmcgdGhpcyB0b3BpYyB0byBsaWZlPyBXZSB3b3VsZCBuZWVkIHRvIGFkZCBwZW9wbGUuIFdlIHdvdWxkIG5lZWQgdG8gYWRkIGVudmlyb25tZW50cy4gV2Ugd291bGQgbmVlZCB0byBjb21tdW5pY2F0ZSB0aGUgdGltZSBhbmQgcGxhY2UgaW4gd2hpY2ggdGhlIHRvcGljIHdhcyBiZWluZyBkZXBpY3RlZC4gVGhlIGVpZ2h0IHF1ZXN0aW9ucyBiZWxvdyBlbmNvdXJhZ2UgeW91IHRvIGRyYXcgb3V0IHRoZXNlIGNvbnRleHRzLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm90IG5lY2Vzc2FyaWx5IGEgd3Jvbmcgd2F5IHRvIGFuc3dlciB0aGVzZSBxdWVzdGlvbnMsIGFuZCB5b3UgYWJzb2x1dGVseSBkbyBub3QgbmVlZCB0byBhbnN3ZXIgdGhlbSBjb21wcmVoZW5zaXZlbHkuIElmIHdlIHRyaWVkIHRvIHJlc3BvbmQgdG8gdGhlbSAiZnVsbHksIiB3ZSdkIHByb2JhYmx5IGdvIG9uIHdyaXRpbmcgZm9yZXZlciEgSW5zdGVhZCBJJ2QgbGlrZSB5b3UgY3VyYXRlIGp1c3QgYSBmZXcgdGhpbmdzIHRoYXQgY29tZSB0byBtaW5kIHdoZW4geW91IGNvbnNpZGVyIHlvdXIgdG9waWMuIEhhdmluZyBzb21lIG9mIHRoZXNlIGNvbnRleHRzIHdyaXR0ZW4gb3V0IHdpbGwgaGVscCB5b3UgYXMgeW91IGFyZSBzZWFyY2hpbmcgZm9yIGRhdGEuIEZvciBlYWNoIHF1ZXN0aW9uIGJlbG93LCBwbGVhc2UgcmVzcG9uZCBpbiAxLTIrIGNvbXBsZXRlIHNlbnRlbmNlcy4gCgojIyMgV2hhdCBhcmUgc29tZSBrZXkgZXZlbnRzLCBkYXRlcywgb3IgeWVhcnMgcmVsZXZhbnQgdG8gdGhpcyB0b3BpYz8gVGhpcyBtaWdodCBiZSBhIGxvbmcgc3BhbiBvZiB0aW1lIG9yIGEgc3BlY2lmaWMgZXZlbnQuIAoKYGBge3IgZXZhbD1GQUxTRX0KRmlsbCByZXNwb25zZSBoZXJlLiAKYGBgCgojIyMgV2hhdCBhcmUgc29tZSBrZXkgc2l0ZXMsIGxvY2F0aW9ucywgb3IgZ2VvZ3JhcGhpZXMgcmVsZXZhbnQgdG8gdGhpcyB0b3BpYz8gVGhpcyBtaWdodCBiZSBhIGxhcmdlIGJvdW5kYXJ5IGxpa2UgYSBjb3VudHJ5IG9yIGEgc21hbGwgY29tbXVuaXR5LiAKCmBgYHtyIGV2YWw9RkFMU0V9CkZpbGwgcmVzcG9uc2UgaGVyZS4gCmBgYAoKIyMjIFdoYXQgc29jaWFsIGdyb3VwcyBhcmUgaW1wYWN0ZWQgYnkgdGhpcyB0b3BpYywgYW5kIGhvdz8KCmBgYHtyIGV2YWw9RkFMU0V9CkZpbGwgcmVzcG9uc2UgaGVyZS4gCmBgYAoKIyMjIEhvdyBpcyB0aGUgZW52aXJvbm1lbnQgaW1wbGljYXRlZCBpbiB0aGlzIHRvcGljPwoKYGBge3IgZXZhbD1GQUxTRX0KRmlsbCByZXNwb25zZSBoZXJlLiAKYGBgCgojIyMgSG93IGlzIHRoZSBlY29ub215IGltcGxpY2F0ZWQgaW4gdGhpcyB0b3BpYz8KCmBgYHtyIGV2YWw9RkFMU0V9CkZpbGwgcmVzcG9uc2UgaGVyZS4gCmBgYAoKIyMjIEhvdyBhcmUgcG9saXRpY3MgaW1wbGljYXRlZCBpbiB0aGlzIHRvcGljPwoKYGBge3IgZXZhbD1GQUxTRX0KRmlsbCByZXNwb25zZSBoZXJlLiAKYGBgCgojIyMgSG93IGFyZSB5b3UgaW1wbGljYXRlZCBpbiB0aGlzIHRvcGljPwoKYGBge3IgZXZhbD1GQUxTRX0KRmlsbCByZXNwb25zZSBoZXJlLiAKYGBgCgojIyMgV2hhdCBhcmUgc29tZSBvZiB0aGUgbW9zdCBjb21tb24gd2F5cyBkaWZmZXJlbnQgc29jaWFsIGdyb3VwcyB0YWxrIGFib3V0IHRoaXMgdG9waWM/CgpgYGB7ciBldmFsPUZBTFNFfQpGaWxsIHJlc3BvbnNlIGhlcmUuIApgYGAKCiMjIFJlc2VhcmNoIFF1ZXN0aW9ucwoKKkVtcGlyaWNhbCByZXNlYXJjaCBxdWVzdGlvbnMqIGFyZSBxdWVzdGlvbnMgdGhhdCBhbiBhbmFseXN0IGNhbiBhc3Nlc3MgZXZpZGVuY2UgdG8gYWRkcmVzcy4gRXhhbXBsZXMgb2Ygc29jaWFsLXRoZW9yZXRpY2FsIHF1ZXN0aW9ucyBpbmNsdWRlOgoKKiBEbyBVbml0ZWQgU3RhdGVzIGhvc3BpdGFscyBoYXZlIGVub3VnaCBiZWRzIHRvIGFjY29tbW9kYXRlIHRoZSBleHBlY3RlZCBpbmZsdXggaW4gQ292aWQtMTkgY2FzZXM/IEF0IHdoYXQgcG9pbnQgd2lsbCB0aGVyZSBub3QgYmUgZW5vdWdoIGJlZHMgYXZhaWxhYmxlPwoqIEluIHdoaWNoIFVTIHN0YXRlcyBhcmUgaG9zcGl0YWxzIGJldHRlciBlcXVpcHBlZCB3aXRoIGJlZHMgYW5kIHN0YWZmIHRvIHRha2Ugb24gYW4gaW5mbHV4IGluIHBhdGllbnRzIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgbmV4dCBtb250aD8KCkVtcGlyaWNhbCByZXNlYXJjaCBxdWVzdGlvbnMgYXJlIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciB0aW1lIGFuZCBwbGFjZS4gTm90aWNlIGhvdyBJIGRlbGltaXQgbXkgcXVlc3Rpb25zIHRvIHRoZSBVUyBhYm92ZSBhbmQgdGhlIHNlY29uZCBxdWVzdGlvbiB0byBhIHNwZWNpZmljIG1vbnRoLiBOb3cgdGhpbmsgYWJvdXQgeW91ciB0b3BpYy4gV2hhdCBxdWVzdGlvbnMgY291bGQgeW91IGFzayBhYm91dCB5b3VyIHRvcGljIHRoYXQgd291bGQgY29udHJpYnV0ZSB0byBhbiB1bmRlcnN0YW5kaW5nIG9mIHRoZSB0b3BpYydzIHByZXZhbGVuY2UsIGhvdyB0aGUgdG9waWMgaW1wYWN0cyBkaXZlcnNlIGNvbW11bml0aWVzLCBob3cgdGhlIHRvcGljIGhhcyBjaGFuZ2VkIG92ZXIgdGltZSwgb3IgaG93IGNvbW11bml0aWVzIGFyZSBlcXVpcHBlZCB0byByZXNwb25kIHRvIHRoZSB0b3BpYz8gQmUgc3VyZSB0aGF0IHlvdXIgcXVlc3Rpb24gaXMgb25lIHRoYXQgeW91IGNhbiBhc3Nlc3MgZXZpZGVuY2UgdG8gYWRkcmVzcywgYW5kIHRoYXQgaXQgaXMgc3BlY2lmaWMgdG8gYSBjZXJ0YWluIHRpbWUgYW5kIHBsYWNlLiBJZiB5b3VyIHRvcGljIGlzIG1lbnRhbCBoZWFsdGgsIHlvdSBtaWdodCBhc2s6CgoqIEluIDIwMjAsIGhvdyBtYW55IHBlb3BsZSBpbiB0aGUgVW5pdGVkIFN0YXRlcyBoYXZlIGluc3VyYW5jZSB0aGF0IGNvdmVycyB0aGVyYXB5IHZpc2l0cz8KCk5vdGUgaG93LCB3aXRoIHRoZSByaWdodCBkYXRhIEkgY291bGQgYW5zd2VyIHRoaXMgcXVlc3Rpb24gZGVmaW5pdGl2ZWx5LgoKIyMjIFdoYXQgZW1waXJpY2FsIHJlc2VhcmNoIHF1ZXN0aW9ucyBtaWdodCBJIGFkZHJlc3MgaW4gbXkgcmVzZWFyY2g/IExpc3QgYXQgbGVhc3QgdHdvLgoKYGBge3IgZXZhbD1GQUxTRX0KRmlsbCByZXNwb25zZSBoZXJlLiAKYGBgCgo+IEJld2FyZSBvZiBzZXR0aW5nIHVwIHlvdXIgcXVlc3Rpb24gYXMgYSBkaWNob3RvbXkhIERpZCB5b3UgdXNlIHRoZSB3b3JkICdvcicgaW4geW91ciBxdWVzdGlvbiBhYm92ZT8gSSd2ZSBzZWVuIG1hbnkgc3R1ZGVudHMgZG8gdGhpcyBpbiBwYXN0IGFzc2lnbm1lbnRzIC0gYXNraW5nIHF1ZXN0aW9ucyBsaWtlICJXYXMgdGhpcyBsZWdpc2xhdGlvbiBiZW5lZmljaWFsIHRvIGxvY2FsIGNvbW11bml0aWVzLCBvciB3YXMgaXQgaGFybWZ1bD8iIG9yICJEaWQgdGhpcyB0ZWNobm9sb2d5IGZpeCBpbmVxdWl0aWVzIGluIHRoZSBjb21tdW5pdHksIG9yIGRpZCBpdCBzdXN0YWluIHRoZW0/IiAgSW4gZWFjaCBvZiB0aGVzZSBxdWVzdGlvbnMsIHdlIGhhdmUgc3RydWN0dXJlZCBvdXIgcmVzZWFyY2ggdG8gdGVzdCB0d28gY29uZGl0aW9ucyBvbmx5LiBZZXQsIHdoZW4gaXQgY29tZXMgdG8gc3R1ZHlpbmcgY29tcGxleCBjb250ZW1wb3JhcnkgaXNzdWVzLCB0aGluZ3MgYXJlIG5ldmVyIGJsYWNrIGFuZCB3aGl0ZS4gSXQgaXMgaGlnaGx5IGxpa2VseSB0aGF0IHRoZSBzaXR1YXRpb24gd2UgYXJlIGV4YW1pbmluZyBpbiBvdXIgcmVzZWFyY2ggaXMgbXVjaCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhlc2UgdHdvIGNvbmRpdGlvbnMgY2FuIGNhcHR1cmUuIFdlIHNob3VsZCBhdm9pZCBzdHJ1Y3R1cmluZyBvdXIgcmVzZWFyY2ggcXVlc3Rpb25zIHRvIHRlc3QgbXV0dWFsbHkgZXhjbHVzaXZlIGNhdGVnb3JpZXMuICBJbiBwbGFjaW5nIGZhbHNlIGRpY2hvdG9taWVzIGluIG91ciByZXNlYXJjaCBxdWVzdGlvbnMsIHdlIHJ1biB0aGUgcmlzayBvZiBvdmVyc2ltcGxpZnlpbmcgY29tcGxleCBjYXVzYXRpb24sIGFuZCB3ZSBsaW1pdCB3aGF0IHRoZSByZXNlYXJjaCBjYW4gc2F5LiAgCgoqU29jaWFsLVRoZW9yZXRpY2FsIHF1ZXN0aW9ucyogYXJlIHF1ZXN0aW9ucyBhYm91dCBob3cgY2VydGFpbiBzb2NpYWwsIHBvbGl0aWNhbCwgb3IgZW52aXJvbm1lbnRhbCBwaGVub21lbmEgb3BlcmF0ZSBhdCBhIGJyb2FkIHNjYWxlLiBUaGV5IGFyZSBtdWNoIGJyb2FkZXIgdGhhbiBlbXBpcmljYWwgcmVzZWFyY2ggcXVlc3Rpb25zLiBXZSBvZnRlbiBjYW5ub3QgYW5zd2VyIHRoZXNlIHF1ZXN0aW9ucyB3aXRoIG9uZSByZXNlYXJjaCBwcm9qZWN0LiBIb3dldmVyLCB3ZSBvZnRlbiBhaW0gdG8gaW5jcmVhc2UgdW5kZXJzdGFuZGluZyBvZiB0aGVzZSBxdWVzdGlvbnMgdGhyb3VnaCBhIHJlc2VhcmNoIHByb2plY3QuIEV4YW1wbGVzIG9mIHNvY2lhbC10aGVvcmV0aWNhbCBxdWVzdGlvbnMgaW5jbHVkZToKCiogSG93IGhhcyB0aGUgVW5pdGVkIFN0YXRlcyBwcmlvcml0aXplZCBjcml0aWNhbCBoZWFsdGggaW5mcmFzdHJ1Y3R1cmU/CiogSG93IGRvIG5hdGlvbmFsIGhvc3BpdGFsIGJ1c2luZXNzIG1vZGVscyBpbXBsaWNhdGUgc29jaWFsIHZ1bG5lcmFiaWxpdHkgaW4gdGhlIHdha2Ugb2YgYSBwdWJsaWMgaGVhbHRoIGNyaXNpcz8KKiBIb3cgYXJlIGV4aXN0aW5nIHN0cnVjdHVyYWwgaW5lcXVhbGl0aWVzIGV4YWNlcmJhdGVkIGluIGEgcGFuZGVtaWM/CgpOb3RlIGhvdyBmb3IgZWFjaCBvZiB0aGVzZSBxdWVzdGlvbnMgSSB3b3VsZCBuZWVkIHRvIGV4YW1pbmUgbG90cyBvZiBkaWZmZXJlbnQgZGF0YSBhbmQgY2Fycnkgb3V0IGEgbnVtYmVyIG9mIGRpZmZlcmVudCBwcm9qZWN0cyB0byBhbnN3ZXIgdGhlbS4gCgpOb3cgdGhpbmsgYWJvdXQgeW91ciB0b3BpYy4gV2hhdCBicm9hZGVyIHF1ZXN0aW9ucyBhYm91dCBob3cgc29jaWFsLCBwb2xpdGljYWwsIG9yIGVudmlyb25tZW50YWwgcGhlbm9tZW5hIG9wZXJhdGUgbWlnaHQgeW91IHdpc2ggdG8gYWRkcmVzcyB0aHJvdWdoIHJlc2VhcmNoPwoKIyMjIFdoYXQgc29jaWFsLXRoZW9yZXRpY2FsIHF1ZXN0aW9ucyBtaWdodCBJIGFkZHJlc3MgaW4gbXkgcmVzZWFyY2g/IExpc3QgYXQgbGVhc3QgdHdvLiAKCmBgYHtyIGV2YWw9RkFMU0V9CkZpbGwgcmVzcG9uc2UgaGVyZS4gCmBgYAoKIyMjIFdoYXQgImlkZWFsIGRhdGFzZXRzIiB3b3VsZCBoZWxwIG1lIGFkZHJlc3MgbXkgZW1waXJpY2FsIHJlc2VhcmNoIHF1ZXN0aW9ucz8KCkZpbGwgaW4gdGhlIHRhYmxlIGJlbG93IHdpdGggYXQgbGVhc3QgNSBkYXRhc2V0cyB0aGF0IHdvdWxkIGhlbHAgeW91IGFkZHJlc3MgeW91ciBlbXBpcmljYWwgcmVzZWFyY2ggcXVlc3Rpb25zLiBCZSBzcGVjaWZpYywgZmlsbGluZyBvdXQgdGhlaXIgZ2VvZ3JhcGhpYyBzY29wZSBhbmQgdGhlIHRpbWVzcGFuIHRoZXkgd291bGQgY292ZXIuIEluIHRoZSBmaXJzdCBjb2x1bW4gY2hhcmFjdGVyaXplIHRoZSB0b3BpYyBvZiB0aGUgZGF0YXNldC4gSW4gdGhlIHNlY29uZCBhbmQgdGhpcmQgY29sdW1uLCBkZXNjcmliZSB0aGUgZ2VvZ3JhcGhpYyBhbmQgdGVtcG9yYWwgc2NvcGUuIEZpbmFsbHksIGluIHRoZSBsYXN0IGNvbHVtbiwgbWFyayB3aGV0aGVyIHlvdSBiZWxpZXZlIHN1Y2ggYSBkYXRhc2V0IGlzIGFjY2Vzc2libGUuCgpEYXRhc2V0IHwgR2VvZ3JhcGh5IHwgVGltZXNwYW4gfCBEbyB5b3UgdGhpbmsgdGhpcyBkYXRhIGlzIGFjY2Vzc2libGU/Ci0tLS0tLS0tIHwgLS0tLS0tLS0gfCAtLS0tLS0tLSB8IC0tLS0tLS0tCk51bWJlciBvZiBjb25maXJtZWQgY2FzZXMgb2YgQ292aWQtMTkgfCBBbGwgY291bnRyaWVzIGFjcm9zcyB0aGUgZ2xvYmUgfCBKYW51YXJ5IDIwMjAgdG8gcHJlc2VudCB8IFllcwpGaWxsIHwgRmlsbCB8IEZpbGwgfCBGaWxsCkZpbGwgfCBGaWxsIHwgRmlsbCB8IEZpbGwKRmlsbCB8IEZpbGwgfCBGaWxsIHwgRmlsbApGaWxsIHwgRmlsbCB8IEZpbGwgfCBGaWxsCkZpbGwgfCBGaWxsIHwgRmlsbCB8IEZpbGwKCi0tLQoKIyMgQmFja2dyb3VuZCBvbiBPcGVuIEdvdmVybm1lbnQgRGF0YQoKSW4gTWF5IDIwMDksIERhdGEuZ292IC0gYSB3ZWIgcG9ydGFsIGZvciBhY2Nlc3NpbmcgVVMgZ292ZXJubWVudCBkYXRhc2V0cyAtIHdhcyBsYXVuY2hlZCBieSB0aGVuIGZlZGVyYWwgQ2hpZWYgSW5mb3JtYXRpb24gT2ZmaWNlciBWaXZlayBLdW5kcmEuIEZvbGxvd2luZyB0aGlzLCBpbiBEZWNlbWJlciAyMDA5LCB0aGVuIFVTIFByZXNpZGVudCBCYXJhY2sgT2JhbWEgc2lnbmVkIHRoZSBPcGVuIEdvdmVybm1lbnQgRGF0YSBEaXJlY3RpdmUsIHJlcXVpcmluZyB0aGF0IGFsbCBmZWRlcmFsIGFnZW5jaWVzIHBvc3QgYXQgbGVhc3QgMyBoaWdoIHZhbHVlIGRhdGFzZXRzIG9uIGRhdGEuZ292IHdpdGhpbiA0NSBkYXkuIEEgZmV3IHllYXJzIGxhdGVyIGluIE1heSAyMDEzLCBQcmVzLiBPYmFtYSBzaWduZWQgYW4gRXhlY3V0aXZlIE9yZGVyIHRvOiAiTSJha1tlXSBPcGVuIGFuZCBNYWNoaW5lIFJlYWRhYmxlIHRoZSBOZXcgRGVmYXVsdCBmb3IgR292ZXJubWVudCBJbmZvcm1hdGlvbi4iIAoKPGlmcmFtZSB3aWR0aD0iNTYwIiBoZWlnaHQ9IjMxNSIgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9uNjAzckVuRUdYQSIgZnJhbWVib3JkZXI9IjAiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4KClRoZSBPcmRlciByZXF1aXJlZCB0aGF0IHRoZSBVUyBPZmZpY2Ugb2YgTWFuYWdlbWVudCBhbmQgQnVkZ2V0aW5nLCBpbiBjb2xsYWJvcmF0aW9uIHdpdGggdGhlIENJTyBhbmQgQ1RPLCBwdXQgb3V0IGFuZCBvdmVyc2VlIGFuIE9wZW4gRGF0YSBQb2xpY3kuIFRoaXMgcG9saWN5IHJlcXVpcmVkIHRoZSBmb2xsb3dpbmc6CgoqIERhdGEgbmVlZHMgdG8gYmUgcHVibGlzaGVkIGluIG1hY2hpbmUtcmVhZGFibGUgZm9ybWF0cwoqIERhdGEgbmVlZHMgdG8gYmUgbGljZW5zZWQgb3Blbmx5CiogRGF0YSBuZWVkcyB0byBiZSBkZXNjcmliZWQgd2l0aCBtZXRhZGF0YQoKU2VlIFtoZXJlXShodHRwczovL3d3dy53aGl0ZWhvdXNlLmdvdi9zaXRlcy93aGl0ZWhvdXNlLmdvdi9maWxlcy9vbWIvbWVtb3JhbmRhLzIwMTMvbS0xMy0xMy5wZGYgKSBmb3IgbW9yZSBkZXRhaWxzLiAKCk5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSByZXF1aXJlbWVudHMgZm9yIGRhdGEgcHJvZHVjZWQgdGhyb3VnaCB0aGUgZmVkZXJhbCBnb3Zlcm5tZW50LiBDaXRpZXMsIHN0YXRlcywgYW5kIGNvdW50aWVzIGhhdmUgdGhlaXIgb3duIG9wZW4gZGF0YSBwcm9ncmFtcywgcG9saWNpZXMsIGFuZCBsYXdzLCB3aGljaCBhcmUgc29tZXRpbWVzIG1vcmUgYW5kIHNvbWV0aW1lcyBsZXNzIHN0cmluZ2VudCB0aGFuIHRoZSBmZWRlcmFsIHBvbGljeS4gSG93ZXZlciwgbW9zdCBvcGVuIGRhdGEgcG9saWNpZXMsIGluIHNvbWUgd2F5LCBkZWFsIHdpdGggdGhlIHRocmVlIGlzc3VlcyBsaXN0ZWQgYWJvdmUgLSBtYWNoaW5lLXJlYWRhYmlsaXR5LCBsaWNlbnNpbmcsIGFuZCBtZXRhZGF0YS4KCkxldCdzIHRhbGsgYWJvdXQgd2hhdCBlYWNoIG9mIHRoZXNlIGlzc3VlcyBlbnRhaWw6CgojIyMgTWFjaGluZS1yZWFkYWJsZQoKTGFzdCBxdWFydGVyLCBpbiBteSBIYWNrIGZvciBDYWxpZm9ybmlhIHJlc2VhcmNoIGNsdXN0ZXIsIG9uZSBwcm9qZWN0IHdhcyBleGFtaW5pbmcgZ2VudHJpZmljYXRpb24gb3ZlciB0aGUgcGFzdCB0ZW4geWVhcnMgYXJvdW5kIGFuZCBuZWFyIHRoZSBVQyBEYXZpcyBNZWRpY2FsIENlbnRlciBpbiBTYWNyYW1lbnRvLiBPbmUgb2YgdGhlIGluZGljYXRvcnMgd2Ugd2VyZSBleGFtaW5pbmcgaW4gcmVsYXRpb24gdG8gZ2VudHJpZmljYXRpb24gd2FzIHRoZSBudW1iZXIgb2YgY29uc3RydWN0aW9uIHBlcm1pdHMgdGhlIGNpdHkgaGFkIGF3YXJkZWQgaW4gdGhhdCBhcmVhIGZvciBkZW1vbGl0aW9ucywgbmV3IGJ1aWxkaW5ncywgYW5kIHJlbW9kZWxpbmcuIFRoZSBDaXR5IG9mIFNhY3JhbWVudG8gaGFzIGNvbnN0cnVjdGlvbiBwZXJtaXQgZGF0YSBmcm9tIDIwMTIgdG8gcHJlc2VudCBzdG9yZWQgaW4gRXhjZWwgZmlsZXMgb24gW3RoZWlyIHdlYnNpdGVdKGh0dHBzOi8vd3d3LmNpdHlvZnNhY3JhbWVudG8ub3JnL0NvbW11bml0eS1EZXZlbG9wbWVudC9SZXNvdXJjZXMvUmVwb3J0cy9QZXJtaXQtRGF0YS1SZXBvcnRzL0lzc3VlZC1QZXJtaXQtUmVwb3J0cykgLSBvbmUgZmlsZSBvZiBwZXJtaXRzIHBlciBtb250aC4gT25lIG9mIHRoZSBzdHVkZW50cyBpbiB0aGUgcmVzZWFyY2ggY2x1c3RlciAoYW5kIGluIGZhY3Qgb25lIG9mIHlvdXIgc3RlbGxhciBjbGFzc21hdGVzKSB3YXMgYWJsZSB0byB3cml0ZSBhIHNjcmlwdCB0byBkb3dubG9hZCBlYWNoIG9mIHRoZXNlIGZpbGVzIGFuZCBiaW5kIHRoZW0gaW50byBvbmUgbGFyZ2UgZmlsZS4gSG93ZXZlciwgd2Ugd2VyZSBleGFtaW5pbmcgZ2VudHJpZmljYXRpb24gb3ZlciBhIG11Y2ggbG9uZ2VyIHBlcmlvZCBvZiB0aW1lIGFuZCBuZWVkZWQgY29uc3RydWN0aW9uIHBlcm1pdHMgZGF0aW5nIGJhY2sgdG8gMTk5MC4gV2Uga25ldyB0aGF0IHRoZSBDaXR5IGhhZCB0aGlzIGRhdGEgYmVjYXVzZSB0aGV5IGhhZCBwcm9kdWNlZCBhIFtwdWJsaWMgbWFwXShodHRwczovL3NhY3JhbWVudG8uY2l2aWNpbnNpZ2h0LmNvbS8pLCB3aGVyZSB5b3UgY291bGQgc2VhcmNoIGZvciBhbiBhZGRyZXNzIGluIFNhY3JhbWVudG8gYW5kIHJldHJpZXZlIGV2ZXJ5IGNvbnN0cnVjdGlvbiBwZXJtaXQgaXQgaGFkIGJlZW4gYXdhcmRlZCBzaW5jZSB0aGUgZWFybHkgMTk4MHMuIFdlIG5lZWRlZCBhIGRhdGEgZmlsZSB0aGF0IGxpc3RlZCB0aGlzIGZvciBldmVyeSBhZGRyZXNzIGluIHRoZSBjaXR5LiBXaXRoIHRoaXMgaW4gbWluZCwgSSBzdWJtaXR0ZWQgYSBbcHVibGljIHJlY29yZHMgcmVxdWVzdF0oaHR0cHM6Ly9zYWNyYW1lbnRvY2EubXljdXN0aGVscC5jb20vV0VCQVBQL19ycy8oUyhndHBpdGRkbDR3YWNtZ2lkdzU1bG00YnopKS9TdXBwb3J0SG9tZS5hc3B4KSBhc2tpbmcgZm9yIHRoZSBmb2xsb3dpbmc6ICJJJ20gbG9va2luZyBmb3IgYSBkYXRhIGZpbGUgb2YgYWxsIGNvbnN0cnVjdGlvbiBwZXJtaXRzIGlzc3VlZCBhY3Jvc3MgU2FjcmFtZW50byBmcm9tIDE5OTAgdG8gcHJlc2VudCBpbiBhIGRvd25sb2FkYWJsZSwgbWFjaGluZS1yZWFkYWJsZSBmb3JtYXQuIgoKVHdvIHdlZWtzIGxhdGVyIHRoZXkgc2VudCBtZSBiYWNrIGEgOSw1NDMtcGFnZSBQREYgZG9jdW1lbnQgbGlzdGluZyBldmVyeSBjb25zdHJ1Y3Rpb24gcGVybWl0IGF3YXJkZWQgaW4gdGhlIGNpdHkgc2luY2UgMTk5MC4gSSB0b29rIGEgZGVlcCBicmVhdGguIEhhZCB0aGV5IHNlbnQgdGhpcyBpbiBhIENTViBmaWxlLCB3ZSBjb3VsZCBoYXZlIGdvdHRlbiB0byB3b3JrIGltbWVkaWF0ZWx5LiBJdCB3b3VsZCB0YWtlIGhvdXJzIHRvIGdldCB0aGlzIGhlZnR5IGRvY3VtZW50IGludG8gYSBmb3JtYXQgd2UgY291bGQgd29yayB3aXRoLiBJIHJlYWxseSBoYXRlIFBERnMuCgpNYWNoaW5lLXJlYWRhYmxlIGRhdGEgYXJlIGRhdGEgdGhhdCBjYW4gYmUgcmVhZGlseSBwcm9jZXNzZWQgYnkgYSBjb21wdXRlci4gVHlwaWNhbGx5IG1hY2hpbmUtcmVhZGFibGUgZGF0YSBhcmUgc3RydWN0dXJlZCBpbiB3YXlzIHRoYXQgbWFueSBkaWZmZXJlbnQgY29tcHV0ZXIgYXBwbGljYXRpb25zIGNhbiByZWNvZ25pemUuIEFzIG15IHN0b3J5IGFib3ZlIGluZGljYXRlcywgdGhlcmUgYXJlIGRpZmZlcmVudCBkZWdyZWVzIG9mIG1hY2hpbmUtcmVhZGFiaWxpdHkgb2YgZGlnaXRhbCBkYXRhOgoKKiBEYXRhIHN0b3JlZCBpbiB0YWJsZXMgaW4gKipQREZzIChmaWxlcyB3aXRoIGV4dGVuc2lvbiAucGRmKSoqIGFyZSBwZXJoYXBzIHNvbWUgb2YgdGhlIGxlYXN0IG1hY2hpbmUtcmVhZGFibGUgZGF0YSB0aGF0IHdlIHdpbGwgZW5jb3VudGVyIGluIG91ciBkYXRhIHJlc2VhcmNoLiBUaGlzIGlzIGJlY2F1c2UgZGF0YSBpbiB0YWJsZXMgaW4gUERGcyBhcmUgbm90IHN0cnVjdHVyZWQgaW4gc3VjaCBhIHdheSB0aGF0IGNvbXB1dGVyIHNvZnR3YXJlIGNhbiBlYXNpbHkgcmVmZXJlbmNlIGFuZCBvcGVyYXRlIG9uIHNwZWNpZmljIHZhbHVlcy4gCiogRGF0YSBzdG9yZWQgaW4gKipFeGNlbCAoZmlsZXMgd2l0aCBleHRlbnNpb24gLnhscykqKiBmaWxlcyBhcmUgYSBiaXQgbW9yZSBtYWNoaW5lLXJlYWRhYmxlLiBXZSBjYW4gaW1wb3J0IGRhdGEgc3RvcmVkIGludG8gYW4gRXhjZWwgZmlsZSBpbnRvIEV4Y2VsLCBhbmQgdGhlIHNvZnR3YXJlIHdpbGwgcmVjb2duaXplIGhvdyB0aGUgZGF0YSBhcmUgc3RydWN0dXJlZCwgYWdncmVnYXRlIHZhbHVlcyBpbnRvIHNlcGFyYXRlIGNlbGxzLCBhbmQgdGh1cyBwcmVzZW50IGl0IHRvIHVzIGluIGEgd2F5IHRoYXQgd2UgY2FuIG9wZXJhdGUgb24gaXQuIEhvd2V2ZXIsIHRvIG9wZW4gRXhjZWwsIHdlIG5lZWQgYWNjZXNzIHRvIE1pY3Jvc29mdCBwcm9kdWN0cywgd2hpY2ggd2UgaGF2ZSB0byBwYXkgZm9yLiBUaGlzIG1lYW5zIHRoYXQgdGhlIEV4Y2VsIGZpbGUgaXMgbm90IHN0b3JlZCBpbiBhbiBvcGVuIGZvcm1hdC4KKiBEYXRhIHN0b3JlZCBpbiAqKkNvbW1hIFNlcGFyYXRlZCBWYWx1ZSAoZmlsZXMgd2l0aCBleHRlbnNpb24gLmNzdikqKiBmaWxlcyBhcmUgbW9yZSBtYWNoaW5lLXJlYWRhYmxlIHRoYW4gZGF0YSBzdG9yZWQgaW4gRXhjZWwgZmlsZXMuIFRoaXMgaXMgYmVjYXVzZSBkYXRhIGluIENTViBmaWxlcyBhcmUgc3RydWN0dXJlZCBpbiBhbiBvcGVuIGZvcm1hdCAtIG9yIGEgZm9ybWF0IHRoYXQgaXMgbm90IGRlcGVuZGVudCBvbiBwcm9wcmlldGFyeSBzb2Z0d2FyZS4gQSBDU1YgZmlsZSBpcyBhIHRleHQgZmlsZSBzdHJ1Y3R1cmVkIHNvIHRoYXQgZWFjaCBsaW5lIGluIHRoZSBmaWxlIGRlc2lnbmF0ZXMgYSByZWNvcmQgYW5kIHZhcmlvdXMgZmllbGRzIGZvciBkZXNjcmliaW5nIHRoYXQgcmVjb3JkIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLiBJZiB3ZSB3ZXJlIHRvIG9wZW4gYSBDU1YgZmlsZSBpbiBhIGJhc2ljIHRleHQgZWRpdG9yLCBpdCB3b3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CgpOYW1lLCBBZ2UsIEJpcnRoIE1vbnRoLCBUaW1lIG9uIFBob25lCgpTYWxseSwgMjMsIDMsIDQyCgpKdWxpZSwgNDAsIDIsIDk4CgpNYXJrLCAxNCwgOCwgMTIwCgpIb3dldmVyLCBpZiB3ZSB3ZXJlIHRvIG9wZW4gdGhlIHNhbWUgZmlsZSBpbiBFeGNlbCwgZWFjaCB2YWx1ZSB3b3VsZCBiZSBzZXBhcmF0ZWQgaW50byBpdHMgb3duIGNlbGwuIEEgQ1NWIGZpbGUgaXMgc29mdHdhcmUgaW5kZXBlbmRlbnQuIEFzIGEgc3RhbmRhcmRpemVkIHdheSBvZiBkaXNwbGF5aW5nIGRhdGEsIGp1c3QgYWJvdXQgYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9uIHRoYXQgZGlzcGxheXMgZGF0YSBpcyBwcmVwYXJlZCB0byByZWFkIGEgQ1NWIGZpbGUgYW5kIGZvcm1hdCBpdCBmb3IgZGlzcGxheS4gCgpXaGlsZSB3ZSB3b24ndCB3b3JrIHdpdGggc3VjaCBmb3JtYXRzIGluIHRoaXMgY291cnNlLCBkYXRhIGNhbiBiZSBtYWRlIGV2ZW4gbW9yZSBtYWNoaW5lLXJlYWRhYmxlIHRoYW4gYSBDU1YgZmlsZS4gRm9ybWF0cyBsaWtlIFhNTCBhbmQgUkRGIGFsbG93IHVzIHRvIHN0cnVjdHVyZSBkYXRhIHdpdGggbXVjaCBtb3JlIHNwZWNpZmljaXR5LiBUaGV5IGFyZSBvZnRlbiBjb25zaWRlcmVkIHRoZSBnb2xkIHN0YW5kYXJkcyBvZiBtYWNoaW5lLXJlYWRhYmlsaXR5LiBTaXIgVGltIEJlcm5lcnMtTGVlLCB0aGUgaW52ZW50b3Igb2YgdGhlIFdvcmxkIFdpZGUgV2ViLCBvZnRlbiB1c2VzIHRoaXMgZGlhZ3JhbSB0byBvdXRsaW5lIHRoZSBkZWdyZWVzIG9mIG1hY2hpbmUtcmVhZGFiaWxpdHkgb2Ygb3BlbiBkYXRhIChpZiB5b3Ugd2FudCB0byByZWFsbHkgZ2V0IG1lIGdvaW5nLCBhc2sgbWUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgSW50ZXJuZXQgYW5kIHRoZSBXZWIhKToKCiFbNS1zdGFyIG9wZW4gZGF0YV0oaW1hZ2VzLzUtc3Rhcl9kZXBsb3ltZW50X3NjaGVtZV9mb3JfT3Blbl9EYXRhLnBuZykKCkluIHRoZSBhYm92ZSBjaGFydCwgdGhlIGFjcm9ueW1zIGFyZSBzaG9ydCBmb3IgdGhlIGZvbGxvd2luZzoKCiogT0w6IEF2YWlsYWJsZSAqb25saW5lKgoqIFJFOiBNYWNoaW5lLSpyZWFkYWJsZSoKKiBPRjogKk9wZW4gZm9ybWF0KgoqIFVSSTogRWFjaCBvYnNlcnZhdGlvbiBoYXMgYSAqdW5pcXVlIHJlc291cmNlIGlkZW50aWZpZXIqIHNvIHRoYXQgd2UgbWF5IHJlZmVyIHRvIGl0IHBlcnNpc3RlbnRseQoqIExEOiBEYXRhIGlzICpsaW5rZWQqIHRvIG90aGVyIGRhdGFzZXRzCgojIyMgTGljZW5zZWQgT3Blbmx5CgpKdXN0IGJlY2F1c2Ugc29tZXRoaW5nIGlzIGF2YWlsYWJsZSBvbiB0aGUgV2ViIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB3ZSBhcmUgZnJlZSB0byBkb3dubG9hZCBhbmQgdXNlIGl0IGFzIHdlIHBsZWFzZS4gSGlzdG9yaWNhbGx5LCBkaWZmZXJlbnQgZ292ZXJubWVudCBhZ2VuY2llcyB3b3VsZCBhbGxvdyBhY2Nlc3MgdG8gY2VydGFpbiBkYXRhc2V0cyBmb3IgYSBmZWUgdGhhdCB3b3VsZCBoZWxwIHRvIGNvdmVyIHRoZSBjb3N0cyBvZiBydW5uaW5nIHB1YmxpYyBkYXRhIHByb2dyYW1zLiAoT2Z0ZW50aW1lcywgd2UgaGVhciB0aGlzIHJlZmVycmVkIHRvIGFzIGRhdGEgYmVpbmcgYmVoaW5kIGEgInBheXdhbGwuIikgV2l0aCB0aGUgVVMgT3BlbiBHb3Zlcm5tZW50IERpcmVjdGl2ZSwgYWxsIGRhdGEgKnByb2R1Y2VkKiBieSBhbnkgZmVkZXJhbCBVUyBhZ2VuY3kgd291bGQgZGVmYXVsdCB0byB0aGUgcHVibGljIGRvbWFpbi4gV2hlbiBkYXRhIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCB0aGV5IGFyZSBvd25lZCBieSB0aGUgdGhlIHB1YmxpYy4gVGhlIGRhdGEgYXJlIG5vdCBzdWJqZWN0IHRvIGFueSBjb3B5cmlnaHQgb3IgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhdyBhbmQgY2FuIGJlIGFjY2Vzc2VkLCBtb2RpZmllZCwgcmVwcm9kdWNlZCwgYW5kIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9ucy4gCgpEYXRhICphY3F1aXJlZCogYnkgYW55IGZlZGVyYWwgVVMgYWdlbmN5IG5lZWRlZCB0byBiZSBnaXZlbiBhbiBvcGVuIGRhdGEgbGljZW5zZSB0aGF0IG1ldCB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgoKMS4gVGhlIGxpY2Vuc2UgYWxsb3dlZCBmb3IgZGF0YSByZXVzZSBhbmQgbW9kaWZpY2F0aW9ucy4KMi4gVGhlIGxpY2Vuc2UgY291bGQgbm90IHJlc3RyaWN0IGFueSBmb3JtIG9mIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBkYXRhLgozLiBUaGUgbGljZW5zZSBjb3VsZCBub3QgZGlzY3JpbWluYXRlIGFueSBwZXJzb24gb3IgZ3JvdXAgZnJvbSB0aGVzZSByaWdodHMuIAoKVGhlcmUgYXJlIGEgZmV3IGdsb2JhbCBsaWNlbnNlcyB0aGF0IGdvdmVybm1lbnQgYWdlbmNpZXMgY2FuIGFwcGx5IHRvIGRhdGEgdGhhdCBtZWV0IHRoaXMgY3JpdGVyaWEuIE9uZSBzdWNoIGxpY2Vuc2UgaXMgdGhlIENyZWF0aXZlIENvbW1vbnMgVW5pdmVyc2FsIFB1YmxpYyBEb21haW4gTGljZW5zZSAoQ0MwIDEuMCkuIAoKQ3JlYXRpdmUgQ29tbW9ucyBpcyBhIG5vbi1wcm9maXQgb3JnYW5pemF0aW9uIHRoYXQgYWltcyB0byBpbmNyZWFzZSB0aGUgYXZhaWxhYmlsaXR5IG9mIGNyZWF0aXZlIHdvcmtzIHRoYXQgdGhlIHB1YmxpYyBjYW4gcmVtaXggYW5kIHNoYXJlLiBDcmVhdGl2ZSBDb21tb25zIGhhcyBjcmVhdGVkIGEgbnVtYmVyIG9mIGZyZWUgbGljZW5zZXMgdGhhdCB0aGUgcHVibGljIGNhbiBhcHBseSB0byB0aGVpciBvd24gY3JlYXRpdmUgd29ya3MgaW4gb3JkZXIgdG8gZGVzaWduYXRlIHRoZSBleHRlbnQgdG8gd2hpY2ggb3RoZXJzIGNhbiBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGVtLiBUaGVzZSBsaWNlbnNlcyBpbmRpY2F0ZSB3aGV0aGVyIGluZGl2aWR1YWxzIG90aGVyIHRoYW4gdGhlIGNvbnRlbnQgY3JlYXRvciBtYXkgc2hhcmUgdGhlIHdvcmssIHJlbWl4IHRoZSB3b3JrLCBhbmQvb3IgbWFrZSBtb25leSBvZmYgb2YgdGhlIHdvcmssIGFsb25nIHdpdGggd2hldGhlciBzdWNoIGluZGl2aWR1YWxzIGhhdmUgdG8gYXR0cmlidXRlIHRoZSBjb250ZW50IGNyZWF0b3Igd2hlbiBzaGFyaW5nIGl0LiBUaGUgZm9sbG93aW5nIGltYWdlIG91dGxpbmVzIGEgbnVtYmVyIG9mIENyZWF0aXZlIENvbW1vbnMgbGljZW5zZXMgZnJvbSBtb3N0IG9wZW4gdG8gbGVhc3Qgb3Blbi4gWW91J2xsIG5vdGljZSB0aGF0IENDMCAxLjAgLSB0aGUgbGljZW5zZSBjb21wYXRpYmxlIHdpdGggZWFjaCBvZiB0aGUgY3JpdGVyaWEgbGlzdGVkIGFib3ZlIGlzIGF0IHRoZSB0b3Agb2YgdGhlIGltYWdlLiAKCiFbQ0MgTGljZW5zZXNdKGltYWdlcy9DcmVhdGl2ZV9jb21tb25zX2xpY2Vuc2Vfc3BlY3RydW0uc3ZnLnBuZykKCj4gSW4gdGhlIGltYWdlIGFib3ZlLCBCWSBtZWFucyB0aGF0IHRoZSBsaWNlbnNlIHJlcXVpcmVzIHRoYXQgdGhlIGNvbnRlbnQgY3JlYXRvciBiZSBhdHRyaWJ1dGVkIHdoZW5ldmVyIHRoZSBjcmVhdGl2ZSB3b3JrIGlzIHNoYXJlZC4gU0EgbWVhbnMgdGhhdCB0aGUgbGljZW5zZSByZXF1aXJlcyB0aGF0IGFueSBkZXJpdmF0aXZlcyBvZiB0aGUgb3JpZ2luYWwgd29yayBiZSBnaXZlbiB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBvcmlnaW5hbCB3b3JrLiBOQyBtZWFucyB0aGF0IHRoZSBsaWNlbnNlIHJlc3RyaWN0cyB0aGUgd29yayBmcm9tIGJlaW5nIHVzZWQgZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMuIE5EIG1lYW5zIHRoYXQgdGhlIGxpY2Vuc2UgcmVzdHJpY3RzIG90aGVyIGluZGl2aWR1YWxzIGZyb20gbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCB3b3JrLiAKClNlZSBbdGhpc10oaHR0cHM6Ly9kYXRhLmhhcnRmb3JkLmdvdi9QdWJsaWMtU2FmZXR5L1Rvd2VkLUNhcnMtZm9yLXRoZS1QYXN0LTMwLURheXMvaGVmYy13Z3A4KSBkYXRhc2V0IG9mIFRvd2VkIENhcnMgZm9yIHRoZSBQYXN0IFRoaXJ0eSBEYXlzIGluIEhhcnRmb3JkLCBDVCwgd2hpY2ggaGFzIGJlZW4gbGljZW5zZWQgd2l0aCB0aGUgQ0MwIDEuMC4gCgohW0hhcnRmb3JkIExpY2Vuc2VdKGltYWdlcy9DVF9saWNlbnNlLnBuZykKCkFub3RoZXIgb3BlbiBsaWNlbnNlIHRoYXQgbWVldHMgdGhlIGNyaXRlcmlhIGxpc3RlZCBhYm92ZSBpcyB0aGUgT3BlbiBEYXRhIENvbW1vbnMgUHVibGljIERvbWFpbiBhbmQgRGVkaWNhdGlvbiBMaWNlbnNlIChQRERMKS4gWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgdGhlIHNwZWNpZmljcyBvZiB0aGlzIGxpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbmRhdGFjb21tb25zLm9yZy9saWNlbnNlcy9wZGRsLzEuMC8pLiBTZWUgW3RoaXNdKGh0dHBzOi8vZGF0YS5ib3N0b24uZ292L2RhdGFzZXQvY2l0eS1oYWxsLWVsZWN0cmljaXR5LXVzYWdlKSBkYXRhc2V0IG9mIENpdHkgSGFsbCBFbGVjdHJpY2l0eSBVc2FnZSBpbiBCb3N0b24sIHdoaWNoIGhhcyBiZWVuIGxpY2Vuc2VkIHdpdGggdGhlIFBEREw6CiFbQm9zdG9uIExpY2Vuc2VdKGltYWdlcy9Cb3N0b25fbGljZW5zZS5wbmcpCgpEaWZmZXJlbnQgY2l0aWVzIGFuZCBzdGF0ZXMgdGhyb3VnaG91dCB0aGUgVVMgd2lsbCBoYXZlIGRpZmZlcmVudCBsYXdzIGFib3V0IHRoZSBkZWdyZWUgdG8gd2hpY2ggZGF0YSBzaG91bGQgYmUgb3Blbmx5IGxpY2Vuc2VkLiBJbiBtb3N0IG9wZW4gZ292ZXJubWVudCBkYXRhIHBvcnRhbHMsIHlvdSB3aWxsIGJlIGFibGUgdG8gZGlzY2VybiBob3cgZGF0YSBsaWNlbnNlZCBpbiBpdHMgYWRtaW5pc3RyYXRpdmUgbWV0YWRhdGEgLSB0byB3aGljaCB3ZSB3aWxsIHR1cm4gbmV4dC4gCgojIyMgTWV0YWRhdGEKCk1ldGFkYXRhIGlzIGRhdGEgYWJvdXQgZGF0YS4gVGhlcmUgYXJlIHR3byBraW5kcyBvZiBtZXRhZGF0YToKCjEuIEFkbWluaXN0cmF0aXZlIG1ldGFkYXRhOiBkYXRhIGFib3V0IGhvdyBhIGRhdGFzZXQgaXMvc2hvdWxkIGJlIG1hbmFnZWQKMi4gRGVzY3JpcHRpdmUgbWV0YWRhdGE6IGRhdGEgYWJvdXQgd2hhdCBpcyBpbnNpZGUgYSBkYXRhc2V0CgpBZG1pbmlzdHJhdGl2ZSBtZXRhZGF0YSB3aWxsIGFuc3dlciBxdWVzdGlvbnMgc3VjaCBhczogCgoqIFdobyBjcmVhdGVkIHRoaXMgZGF0YT8KKiBXaGVuIGRpZCB0aGV5IGNyZWF0ZSBpdD8KKiBXaGVuIHdhcyBpdCBsYXN0IHVwZGF0ZWQ/CiogSG93IG9mdGVuIHdpbGwgaXQgYmUgdXBkYXRlZD8KKiBXaG8gcHVibGlzaGVkIGl0PwoqIFdobyBvd25zIHRoZSBkYXRhLCBhbmQgaG93IGlzIGl0IGxpY2Vuc2VkPwoKQ2hlY2sgb3V0IHRoZSBhZG1pbmlzdHJhdGl2ZSBtZXRhZGF0YSBhdmFpbGFibGUgZm9yIFt0aGlzXShodHRwczovL2RhdGEuYmFsdGltb3JlY2l0eS5nb3YvUHVibGljLVNhZmV0eS85MTEtUG9saWNlLUNhbGxzLWZvci1TZXJ2aWNlL3h2aXUtZXprdCkgb3BlbiBkYXRhc2V0IGRldGFpbGluZyBCYWx0aW1vcmUgOTExIFBvbGljZSBDYWxscyBmb3IgU2VydmljZS4gSGVyZSBpcyBhIHNjcmVlbnNob3Qgb2YgdGhlIGxpbmtlZCBwYWdlOgoKIVtBZG1pbmlzdHJhdGl2ZSBPcGVuIERhdGFdKGltYWdlcy9hZG1pbl9tZXRhZGF0YS5wbmcpClVuZGVyIHRoZSBBYm91dCB0aGlzIERhdGFzZXQgc2VjdGlvbiBvbiB0aGUgcGFnZSwgeW91J2xsIHNlZSBhIG51bWJlciBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgZGF0YSAtIGhvdyBmcmVxdWVudGx5IHRoZSBkYXRhIGlzIHVwZGF0ZWQsIHdobyBwdWJsaXNoZWQgdGhlIGRhdGEsIHdobyB0byBjb250YWN0IHJlZ2FyZGluZyB0aGUgZGF0YSwgd2hvIGhhcyByaWdodHMgdG8gdXNlIGFuZCBkaXN0cmlidXRlIHRoZSBkYXRhLCB3aGVuIHRoZSBkYXRhIHdhcyBjcmVhdGVkLCBhbmQgd2hlbiB0aGUgZGF0YSB3YXMgbGFzdCB1cGRhdGVkLiBBbGwgb2YgdGhpcyBtZXRhZGF0YSBwcm92aWRlcyB1cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGlzIGRhdGEgaXMgbWFuYWdlZDsgaW4gb3RoZXIgd29yZHMsIGl0IHByb3ZpZGVzIGFkbWluaXN0cmF0aXZlIG1ldGFkYXRhLiBXaHkgaXMgYWRtaW5pc3RyYXRpdmUgbWV0YWRhdGEgc28gaW1wb3J0YW50PyBIZXJlIGFyZSBqdXN0IGEgZmV3IHJlYXNvbnM6CgoqIElmIHdlIHJ1biBpbnRvIGVycm9ycyBpbiB0aGUgZGF0YSBvciBpZiB3ZSBoYXZlIHF1ZXN0aW9ucyByZWdhcmRpbmcgdGhlIGRhdGEsIHdlIG5lZWQgdG8ga25vdyB3aG8gdG8gY29udGFjdC4KKiBXZSBuZWVkIHRvIGtub3cgaG93IG9mdGVuIGl0IGlzIHVwZGF0ZWQgdG8gZ2V0IGEgc2Vuc2Ugb2YgaXRzIHRpbWVsaW5lc3MuIERhdGEgdGhhdCBpcyByYXJlbHkgdXBkYXRlZCBtYXkgYmUgbGVzcyByZWxldmFudCB0aGFuIHRoZXkgd2VyZSB3aGVuIGZpcnN0IHB1Ymxpc2hlZC4KKiBXZSBuZWVkIHRvIGtub3cgaG93IGl0IGlzIGxpY2Vuc2VkIHNvIHRoYXQgd2UgdW5kZXJzdGFuZCB3aGV0aGVyIHdlIGhhdmUgcGVybWlzc2lvbiB0byB1c2UgaXQsIHRvIGRpc3RyaWJ1dGUgaXQsIG9yIHRvIHB1Ymxpc2ggaXQuCiogV2UgbmVlZCB0byBrbm93IHdobyBjcmVhdGVkIGl0IGluIG9yZGVyIHRvIHVuZGVyc3RhbmQgd2hhdCBwZXJzcGVjdGl2ZSB0aGUgZGF0YSByZXByZXNlbnRzLiAKKiBKdXN0IGxpa2Ugd2hlbiB3ZSBjaXRlIHF1b3RlcyBpbiBhIHBhcGVyLCB3ZSBuZWVkIHRvIGNpdGUgZGF0YSB3aGVuIHdlIHJlZmVyZW5jZSBpdC4gQWxsIG9mIHRoaXMgaW5mb3JtYXRpb24gY29tbXVuaWNhdGVzIHRvIHVzIGhvdyB0byBjaXRlIHRoZSBkYXRhLiAKCkFzIGFuIGV4YW1wbGUgb2Ygd2h5IHRoaXMgaXMgaW1wb3J0YW50LCBjb25zaWRlciBbdGhpc10oaHR0cHM6Ly93d3cuZGVudmVyZ292Lm9yZy9vcGVuZGF0YS9kYXRhc2V0L2NpdHktYW5kLWNvdW50eS1vZi1kZW52ZXItdHJhZmZpYy1hY2NpZGVudHMpIGRhdGFzZXQgZG9jdW1lbnRpbmcgdHJhZmZpYyBhY2NpZGVudHMgaW4gRGVudmVyLiBUaGVyZSBpcyBhIGxvbmcgcHJlYW1ibGUgdG8gdGhlIGRhdGEsIGluZGljYXRpbmcgaW1wb3J0YW50IGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgZGF0YXNldCBnZXRzIHVwZGF0ZWQuIEV2ZXJ5IHRpbWUgYW4gYWNjaWRlbnQgb2NjdXJzIGl0IGlzIGVudGVyZWQgaW50byB0aGUgZGF0YXNldC4gSG93ZXZlciwgd2hlbiBmaXJzdCByZXBvcnRlZCwgdGhlIERlbnZlciBQb2xpY2UgRGVwYXJ0bWVudCBsaWtlbHkgZG9lcyBub3QgaGF2ZSBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NpZGVudC4gVGhhdCBpbmZvcm1hdGlvbiBiZWNvbWVzIGF2YWlsYWJsZSB0aHJvdWdoIGludmVzdGlnYXRpb25zLCBhbmQgYXMgaXQgYmVjb21lcyBhdmFpbGFibGUsIHRoZSBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGFjY2lkZW50IGluIHRoZSBkYXRhc2V0IGFyZSB1cGRhdGVkLiBUaGUgZm9sbG93aW5nIGRpc2NsYWltZXIgb24gdGhlIGRhdGEgcG9ydGFsIHByb3ZpZGVzIGltcG9ydGFudCBhZG1pbmlzdHJhdGl2ZSBtZXRhZGF0YToKCj4gIkluY2lkZW50cyB0aGF0IG9jY3VycmVkIGF0IGxlYXN0IDMwIGRheXMgYWdvIHRlbmQgdG8gYmUgdGhlIG1vc3QgYWNjdXJhdGUsIGFsdGhvdWdoIHJlY29yZHMgYXJlIHJldHVybmVkIGZvciBpbmNpZGVudHMgdGhhdCBoYXBwZW5lZCB5ZXN0ZXJkYXkuIEZvciBtb3RvciB2ZWhpY2xlIGNyYXNoZXMgdGhhdCBhcmUgc3RpbGwgdW5kZXIgaW52ZXN0aWdhdGlvbiBhbmQgaW52b2x2ZSBhIHNlcmlvdXMgYm9kaWx5IG9yIGZhdGFsIGluanVyeSwgc29tZSBhdHRyaWJ1dGVzIHdpbGwgYXBwZWFyIGFzLCAiVU5ERVIgSU5WRVNUSUdBVElPTi4iIFRoaXMgaXMgdG8gaGVscCBlbnN1cmUgdGhhdCBhbnkgY291cnQgcHJvY2VlZGluZ3MgcmVsYXRlZCB0byB0aGVzZSBpbmNpZGVudHMgYXJlIG5vdCBpbmFkdmVydGVudGx5IGhpbmRlcmVkLiBPbmNlIHRoZSBpbnZlc3RpZ2F0aW9uIGlzIGNsb3NlZCwgYWxsIG9mIHRoZSBpbmNpZGVudCdzIGF0dHJpYnV0ZXMgd2lsbCBiZSB2aXNpYmxlLiBUaGlzIGR5bmFtaWMgbmF0dXJlIG9mIG1vdG9yIHZlaGljbGUgY3Jhc2ggZGF0YSBtZWFucyB0aGF0IGNvbnRlbnQgcHJvdmlkZWQgaGVyZSB0b2RheSB3aWxsIHByb2JhYmx5IGRpZmZlciBmcm9tIGNvbnRlbnQgcHJvdmlkZWQgYSB3ZWVrIGZyb20gbm93LiBMaWtld2lzZSwgY29udGVudCBwcm92aWRlZCBvbiB0aGlzIHNpdGUgd2lsbCBwcm9iYWJseSBkaWZmZXIgc29tZXdoYXQgZnJvbSBjcmltZSBzdGF0aXN0aWNzIHB1Ymxpc2hlZCBlbHNld2hlcmUgYnkgdGhlIENpdHkgYW5kIENvdW50eSBvZiBEZW52ZXIsIGV2ZW4gdGhvdWdoIHRoZXkgZHJhdyBmcm9tIHRoZSBzYW1lIGRhdGFiYXNlLiIKCldoaWxlIGFkbWluaXN0cmF0aXZlIG1ldGFkYXRhIGNoYXJhY3Rlcml6ZXMgaG93IHRoZSBkYXRhIGlzIG1hbmFnZWQsIGRlc2NyaXB0aXZlIG1ldGFkYXRhIHRlbGxzIHVzIGFib3V0IHRoZSBjb250ZW50IG9mIGEgZGF0YXNldC4gV2l0aCBkZXNjcmlwdGl2ZSBtZXRhZGF0YSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gYW5zd2VyIHF1ZXN0aW9ucyBzdWNoIGFzOgoKKiBIb3cgbWFueSBjb2x1bW5zIGFyZSBpbiB0aGUgZGF0YXNldCwgYW5kIGhvdyBtYW55IHJvd3M/CiogV2hhdCBkb2VzIGVhY2ggcm93IHJlcHJlc2VudD8KKiBXaGF0IGRvZXMgZWFjaCBjb2x1bW4gbmFtZSByZWZlciB0bz8KKiBXaGF0IGFyZSB0aGUgcG9zc2libGUgdmFsdWVzIGluIGVhY2ggY29sdW1uPwoqIEhvdyB3YXMgdGhlIGRhdGEgY29sbGVjdGVkLCBhbmQgd2hhdCBzdGFuZGFyZHMgb2YgbWVhc3VyZW1lbnQgd2VyZSB1c2VkPwoqIFdoYXQgYXNzdW1wdGlvbnMgd2VyZSBtYWRlIHdoZW4gdGhlIGRhdGEgd2FzIGNvbGxlY3RlZCwgYW5kIGhvdyB3aWxsIHRob3NlIGFzc3VtcHRpb25zIGJlIHByZXNlbnRlZCBpbiB0aGUgZGF0YT8KCkNoZWNrIG91dCBzb21lIG9mIHRoZSBkZXNjcmlwdGl2ZSBtZXRhZGF0YSBmb3IgdGhlIHNhbWUgQmFsdGltb3JlIDkxMSBQb2xpY2UgQ2FsbHMgZm9yIFNlcnZpY2UgYWJvdmUuIAohW0Rlc2NyaXB0aXZlIE1ldGFkYXRhXShpbWFnZXMvZGVzY3JpcF9tZXRhZGF0YS5wbmcpCgpBcyBwYXJ0IG9mIHRoaXMgYmFzaWMgZGVzY3JpcHRpdmUgbWV0YWRhdGEsIHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgNy42MSBtaWxsaW9uIHJvd3MgaW4gdGhlIGRhdGFzZXQgYW5kIDE3IGNvbHVtbnMuIFdlIGNhbiBzZWUgdGhhdCBlYWNoIHJvdyAob3Igb2JzZXJ2YXRpb24pIGluIHRoZSBkYXRhc2V0IHJlcHJlc2VudHMgYSBjYWxsLCBhbmQgd2UgY2FuIHNlZSBlYWNoIG9mIHRoZSBjb2x1bW5zIChvciB2YXJpYWJsZXMpIGluIGRhdGFzZXQgdGhhdCBkZXNjcmliZSBhIGNhbGwuIAoKPiBUaGlzIGRhdGFzZXQgaXMgcHVibGlzaGVkIGluIEJhbHRpbW9yZSdzIG9wZW4gZGF0YSBwb3J0YWwuIE1hbnkgY2l0aWVzLCBjb3VudGllcywgc3RhdGVzLCBhbmQgY291bnRyaWVzIG5vdyBoYXZlIHRoZWlyIG93biB2ZXJzaW9ucyBvZiBhbiBvcGVuIGRhdGEgcG9ydGFsIHdoZXJlIHZhcmlvdXMgZ292ZXJubWVudCBhZ2VuY2llcyB1bmRlciB0aGVpciBqdXJpc2RpY3Rpb25zIHB1Ymxpc2ggZGF0YXNldHMuIFlvdSdsbCBub3RpY2UgdGhhdCBtYW55IG9mIHRoZXNlIHBvcnRhbHMgbG9vayB2ZXJ5IHNpbWlsYXIuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZSBwYXN0IGRlY2FkZSwgW1NvY3JhdGFdKGh0dHBzOi8vd3d3LnR5bGVydGVjaC5jb20vcHJvZHVjdHMvc29jcmF0YSkgLSBhIGNvbXBhbnkgdGhhdCBoYXMgZGVzaWduZWQgYSBkYXRhIGFzc2V0IG1hbmFnZW1lbnQgcGxhdGZvcm0gc3BlY2lmaWNhbGx5IGZvciBvcGVuIGdvdmVybm1lbnQgLSBoYXMgYmVjb21lIGEgZ28tdG8gcmVzb3VyY2UgZm9yIG9wZW5pbmcgZ292ZXJubWVudCBkYXRhLiBBIGNvbnNpZGVyYWJsZSBudW1iZXIgb2Ygb3BlbiBkYXRhIHBsYXRmb3JtcyBydW4gb24gU29jcmF0YSBhbmQgd2lsbCB0aHVzIGxvb2sgYW5kIGZlZWwgc2ltaWxhci4KCkFzIHdlIGNvbnRpbnVlIG91ciBsYWJzIHdlIGFyZSBnb2luZyB0byBrZWVwIGNvbWluZyBiYWNrIHRvIGEga2V5IHBvaW50OiBhbnkgY291bnQgdGhhdCB3ZSBwcm9kdWNlIG9yIGFueSBtZWFzdXJlbWVudCB0aGF0IHdlIHByb2R1Y2Ugd2lsbCBhbHdheXMgYmUgZGVwZW5kZW50IG9uIGhvdyB3ZSBkZWZpbmUgd2hhdCB3ZSBhcmUgY291bnRpbmcgb3IgbWVhc3VyaW5nLiBJZiB3ZSBhcmUgZ29pbmcgdG8gY291bnQgdGhlIG51bWJlciBvZiBjYXJzIG9uIHRoZSByb2FkLCB3ZSBoYXZlIHRvIGFzazogV2hhdCBjb3VudHMgYXMgYSBjYXI/IFdoYXQgd2lsbCBJIGluY2x1ZGUgaW4gdGhlIGNvdW50IGFuZCB3aGF0IHdpbGwgSSBleGNsdWRlPyBJZiB3ZSB3ZXJlIGdvaW5nIHRvIG1lYXN1cmUgdGhlIGhlaWdodCBvZiBhIGNoYWlyLCB3ZSBoYXZlIHRvIGFzazogQWNjb3JkaW5nIHRvIHdoYXQgdW5pdHMgYW0gSSBnb2luZyB0byBtZWFzdXJlIHRoZSBoZWlnaHQ/IFRoZSBudW1iZXJzIHRoYXQgd2UgcHJvZHVjZSB3aWxsIGJlIHNoYXBlZCBieSB0aGUgY2hvaWNlcyB3ZSBtYWtlIHJlZ2FyZGluZyBkYXRhIGNvbGxlY3Rpb24uIFdpdGhvdXQgZG9jdW1lbnRpbmcgdGhvc2UgY2hvaWNlcywgdGhlIHZhbHVlcyB3b24ndCBtYWtlIG11Y2ggc2Vuc2UgdG8gb3RoZXJzLiBBZ2Fpbiwgd2UgbXVzdCBmaXJzdCBkZWZpbmUgdGhpbmdzIGluIG9yZGVyIHRvIGNvdW50IG9yIG1lYXN1cmUgdGhlbS4gVGhpcyBpcyB3aHkgaXQgaXMgc28gaW1wb3J0YW50IHRoYXQgd2hlbiB3ZSBzaGFyZSBvdXIgZGF0YSwgb3RoZXJzIGNhbiBsb29rIHVwIHRoZSBkZWZpbml0aW9ucyB0aGF0IHdlIGFyZSB1c2luZyB0byBwcm9kdWNlIG91ciB2YWx1ZXMuIAoKV2l0aCB0aGlzIG1pbmQsIGRlc2NyaXB0aXZlIG1ldGFkYXRhIGlzIG9mdGVuIGRvY3VtZW50ZWQgaW4gd2hhdCBpcyBjYWxsZWQgYSBkYXRhIGRpY3Rpb25hcnkuIERhdGEgZGljdGlvbmFyaWVzIGFyZSB0b29scyBmb3IgbG9va2luZyB1cCB3aGF0IHZhcmlvdXMgdmFyaWFibGVzIGFuZCBjb2RlcyBpbiBhIGRhdGFzZXQgcmVmZXIgdG8uIFdpdGggYSBkYXRhIGRpY3Rpb25hcnksIGEgZGF0YSBhbmFseXN0IGNhbiBsb29rIHVwIGhvdyB2YWx1ZXMgd2VyZSBkZWZpbmVkIG11Y2ggbGlrZSB0aGV5IHdvdWxkIGxvb2sgdXAgdGhlIGRlZmluaXRpb24gb2YgYSB3b3JkIGluIHRoZSBPeGZvcmQgRW5nbGlzaCBEaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsIFNhbiBGcmFuY2lzY28gYWxzbyBwdWJsaXNoZXMgYSBkYXRhc2V0IGRvY3VtZW50aW5nIFs5MTEgQ2FsbHMgZm9yIFNlcnZpY2VdIChodHRwczovL2RhdGEuc2Znb3Yub3JnL1B1YmxpYy1TYWZldHkvUG9saWNlLURlcGFydG1lbnQtQ2FsbHMtZm9yLVNlcnZpY2UvaHo5bS10ajZ6KSwgYW5kIGluIGFkZGl0aW9uIHRvIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYWJvdmUsIHRoZXkgcHJvdmlkZSBhbiBhdHRhY2htZW50IHRvIGEgZG9jdW1lbnQgaWRlbnRpZnlpbmcgd2hhdCBudW1iZXIgY29kZXMgYW5kIGFiYnJldmlhdGlvbnMgaW4gdGhlIGRhdGFzZXQgcmVmZXIgdG86CgohW2F0dGFjaG1lbnRzXShpbWFnZXMvU0ZfYXR0YWNobWVudHMucG5nKSAhW2NvZGVzXShpbWFnZXMvY29kZXMucG5nKQoKTmV3IE9ybGVhbnMgYWxzbyBwdWJsaXNoZXMgYSB2ZXJzaW9uIG9mIHRoZSBbOTExIGNhbGxzIGZvciBzZXJ2aWNlIGRhdGFzZXRdKGh0dHBzOi8vZGF0YS5ub2xhLmdvdi9QdWJsaWMtU2FmZXR5LWFuZC1QcmVwYXJlZG5lc3MvQ2FsbHMtZm9yLVNlcnZpY2UtMjAxOS9xZjZxLXBwNGIpLiBUaGV5IGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRhdGEgZGljdGlvbmFyeSBkb2N1bWVudCBmb3IgcmVjb3JkaW5nIGRlc2NyaXB0aXZlIG1ldGFkYXRhIGFib3V0IHRoZSBkYXRhc2V0LiAKCiFbYXR0YWNobWVudHNdKGltYWdlcy9OT19hdHRhY2htZW50cy5wbmcpICFbRGF0YSBEaWN0aW9uYXJ5XShpbWFnZXMvZGQucG5nKQoKPiBDaGVjayBvdXQgW3RoaXNdKGh0dHBzOi8vZml2ZXRoaXJ0eWVpZ2h0LmNvbS9mZWF0dXJlcy93aGljaC1jaXRpZXMtc2hhcmUtdGhlLW1vc3QtY3JpbWUtZGF0YS8pIHJlYWxseSBuaWNlIHBpZWNlIG9uIEZpdmVUaGlydHlFaWdodCwgZGV0YWlsaW5nIHRoZSBleHRlbnQgdG8gd2hpY2ggZGlmZmVyZW50IGNpdGllcyBhbmQgc3RhdGVzIGhhdmUgbWFkZSBjcmltZSBkYXRhIGF2YWlsYWJsZSBmb3IgcHVibGljIGFuYWx5c2lzLiAKCkRhdGEgZGljdGlvbmFyaWVzIGFyZSBvZnRlbiB2ZXJ5IGltcG9ydGFudCBmb3IgY3JpbWUgZGF0YSBhcyB0aGVyZSBhcmUgYSBudW1iZXIgb2YgY2F2ZWF0cyB0byB3aGF0IGNhbiBiZSBwdWJsaWNseSByZXBvcnRlZCB3aXRoIHJlZ2FyZHMgdG8gY3JpbWUuIENvbnNpZGVyIHNvbWV0aGluZyBJIGxlYXJuZWQgd2hpbGUgd29ya2luZyBpbiBOWUMuIAoKYGBge3J9Cm55Y19hcnJlc3RzIDwtIHJlYWQuY3N2KCJodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9hcGkvdmlld3MvdWlwOC1meWtjL3Jvd3MuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpgYGAKCk5ZQyBwdWJsaXNoZXMgYSBkYXRhc2V0IGRvY3VtZW50aW5nIGVhY2ggYXJyZXN0LCB0aGUgZGF0ZSBpdCBvY2N1cnJlZCwgd2hlcmUgaXQgb2NjdXJyZWQsIHRoZSBjcmltZSBzdXNwZWN0ZWQsIGFuZCBkZW1vZ3JhcGhpYyBkZXRhaWxzIGFib3V0IHRoZSBwZXJzb24gYXJyZXN0ZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHllYXIgdG8gdGhlIHByZXNlbnQuCgpgYGB7cn0KbnljX2FycmVzdHMgJT4lIGhlYWQoKQpgYGAKCkhvd2V2ZXIsIGZvciBjZXJ0YWluIGNyaW1lcywgc3VjaCBhcyByYXBlLCBzaGFyaW5nIHRoZSBsb2NhdGlvbiBvZiB3aGVyZSB0aGUgY3JpbWUgb2NjdXJyZWQgY2FuIHB1dCBpbmRpdmlkdWFscyBhdCBjb25zaWRlcmFibGUgcmlzay4gV2hlbiB3ZSBmaWx0ZXIgdGhpcyBkYXRhIHRvIG9ubHkgcmVwcmVzZW50IHJhcGUgYXJyZXN0cyB0aGF0IGhhdmUgb2NjdXJyZWQgaW4gTWFuaGF0dGFuLCBhbmQgdGhlbiBtYXAgaXQsIHlvdSB3aWxsIG5vdGljZSB0aGF0IHRoZXJlIGFyZSB2ZXJ5IGZldyBsb2NhdGlvbnMgcmVwcmVzZW50ZWQgb24gdGhlIGdyYXBoIC0gMTkgYXQgdGhlIHdyaXRpbmcgb2YgdGhpcyBsYWIuIAoKVG8gdmlldyB0aGlzIG1hcCwgZW50ZXIgdGhlIGZvbGxvd2luZyBpbnRvIHlvdXIgY29uc29sZSwgYW5kIHRoZW4gcnVuIHRoZSBjb2RlIGJlbG93OgoKaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpCgpgYGB7cn0KbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCm55Y19hcnJlc3RzICU+JQogIGZpbHRlcihPRk5TX0RFU0MgPT0gIlJBUEUiICYgQVJSRVNUX0JPUk8gPT0gIk0iKSAlPiUKICBsZWFmbGV0KCkgJT4lIAogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuUG9zaXRyb24pICU+JQogIGFkZE1hcmtlcnMofkxvbmdpdHVkZSwgfkxhdGl0dWRlKQpgYGAKCkRvZXMgdGhpcyBtZWFuIHRoYXQgb25seSAxOSBhcnJlc3RzIGhhdmUgYmVlbiBtYWRlIGZvciByYXBlcyBpbiBNYW5oYXR0YW4gc2luY2UgdGhlIHN0YXJ0IG9mIHRoZSB5ZWFyPyBJdCBkb2VzIG5vdC4gRnJvbSBleGFtaW5pbmcgdGhlIGRhdGEgZG9jdW1lbnRhdGlvbiwgd2UgbGVhcm4gdGhhdCB1bmxpa2Ugb3RoZXIgY3JpbWVzIGluIE5ZQywgdGhlIGxvY2F0aW9uIG9mIGFsbCByYXBlIGFycmVzdHMgYXJlIGdlb2NvZGVkIGluIHRoZSBkYXRhc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBwb2xpY2Ugc3RhdGlvbiBob3VzZSBvZiB0aGUgcG9saWNlIHByZWNpbmN0IHdoZXJlIHRoZSByYXBlIG9jY3VycmVkLiBUaGlzIGlzIHRvIHByb3RlY3QgdGhlIHByaXZhY3kgYW5kIGFub255bWl0eSBvZiB0aGUgdmljdGltLgoKU29tZSBkYXRhIGRpY3Rpb25hcmllcyBhcmUgdmVyeSByb2J1c3QsIGRldGFpbGluZyBub3Qgb25seSB3aGF0IGVhY2ggY29sdW1uIHJlZmVycyB0bywgYnV0IGFsc28gdGhlIGV4cGVjdGVkIHR5cGUgb2YgZGF0YSBpbiB0aGF0IGNvbHVtbiwgZXZlcnkgdmFsdWUgdGhhdCBjYW4gYXBwZWFyIGluIHRoYXQgY29sdW1uLCB3aGVyZSBkYXRhIG1pZ2h0IGJlIG1pc3NpbmcgaW4gdGhhdCBjb2x1bW4gYW5kIHdoeSwgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgdmFsdWVzIGluIHRoYXQgY29sdW1uIHdlcmUgZ2VuZXJhdGVkLiBPdGhlciBkYXRhIGRpY3Rpb25hcmllcyBpbmNsdWRlIG11Y2ggbGVzcyBpbmZvcm1hdGlvbiwgZm9yY2luZyBhIGRhdGEgYW5hbHlzdCB0byBtYWtlIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdmFsdWVzIG1lYW4uIFNvbWV0aW1lcywgYSBkYXRhIGRpY3Rpb25hcnkgaXMgZWFzaWx5IGFjY2Vzc2libGUgd2l0aCBhIGRhdGFzZXQuIEhvd2V2ZXIsIHNvbWV0aW1lcywgaXQgY2FuIGJlIG11Y2ggaGFyZGVyIHRvIGZpbmQgZGVzY3JpcHRpdmUgbWV0YWRhdGEgLSBhdCB0aW1lcyBiZWNhdXNlIGl0IGlzIGJ1cmllZCB3aXRoaW4gY29tcGxpY2F0ZWQgdXNlciBpbnRlcmZhY2VzLCBhbmQgYXQgb3RoZXIgdGltZXMsIGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgYXQgYWxsLgoKSW4gYW4gaWRlYWwgd29ybGQsIHdlIHdvdWxkIGhhdmUgcmljaCBtZXRhZGF0YSBmb3IgZXZlcnkgZGF0YXNldCBwdWJsaXNoZWQgb24gYW4gb3BlbiBnb3Zlcm5tZW50IGRhdGEgcG9ydGFsLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIHJhcmVseSB0aGUgY2FzZS4gVGhlIHJvYnVzdG5lc3Mgb2YgdGhlIGRhdGEgZG9jdW1lbnRhdGlvbiwgYWxvbmcgd2l0aCBpdHMgZWFzZSBvZiBhY2Nlc3NpYmlsaXR5LCBjYW4gaW5kaWNhdGUgdGhlIGV4dGVudCB0byB3aGljaCBkYXRhIHB1Ymxpc2hlcnMgaGF2ZSBwcmlvcml0aXplZCByZXNwb25zaWJsZSBzdGV3YXJkc2hpcCBvZiB0aGUgZGF0YS4gSXQgY2FuIGFsc28gaW5kaWNhdGUgdGhlIGh1bWFuLCBmaW5hbmNpYWwsIGFuZCB0ZWNobmljYWwgcmVzb3VyY2VzIHZhcmlvdXMgZ292ZXJubWVudHMgaGF2ZSBhdmFpbGFibGUgZm9yIGRhdGEgbWFuYWdlbWVudCBhbmQgc3Rld2FyZHNoaXAuIFdoZW4gSSB3b3JrZWQgaW4gTllDLCB0aGVyZSB3ZXJlIHNvbWUgYWdlbmNpZXMgdGhhdCBwdWJsaXNoZWQgZG96ZW5zIG9mIGRhdGFzZXRzIG9uIHRoZSBvcGVuIGRhdGEgcG9ydGFsIHdpdGgganVzdCBvbmUgcGVyc29uIGF0IHRoZWlyIGFnZW5jeSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHB1YmxpY2F0aW9uIGFuZCBzdGV3YXJkc2hpcCBvZiBhbGwgb2YgdGhvc2UgZGF0YXNldHMsICppbiBhZGRpdGlvbiB0byB0aGF0IHBlcnNvbidzIG90aGVyIGR1dGllcyouCgpOb3RhYmx5LCB3aXRob3V0IGRlc2NyaXB0aXZlIG1ldGFkYXRhLCBpdCBpcyBtdWNoIG1vcmUgbGlrZWx5IHRoYXQgd2Ugd2lsbCBtYWtlIHBvb3IgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCBjZXJ0YWluIHRlcm1zIG1lYW4gaW4gdGhlIGRhdGEuIElmIHlvdSBldmVyIGZpbmQgeW91cnNlbGYgaW4gYSBzaXR1YXRpb24gd2hlcmUgeW91IGRvbid0IGtub3cgd2hhdCBhIHRlcm0gaW4gYW4gb3BlbiBnb3Zlcm5tZW50IGRhdGFzZXQgbWVhbnMsIHRoaXMgaXMgd2hlcmUgYWRtaW5pc3RyYXRpdmUgbWV0YWRhdGEgY2FuIGJlIGltcG9ydGFudC4gQmVmb3JlIGRyYXdpbmcgY29uY2x1c2lvbnMgZnJvbSB0aGUgZGF0YSwgeW91IHNob3VsZCBjb250YWN0IHRoZSBkZXNpZ25hdGVkIGNvbnRhY3QgcGVyc29uIHdpdGggYSBkZXRhaWxlZCBtZXNzYWdlIGV4cGxhaW5pbmcgcG9pbnRzIG9mIGNvbmZ1c2lvbiBpbiB0aGUgZGF0YS4gKFlvdSBtYXkgYWxzbyB3YW50IHRvIGVuY291cmFnZSB0aGVtIHRvIGRvY3VtZW50IHRoZWlyIHJlc3BvbnNlIGluIGEgZGF0YSBkaWN0aW9uYXJ5ISkgSW4gZnV0dXJlIGxhYnMsIEkgd2lsbCBkZXNjcmliZSBhIG51bWJlciBvZiBleGFtcGxlcyB3aGVyZSB3ZSBoYXZlIGhhZCB0byBkbyB0aGlzIGluIHBhc3QgaXRlcmF0aW9ucyBvZiB0aGlzIGNvdXJzZS4gCgotLS0KCiMjIERhdGFzZXQgSG9wcGluZyAKCk5vdyB5b3Ugd2lsbCBiZWdpbiB0byBzZWFyY2ggZm9yIG9wZW4gZ292ZXJubWVudCBvciBhY2FkZW1pYyBkYXRhc2V0cyByZWxhdGVkIHRvIHlvdXIgY2hvc2VuIHRvcGljLiBCZWxvdyBJIGhhdmUgc29tZSByZWNvbW1lbmRhdGlvbnMgdG8gb3BlbiBkYXRhIHBvcnRhbHMgd2hlcmUgc3R1ZGVudHMgaGF2ZSBmb3VuZCAgcmVsYXRlZCB0byB0aGVpciB0b3BpY3MgaW4gdGhlIHBhc3QuIEhvd2V2ZXIsIEkgYWxzbyBlbmNvdXJhZ2UgeW91IHRvIHNlYXJjaCBmb3IgZGF0YSBpbiBjaXR5IGFuZCBzdGF0ZSBvcGVuIGRhdGEgcG9ydGFscy4KCiMjIyBIZWFsdGhjYXJlCgoqIFtodHRwczovL2RhdGEubWVkaWNhaWQuZ292L10oaHR0cHM6Ly9kYXRhLm1lZGljYWlkLmdvdi8pCiogW2h0dHBzOi8vZGF0YS5tZWRpY2FyZS5nb3YvXShodHRwczovL2RhdGEubWVkaWNhcmUuZ292LykKKiBbaHR0cHM6Ly9kYXRhLmhlYWx0aGNhcmUuZ292L10oaHR0cHM6Ly9kYXRhLmhlYWx0aGNhcmUuZ292LykKKiBbaHR0cHM6Ly9kYXRhLmNoaHMuY2EuZ292L10oaHR0cHM6Ly9kYXRhLmNoaHMuY2EuZ292LykKCiMjIyBGb29kIFNlY3VyaXR5CgoqIFtodHRwczovL3d3dy5kYXRhLmdvdi9dKGh0dHBzOi8vd3d3LmRhdGEuZ292LykKKiBbaHR0cHM6Ly93d3cuZXJzLnVzZGEuZ292L2RhdGEtcHJvZHVjdHMvXShodHRwczovL3d3dy5lcnMudXNkYS5nb3YvZGF0YS1wcm9kdWN0cy8pCgojIyMgRG9tZXN0aWMgQWJ1c2UKCiogW2h0dHBzOi8vd3d3LmRhdGEuZ292L10oaHR0cHM6Ly93d3cuZGF0YS5nb3YvKQoqIFtodHRwczovL3d3dy5ianMuZ292L10oaHR0cHM6Ly93d3cuYmpzLmdvdi8pIAoKIyMjIEluY29tZSBTZWN1cml0eQoKKiBbaHR0cHM6Ly93d3cuZGF0YS5nb3YvXShodHRwczovL3d3dy5kYXRhLmdvdi8pCiogW2h0dHBzOi8vd3d3LmJscy5nb3YvXShodHRwczovL3d3dy5ibHMuZ292LykgCgojIyMgRW52aXJvbm1lbnQKCiogW2h0dHBzOi8vZWRnLmVwYS5nb3YvbWV0YWRhdGEvY2F0YWxvZy9tYWluL2hvbWUucGFnZV0oaHR0cHM6Ly9lZGcuZXBhLmdvdi9tZXRhZGF0YS9jYXRhbG9nL21haW4vaG9tZS5wYWdlKQoKQmFzZWQgb24geW91ciByZXNlYXJjaCwgZmlsbCB0aGUgZGF0YXNldHMgbW9zdCBzdWl0YWJsZSBmb3IgZXhhbWluaW5nIHlvdXIgdG9waWMgaW50byB0aGUgY2hhcnQgYmVsb3cuIEJlIHN1cmUgdG8gcmVzcG9uZCB0byBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gdGhlIGNoYXJ0LiBJJ3ZlIGluY2x1ZGVkIGEgZGF0YSBkaWN0aW9uYXJ5IGJlbG93IHNvIHRoYXQgeW91IG1heSByZWZlcmVuY2Ugd2hhdCBlYWNoIGNvbHVtbiBtZWFucy4gCgojIyMgRGF0YSBEaWN0aW9uYXJ5IGZvciBEYXRhc2V0IEhvcHBpbmcgQ2hhcnQKCiogRGF0YXNldD86IFdoYXQgaXMgdGhlIHRpdGxlIG9mIHRoZSBkYXRhc2V0PwoqIEZvdW5kPzogV2hlcmUgZGlkIHlvdSBmaW5kIGl0PyAoUHJvdmlkZSBhIGxpbmsuKQoqIEZvcm1hdHM/OiBJbiB3aGF0IGZvcm1hdHMgaXMgaXQgYXZhaWxhYmxlIGZvciBkb3dubG9hZD8KKiBERD86IElzIHRoZXJlIGEgZGF0YSBkaWN0aW9uYXJ5IG9yIGRhdGEgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgZm9yIGRvd25sb2FkPwoqIFRpbWVzcGFuPzogV2hhdCByYW5nZSBvZiB0aW1lIGRvZXMgaXQgY292ZXI/CiogR2VvZ3JhcGh5PyBXaGF0IGdlb2dyYXBoaWMgcmFuZ2UgZG9lcyBpdCBjb3Zlcj8gCiogUm93PzogV2hhdCBkb2VzIGVhY2ggcm93IGluIHRoZSBkYXRhc2V0IHJlcHJlc2VudD8KKiBVcGRhdGU/OiBIb3cgb2Z0ZW4gaXMgdGhlIGRhdGFzZXQgdXBkYXRlZD8KKiBTb3VyY2U/OiBXaGF0IG9yZ2FuaXphdGlvbiBjcmVhdGVkIHRoaXMgZGF0YXNldD8gSXMgdGhpcyBvcmdhbml6YXRpb24gcmVwdXRhYmxlPwoKIyMjIERhdGFzZXQgSG9wcGluZyBDaGFydAoKSSd2ZSBpbmNsdWRlZCBhbiBleGFtcGxlIG9mIGEgZGF0YXNldCB3ZSB3aWxsIHVzZSBhcyBhbiBleGFtcGxlIGZvciBsYWJzIGluIHRoZSBmaXJzdCByb3cuIAoKRGF0YXNldD8gfCBGb3VuZD8gfCBGb3JtYXRzPyB8IEREPyB8IFRpbWVzcGFuPyB8IEdlb2dyYXBoeT8gfCBSb3c/IHwgVXBkYXRlPyB8IFNvdXJjZT8KLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0KMjAxOSBOb3ZlbCBDb3JvbmF2aXJ1cyBDT1ZJRC0xOSB8IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOSB8IC5jc3YgfCBObyB8IEphbiAyMiwgMjAyMCB0byBQcmVzZW50ICB8IEdsb2JhbCBieSBQcm92aW5jZS9Db3VudHJ5IHwgQ2FzZXMgcGVyIGRheSBieSBQcm92aW5jZS9Db3VudHJ5IHwgRGFpbHkgfCBKb2huJ3MgSG9wa2lucyBDU1NTRSAocmVwdXRhYmxlIHNvdXJjZSkKRmlsbCB8IEZpbGwgfCBGaWxsIHwgRmlsbCB8IEZpbGwgfCBGaWxsIHwgRmlsbCB8IEZpbGwgfCBGaWxsCkZpbGwgfCBGaWxsIHwgRmlsbCB8IEZpbGwgfCBGaWxsIHwgRmlsbCB8IEZpbGwgfCBGaWxsIHwgRmlsbApGaWxsIHwgRmlsbCB8IEZpbGwgfCBGaWxsIHwgRmlsbCB8IEZpbGwgfCBGaWxsIHwgRmlsbCB8IEZpbGwKCk5vdGUgdGhhdCBjZXJ0YWluIGRhdGFzZXRzIHdpbGwgd29yayBiZXR0ZXIgZm9yIHRoZXNlIGFzc2lnbm1lbnRzIHRoYW4gb3RoZXJzLiBXaGVuIHRoZXNlIGxhYnMgYXJlIGJlaW5nIGNvbXBsZXRlZCBpbiB0aGUgY29udGV4dCBvZiBvbmUgb2YgbXkgY291cnNlcywgSSBoZWxwIHN0dWRlbnRzIGRldGVybWluZSB3aGljaCBkYXRhc2V0cyBhcmUgbW9zdCBhcHByb3ByaWF0ZSBmb3IgdGhlIGZvbGxvd2luZyBhc3NpZ25tZW50cy4gSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBJIHRha2UgaW50byBjb25zaWRlcmF0aW9uIHdoaWxlIHByb3ZpZGluZyBndWlkYW5jZSB0byB0aGUgc3R1ZGVudC4gCgoqIEZpcnN0LCBpdCB3aWxsIGJlIHZlcnkgZGlmZmljdWx0IHRvIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgYXNzaWdubWVudHMgZm9yIGEgZGF0YXNldCB0aGF0IGhhcyB6ZXJvIGRvY3VtZW50YXRpb24uIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHN1Y2ggZGF0YXNldHMgZG9uJ3QgZGVzZXJ2ZSBjcml0aWNhbCBhdHRlbnRpb24uIEl0IGp1c3QgbWVhbnMgdGhhdCB0aGV5IGRlc2VydmUgYSBkaWZmZXJlbnQgdHlwZSBvZiBhdHRlbnRpb24gdGhhbiB0aGUgZm9sbG93aW5nIGxhYnMgY2FuIGFmZm9yZC4gCiogU2Vjb25kLCB0aGVzZSBhc3NpZ25tZW50cyBhcmUgZGVzaWduZWQgdG8gc3VwcG9ydCBlbmdhZ2VtZW50IHdpdGggKnJlY3Rhbmd1bGFyIGRhdGFzZXRzKiAtIGkuZS4gZGF0YXNldHMgdGhhdCBhcmUgc3RydWN0dXJlZCBpbnRvIGEgc2VyaWVzIG9mIHJvd3Mgb2YgZXF1YWwgbGVuZ3RoIGFuZCBjb2x1bW5zIG9mIGVxdWFsIGxlbmd0aC4gV2hpbGUgaXQgY2FuIGJlIGltcG9ydGFudCB0byBzdHVkeSBkYXRhIHN0cnVjdHVyZWQgaW4gb3RoZXIgd2F5cywgdGhlc2UgbGFicyBhcmUgbm90IGRlc2lnbmVkIHRvIHN1cHBvcnQgdGhhdCBraW5kIG9mIGVuZ2FnZW1lbnQuCiogVGhpcmQsIHRoZXNlIGxhYnMgd2lsbCB3b3JrIGJldHRlciBmb3IgZGF0YXNldHMgdGhhdCBhcmUgYXQgbW9zdCB0aHJlZS1kaW1lbnNpb25hbC4gV2hhdCBkbyBJIG1lYW4gYnkgdGhpcz8gQXMgd2Ugd2VudCBvdmVyIGluIGxhYiAxLCBlYWNoIHJvdyBpbiBhIHJlY3Rhbmd1bGFyIGRhdGFzZXQgcmVwcmVzZW50cyBhbiBvYnNlcnZhdGlvbi4gSW4gb25lLWRpbWVuc2lvbmFsIGRhdGEsIHlvdSBzaG91bGQgYmUgYWJsZSB0byB1bmlxdWVseSBpZGVudGlmeSBlYWNoIHJvdyBpbiB0aGUgZGF0YXNldCB3aXRoIGp1c3Qgb25lIHZhcmlhYmxlLiBFdmVyeSByb3cgcmVwcmVzZW50cyBvbmUgdGhpbmcgLSBhIGhvc3BpdGFsLCBhIHBlcnNvbiwgYSBsb2NhdGlvbiwgZXRjLiBJbiB0d28tZGltZW5zaW9uYWwgZGF0YSwgeW91IHNob3VsZCBiZSBhYmxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGVhY2ggcm93IGluIHRoZSBkYXRhc2V0IHdpdGggdHdvIHZhcmlhYmxlcy4gRm9yIGluc3RhbmNlLCBwZXJoYXBzIHRoZSBkYXRhc2V0IGlzIHJlcG9ydGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvdW50eSAqZWFjaCB5ZWFyKi4gSW4gdGhpcyBjYXNlLCB5b3Ugd291bGQgbmVlZCBib3RoIHRoZSB5ZWFyIGFuZCB0aGUgY291bnR5IHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGVhY2ggcm93LiBJbiB0aHJlZS1kaW1lbnNpb25hbCBkYXRhLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCByb3cgaW4gdGhlIGRhdGFzZXQgd2l0aCB0aHJlZSB2YXJpYWJsZXMuIEZvciBpbnN0YW5jZSwgcGVyaGFwcyB0aGUgZGF0YXNldCBpcyByZXBvcnRpbmcgaW5mb3JtYXRpb24gYWJvdXQgZGlmZmVyZW50IHBvbGljeSB0eXBlcyBpbiBlYWNoIGNvdW50eSBpbiBlYWNoIHllYXIuIEluIHRoaXMgY2FzZSwgeW91IHdvdWxkIG5lZWQgYWxsIHRocmVlIG9mIHRoZXNlIHZhcmlhYmxlcyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIHJvdy4gV2Ugd2lsbCBnbyBvdmVyIHRoaXMgbW9yZSBpbiBsYWIgNC4gRm9yIG5vdywgeW91IHNob3VsZCBqdXN0IGtlZXAgaW4gbWluZCB0aGF0IGRhdGEgcmVxdWlyaW5nIG1vcmUgdGhhbiB0aHJlZSB2YXJpYWJsZXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCByb3cgd2lsbCBub3Qgd29yayB3ZWxsIGZvciB0aGVzZSBsYWJzLiAK