1 Basic Concepts of Sampling Design

Sampling population.

Sampling population.

This section introduces the basic concepts of sampling design and analysis.

Population: Total of items about which information is desired. It can be classified into two categories - finite and infinite.

Finite Population - The population is said to be finite if it consists of a fixed number of elements so that it is possible to enumerate in its totality.

Infinite population - The number of items is infinite.

From practical consideration, we use the term infinite population for a population that cannot be enumerated in a reasonable period of time.

Sample: It is part of the population that represents the characteristics of the population.

Sampling: It is the process of selecting the sample for estimating the population characteristics. In other words, it is the process of obtaining information about an entire population by examining only a part of it.

Sampling Unit: A sampling unit is the basic unit or individual element selected from a population for inclusion in a sample during the process of sampling. It is the smallest entity that can be chosen or measured in a study. The choice of sampling unit depends on the research objective and the population being studied. Some examples ob sampling units are given below

  • If we are studying the average income of households in a city, the sampling unit could be a single household.
  • If we are studying the yield of wheat in a region, the sampling unit could be a single plot of land where wheat is grown.
  • If we are inspecting the quality of light bulbs produced in a factory, the sampling unit could be a single light bulb.
  • If we are studying the performance of students in a school district, the sampling unit could be a single student.
  • If we are researching the prevalence of a disease in a community, the sampling unit could be a single individual or patient.
  • If we are studying the diversity of plant species in a forest, the sampling unit could be a quadrat (a small, defined area of land).
  • If we are analyzing consumer preferences for a product, the sampling unit could be a single consumer or household.

Sampling Frame: A sampling frame is a list or representation of all the elements or units in a population from which a sample is drawn for research or analysis. It serves as the foundation for selecting a sample and ensures that every member of the population has a known, non-zero chance of being included in the sample. A well-defined sampling frame is crucial for achieving accurate and unbiased results in research. Some examples about sampling frame are given below:

  • If a researcher is studying the opinions of residents in a city, they might use a telephone directory as the sampling frame to randomly select participants.
  • For a political survey, the voter registration list can serve as the sampling frame to ensure that all eligible voters are included.
  • In a company, the HR department’s employee database can be used as a sampling frame to select employees for a workplace satisfaction survey.
  • A researcher studying student performance might use school enrollment records as the sampling frame to select students for their study.
  • A business conducting market research might use its customer database as the sampling frame to select participants for a survey.
  • In ecological studies, a map of a region can serve as the sampling frame to select specific locations or plots for data collection.

Sample Survey: An investigation in which elaborate information is collected on a sample basis is known as a sample survey.

Statistic: Characteristics of the sample. For example, sample Mean, proportion, etc.

Parameter: Characteristics of the population. For example, population Mean, proportion, etc.

Target Population: A target population is the entire group about which information is desired and conclusions are made.

Sampled Population: The population, that we actually sample, is the sampled population. It is also called the survey population.

2 Purples of Sampling

The basic purpose of sampling is to provide an estimate of the population parameter and to test the hypothesis. The advantages of sampling are -

  • Save time and money.

  • Enable collection of comprehensive data.

  • Enable more accurate measurement as it is conducted by trained and experienced investigators.

  • Sampling remains the only way when the population contains infinitely many members.

  • In certain situations, sampling is the only way of data collection. For example, in testing the pathological status of blood, boiling status of rice, etc.

  • It provides a valid estimation of sampling error.

3 Sampling Process

The sampling process comprises several stages

  1. Define the population.

  2. Specifying the sampling frame.

  3. Specifying the sampling unit.

  4. Selection of the sampling method.

  5. Determination of sample size.

  6. Specify the sampling plan.

  7. Selecting the sample.

3.1 Defining the Population

The population must be defined in terms of elements, sampling units, extent, and time. Because there is very rarely enough time or money to gather information from everyone or everything in a population, the goal becomes finding a representative sample (or subset) of that population.

3.2 Specifying Sampling Frame

As a remedy, we seek a sampling frame that has the property that we can identify every single element and include any in our sample. The most straightforward type of frame is a list of elements of the population (preferably the entire population) with appropriate contact information.

A sampling frame may be a telephone book, a city directory, an employee roster, a listing of all students attending a university, or a list of all possible phone numbers.

3.3 Specifying Sampling Unit

A sampling unit is a basic unit that contains a single element or a group of elements of the population to be sampled. The sampling unit selected is often dependent upon the sampling frame. If a relatively complete and accurate listing of elements is available (e.g. register of purchasing agents) one may well want to sample them directly. If no such register is available, one may need to sample companies as the basic sampling unit.

3.4 Selecting Sampling Method

The sampling method outlines the way in which the sample units are to be selected. The choice of the sampling method is influenced by the objectives of the research, availability of financial resources, time constraints, and the nature of the problem to be investigated. All sampling methods can be grouped under two distinct heads, that is, probability and non-probability sampling.

3.5 Determining Sample Size

The sample size calculation depends primarily on the type of sampling design used. However, for all sampling designs, the estimates for the expected sample characteristics (e.g. mean, proportion, or total) desired level of certainty, and the level of precision must be clearly specified in advance. The statement of the precision desired might be made by giving the amount of error that we are willing to tolerate in the resulting estimates. Common levels of precision are 5% and 10%.

3.6 Specifying Sampling Plan

In this step, the specifications and decisions regarding the implementation of the research process are outlined. As the interviewers and their co-workers will be on field duty most of the time, a proper specification of the sampling plans would make their work easy, and they would not have to revert to operational problems.

3.7 Selecting the Sample

The final step in the sampling process is the actual selection of the sample elements. This requires a substantial amount of office and fieldwork, particularly if personal interviews are involved.

4 Sampling Methods

There are two basic approaches to sampling: Probability Sampling and Non-probability Sampling. We only focus on methods of probability sampling plans.

Probability sampling is also known as random sampling or chance sampling. In this, sample is taken in such a manner that each and every unit of the population has an equal and positive chance of being selected. In this way, it is ensured that the sample would truly represent the overall population. Probability sampling can be achieved by random selection of the sample among all the units of the population. Major random sampling procedures are

  • Simple Random Sample
  • Systematic Random Sample
  • Stratified Random Sample, and
  • Cluster/ Multistage Sample.

4.1 Simple Random Sample

In a simple random variable (SRS), each member of the population is numbered. Then, a given size of the sample is drawn with the help of a random number generator (chart). It is relatively simple to implement but the final sample may miss out on small subgroups.

Advantages: The sample will be free from Bias (i.e. it’s random!).

Disadvantages: SRS is difficult to obtain due to its randomness. If the sample size is small, it could generate a result that is completely off the true value of the parameter and is also difficult to spot. Increasing the sample size is the best way to eradicate this problem.

4.2 Systematic Random Sample

It also requires numbering the entire population. Then every nth number (say every 5th or 10th number, as the case may be) is selected to constitute the sample. It is easier and more likely to represent different subgroups.

Advantages: Can eliminate other sources of bias.

Disadvantages: This can introduce bias where the pattern used for the samples coincides with a pattern in the population.

4.3 Stratified Random Sample

At first, the population is divided into groups or strata each of which is homogeneous with respect to the given characteristic feature. From each stratum, then, samples are drawn at random. This is called stratified random sampling. For example, with respect to the level of socio-economic status, the population may first be grouped in such strata as high, middle, low, and very low socio-economic levels as per pre-determined criteria, and a random sample drawn from each group.

The sample size for each sub-group can be fixed to get a representative sample. This way, it is possible that different categories in the population are fairly represented in the sample, which could have been left out otherwise in a simple random sample.

Advantages: Yields more accurate results than simple random sampling.
Can show different tendencies within each category (e.g. men and women).
Disadvantages: Nothing major, hence it’s used a lot.

As with stratified samples, the population is broken down into different categories. However, the size of the sample of each category does not reflect the population as a whole. The Quota sampling technique can be used where an unrepresentative sample is desirable (e.g. you might want to interview more children than adults for a survey on computer games), or where it would be too difficult to undertake a stratified sample

4.4 Cluster/ Multistage Sample

In some cases, the selection of units may pass through various stages, before you finally reach your sample of study. For this, a State, for example, may be divided into districts, districts into blocks, blocks into villages, and villages into identifiable groups of people, and then the random or quota sample from each group.

For example, taking a random selection of 3 out of 15 districts of a State, 6 blocks from each selected district, 10 villages from each selected block, and 20 households from each selected village, totaling 3600 respondents. This design is used for large-scale surveys spread over large areas.

The advantage is that it needs a detailed sampling frame for selected clusters only rather than for the entire target area. There are savings in travel costs and time as well.

However, there is a risk of missing important sub-groups and not having a complete representation of the target population.

Advantages: Less expensive and time-consuming than a fully random sample. Can show ‘regional’ variations.

Disadvantages: Not a genuine random sample. Likely to yield a biased result (especially if only a few clusters are sampled).

5 Sampling Error and Survey Bias

Survey results are typically subject to some error. Total errors can be classified into sampling errors and non-sampling errors. The term ‘error’ here includes systematic biases as well as random errors.

5.1 Sampling errors and biases:

Sampling errors and biases are induced by the sample design. They include

  • Selection bias: When the true selection probabilities differ from those assumed in calculating the results.

  • Random sampling error: Random variation in the results due to the elements in the sample being selected at random.

Non-sampling error Non-sampling errors are other errors that can impact the final survey estimates, caused by problems in data collection, processing, or sample design. They include

Over-coverage: Inclusion of data from outside of the population.

Under-coverage: Occurs when some members of the population are inadequately represented in the sample. Under-coverage is often a problem with convenience samples.

Measurement error: When respondents misunderstand a question or find it difficult to answer.

Processing error: Mistakes in data coding.

Non-response: Failure to obtain complete data from all selected individuals.

After sampling, a review should be held of the exact process followed in sampling, rather than that intended, in order to study any effects that any divergences might have on subsequent analysis.

5.2 Bias Due to Measurement Error

A poor measurement process can also lead to bias. In survey research, the measurement process includes the environment in which the survey is conducted, the way that questions are asked, and the state of the survey respondent.

Response bias refers to the bias that results from problems in the measurement process. For example, a satisfaction survey may ask the respondent to indicate where she is satisfied, dissatisfied, or very dissatisfied. By giving the respondent one response option to express satisfaction and two response options to express dissatisfaction, this survey question is biased toward getting a dissatisfied response. This becomes more serious if the survey response is socially sensitive.

Increasing the sample size tends to reduce the sampling error; that is, it makes the sample statistic less variable. However, increasing the sample size does not affect survey bias. A large sample size cannot correct the methodological problems (under-coverage, non-response bias, etc.) that produce survey bias.

6 Sample Size Determination

Determination of sample size is probably one of the most important phases in the sampling process.

From a theoretical perspective, the larger the sample size, the better the estimation. However, as the sample size reaches a certain size, the impact on the estimate will become negligible. On the other hand, sampling can be expensive. If the sampling precision is pre-specified, we only choose the appropriate size to meet the precision without wasting resources.

For example, if the estimate of the mean of the population is required to be within \(\pm 3\) of the true mean with 95% confidence. That is, if the true mean is 100, the estimated value of the mean will be no less than 97 and no more than 103. In other words, all this means that the acceptable error, e, is equal to 3.

The methods of determining the sample size are dependent on the specific estimation tasks such as population means, variance, correlations, etc. In other words, there is no single algorithm that fits all sample size determination problems because it is one type of statistics problem just like the problems of statistical hypothesis.

6.1 Problems of Estimating Mean and Proportion

The above example explained the idea of estimating the population mean with a pre-specified estimation error (\(\pm 3\)). The acceptable estimation error is, in fact, the margin of error in the confidence interval which is given by

\[ \bar{x} \pm \text{CV}_{\alpha/2}\frac{\sigma}{\sqrt{n}} \]

where \(E = \text{CV}_{\alpha/2}\sigma/\sqrt{n}\) is the margin error (i.e., pre-specified estimation error).

In other words, if estimation error \(E\) and confidence level \(100(1-\alpha)\%\) is given, we can then solve for the desired sample size \(n\) by the following formula

\[ n = \left[ \frac{\sigma}{\text{CV}_{\alpha/2}}\right]^2 \]

The formula for determining the sample size of estimating a population proportion with a given estimation error and confidence level is given by

\[ n = \left[ \frac{\sqrt{\hat{p}(1-\hat{p})}}{\text{CV}_{\alpha/2}}\right]^2 \]

6.2 Estimating Variance and Other Characteristics

The derivation of formulas for calculating sample size for estimating variance or other population characteristics is not straightforward. Since this is not the focus of this course, we will not expand the discussion in any direction.

6.3 Sample Size Determination and Power Calculation

Sample size determination in power analysis is another very important procedure in clinical studies. It is a required component in the statistical analysis plan (SAP) for intervention and non-intervention observational studies. We will also not expand the discussion from this direction.

LS0tDQp0aXRsZTogIkRlc2NyaXB0aXZlIEFuYWx5c2lzIG9mIEJhbmsgTG9hbiBEYXRhIg0KYXV0aG9yOiAiQ2hlbmcgUGVuZyINCmRhdGU6ICIiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICBmaWdfaGVpZ2h0OiA0DQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KLS0tDQoNCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoImxlc3NSIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxlc3NSIikNCiAgIGxpYnJhcnkobGVzc1IpDQp9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQoNCiMJQmFzaWMgQ29uY2VwdHMgb2YgU2FtcGxpbmcgRGVzaWduDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjUwJSIsIGZpZy5jYXA9IlNhbXBsaW5nIHBvcHVsYXRpb24uIn0NCmluY2x1ZGVfZ3JhcGhpY3MoImltZy9SYW5kb21TYW1wbGluZy5wbmciKQ0KYGBgDQoNClRoaXMgc2VjdGlvbiBpbnRyb2R1Y2VzIHRoZSBiYXNpYyBjb25jZXB0cyBvZiBzYW1wbGluZyBkZXNpZ24gYW5kIGFuYWx5c2lzLg0KDQoqKlBvcHVsYXRpb24qKjogIFRvdGFsIG9mIGl0ZW1zIGFib3V0IHdoaWNoIGluZm9ybWF0aW9uIGlzIGRlc2lyZWQuIEl0IGNhbiBiZSBjbGFzc2lmaWVkIGludG8gdHdvIGNhdGVnb3JpZXMgLSBmaW5pdGUgYW5kIGluZmluaXRlLiANCg0KKkZpbml0ZSBQb3B1bGF0aW9uKiAtIFRoZSBwb3B1bGF0aW9uIGlzIHNhaWQgdG8gYmUgZmluaXRlIGlmIGl0IGNvbnNpc3RzIG9mIGEgZml4ZWQgbnVtYmVyIG9mIGVsZW1lbnRzIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZW51bWVyYXRlIGluIGl0cyB0b3RhbGl0eS4gIA0KDQoqSW5maW5pdGUgcG9wdWxhdGlvbiogLSBUaGUgbnVtYmVyIG9mIGl0ZW1zIGlzIGluZmluaXRlLiANCg0KRnJvbSBwcmFjdGljYWwgY29uc2lkZXJhdGlvbiwgd2UgdXNlIHRoZSB0ZXJtIGluZmluaXRlIHBvcHVsYXRpb24gZm9yIGEgcG9wdWxhdGlvbiB0aGF0IGNhbm5vdCBiZSBlbnVtZXJhdGVkIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZS4gDQogDQogDQoqKlNhbXBsZSoqOiBJdCBpcyBwYXJ0IG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBwb3B1bGF0aW9uLg0KICANCioqU2FtcGxpbmcqKjogSXQgaXMgdGhlIHByb2Nlc3Mgb2Ygc2VsZWN0aW5nIHRoZSBzYW1wbGUgZm9yIGVzdGltYXRpbmcgdGhlIHBvcHVsYXRpb24gY2hhcmFjdGVyaXN0aWNzLiBJbiBvdGhlciB3b3JkcywgaXQgaXMgdGhlIHByb2Nlc3Mgb2Ygb2J0YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGFuIGVudGlyZSBwb3B1bGF0aW9uIGJ5IGV4YW1pbmluZyBvbmx5IGEgcGFydCBvZiBpdC4gDQogIA0KKipTYW1wbGluZyAgVW5pdCoqOiBBIHNhbXBsaW5nIHVuaXQgaXMgdGhlIGJhc2ljIHVuaXQgb3IgaW5kaXZpZHVhbCBlbGVtZW50IHNlbGVjdGVkIGZyb20gYSBwb3B1bGF0aW9uIGZvciBpbmNsdXNpb24gaW4gYSBzYW1wbGUgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIHNhbXBsaW5nLiBJdCBpcyB0aGUgc21hbGxlc3QgZW50aXR5IHRoYXQgY2FuIGJlIGNob3NlbiBvciBtZWFzdXJlZCBpbiBhIHN0dWR5LiBUaGUgY2hvaWNlIG9mIHNhbXBsaW5nIHVuaXQgZGVwZW5kcyBvbiB0aGUgcmVzZWFyY2ggb2JqZWN0aXZlIGFuZCB0aGUgcG9wdWxhdGlvbiBiZWluZyBzdHVkaWVkLiBTb21lIGV4YW1wbGVzIG9iIHNhbXBsaW5nIHVuaXRzIGFyZSBnaXZlbiBiZWxvdw0KDQoqIElmIHdlIGFyZSBzdHVkeWluZyB0aGUgYXZlcmFnZSBpbmNvbWUgb2YgaG91c2Vob2xkcyBpbiBhIGNpdHksIHRoZSBzYW1wbGluZyB1bml0IGNvdWxkIGJlIGEgc2luZ2xlIGhvdXNlaG9sZC4NCiogSWYgd2UgYXJlIHN0dWR5aW5nIHRoZSB5aWVsZCBvZiB3aGVhdCBpbiBhIHJlZ2lvbiwgdGhlIHNhbXBsaW5nIHVuaXQgY291bGQgYmUgYSBzaW5nbGUgcGxvdCBvZiBsYW5kIHdoZXJlIHdoZWF0IGlzIGdyb3duLg0KKiBJZiB3ZSBhcmUgaW5zcGVjdGluZyB0aGUgcXVhbGl0eSBvZiBsaWdodCBidWxicyBwcm9kdWNlZCBpbiBhIGZhY3RvcnksIHRoZSBzYW1wbGluZyB1bml0IGNvdWxkIGJlIGEgc2luZ2xlIGxpZ2h0IGJ1bGIuDQoqIElmIHdlIGFyZSBzdHVkeWluZyB0aGUgcGVyZm9ybWFuY2Ugb2Ygc3R1ZGVudHMgaW4gYSBzY2hvb2wgZGlzdHJpY3QsIHRoZSBzYW1wbGluZyB1bml0IGNvdWxkIGJlIGEgc2luZ2xlIHN0dWRlbnQuDQoqIElmIHdlIGFyZSByZXNlYXJjaGluZyB0aGUgcHJldmFsZW5jZSBvZiBhIGRpc2Vhc2UgaW4gYSBjb21tdW5pdHksIHRoZSBzYW1wbGluZyB1bml0IGNvdWxkIGJlIGEgc2luZ2xlIGluZGl2aWR1YWwgb3IgcGF0aWVudC4NCiogSWYgd2UgYXJlIHN0dWR5aW5nIHRoZSBkaXZlcnNpdHkgb2YgcGxhbnQgc3BlY2llcyBpbiBhIGZvcmVzdCwgdGhlIHNhbXBsaW5nIHVuaXQgY291bGQgYmUgYSBxdWFkcmF0IChhIHNtYWxsLCBkZWZpbmVkIGFyZWEgb2YgbGFuZCkuDQoqIElmIHdlIGFyZSBhbmFseXppbmcgY29uc3VtZXIgcHJlZmVyZW5jZXMgZm9yIGEgcHJvZHVjdCwgdGhlIHNhbXBsaW5nIHVuaXQgY291bGQgYmUgYSBzaW5nbGUgY29uc3VtZXIgb3IgaG91c2Vob2xkLg0KICANCiAgDQogIA0KKipTYW1wbGluZyBGcmFtZSoqOiAgQSBzYW1wbGluZyBmcmFtZSBpcyBhIGxpc3Qgb3IgcmVwcmVzZW50YXRpb24gb2YgYWxsIHRoZSBlbGVtZW50cyBvciB1bml0cyBpbiBhIHBvcHVsYXRpb24gZnJvbSB3aGljaCBhIHNhbXBsZSBpcyBkcmF3biBmb3IgcmVzZWFyY2ggb3IgYW5hbHlzaXMuIEl0IHNlcnZlcyBhcyB0aGUgZm91bmRhdGlvbiBmb3Igc2VsZWN0aW5nIGEgc2FtcGxlIGFuZCBlbnN1cmVzIHRoYXQgZXZlcnkgbWVtYmVyIG9mIHRoZSBwb3B1bGF0aW9uIGhhcyBhIGtub3duLCBub24temVybyBjaGFuY2Ugb2YgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIHNhbXBsZS4gQSB3ZWxsLWRlZmluZWQgc2FtcGxpbmcgZnJhbWUgaXMgY3J1Y2lhbCBmb3IgYWNoaWV2aW5nIGFjY3VyYXRlIGFuZCB1bmJpYXNlZCByZXN1bHRzIGluIHJlc2VhcmNoLiBTb21lIGV4YW1wbGVzIGFib3V0IHNhbXBsaW5nIGZyYW1lIGFyZSBnaXZlbiBiZWxvdzoNCg0KKiBJZiBhIHJlc2VhcmNoZXIgaXMgc3R1ZHlpbmcgdGhlIG9waW5pb25zIG9mIHJlc2lkZW50cyBpbiBhIGNpdHksIHRoZXkgbWlnaHQgdXNlIGEgdGVsZXBob25lIGRpcmVjdG9yeSBhcyB0aGUgc2FtcGxpbmcgZnJhbWUgdG8gcmFuZG9tbHkgc2VsZWN0IHBhcnRpY2lwYW50cy4NCiogRm9yIGEgcG9saXRpY2FsIHN1cnZleSwgdGhlIHZvdGVyIHJlZ2lzdHJhdGlvbiBsaXN0IGNhbiBzZXJ2ZSBhcyB0aGUgc2FtcGxpbmcgZnJhbWUgdG8gZW5zdXJlIHRoYXQgYWxsIGVsaWdpYmxlIHZvdGVycyBhcmUgaW5jbHVkZWQuDQoqIEluIGEgY29tcGFueSwgdGhlIEhSIGRlcGFydG1lbnQncyBlbXBsb3llZSBkYXRhYmFzZSBjYW4gYmUgdXNlZCBhcyBhIHNhbXBsaW5nIGZyYW1lIHRvIHNlbGVjdCBlbXBsb3llZXMgZm9yIGEgd29ya3BsYWNlIHNhdGlzZmFjdGlvbiBzdXJ2ZXkuDQoqIEEgcmVzZWFyY2hlciBzdHVkeWluZyBzdHVkZW50IHBlcmZvcm1hbmNlIG1pZ2h0IHVzZSBzY2hvb2wgZW5yb2xsbWVudCByZWNvcmRzIGFzIHRoZSBzYW1wbGluZyBmcmFtZSB0byBzZWxlY3Qgc3R1ZGVudHMgZm9yIHRoZWlyIHN0dWR5Lg0KKiBBIGJ1c2luZXNzIGNvbmR1Y3RpbmcgbWFya2V0IHJlc2VhcmNoIG1pZ2h0IHVzZSBpdHMgY3VzdG9tZXIgZGF0YWJhc2UgYXMgdGhlIHNhbXBsaW5nIGZyYW1lIHRvIHNlbGVjdCBwYXJ0aWNpcGFudHMgZm9yIGEgc3VydmV5Lg0KKiBJbiBlY29sb2dpY2FsIHN0dWRpZXMsIGEgbWFwIG9mIGEgcmVnaW9uIGNhbiBzZXJ2ZSBhcyB0aGUgc2FtcGxpbmcgZnJhbWUgdG8gc2VsZWN0IHNwZWNpZmljIGxvY2F0aW9ucyBvciBwbG90cyBmb3IgZGF0YSBjb2xsZWN0aW9uLg0KDQoNCiAgDQoqKlNhbXBsZSBTdXJ2ZXkqKjogIEFuIGludmVzdGlnYXRpb24gaW4gd2hpY2ggZWxhYm9yYXRlIGluZm9ybWF0aW9uIGlzIGNvbGxlY3RlZCBvbiBhIHNhbXBsZSBiYXNpcyBpcyBrbm93biBhcyBhIHNhbXBsZSBzdXJ2ZXkuIA0KICANCioqU3RhdGlzdGljKio6IENoYXJhY3RlcmlzdGljcyBvZiB0aGUgc2FtcGxlLiBGb3IgZXhhbXBsZSwgc2FtcGxlIE1lYW4sIHByb3BvcnRpb24sIGV0Yy4gDQogIA0KKipQYXJhbWV0ZXIqKjogQ2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBwb3B1bGF0aW9uLiBGb3IgZXhhbXBsZSwgcG9wdWxhdGlvbiBNZWFuLCBwcm9wb3J0aW9uLCBldGMuIA0KICANCioqVGFyZ2V0IFBvcHVsYXRpb24qKjogIEEgdGFyZ2V0IHBvcHVsYXRpb24gaXMgdGhlIGVudGlyZSBncm91cCBhYm91dCB3aGljaCBpbmZvcm1hdGlvbiBpcyBkZXNpcmVkIGFuZCBjb25jbHVzaW9ucyBhcmUgbWFkZS4gDQogIA0KKipTYW1wbGVkIFBvcHVsYXRpb24qKjogIFRoZSBwb3B1bGF0aW9uLCB0aGF0IHdlIGFjdHVhbGx5IHNhbXBsZSwgaXMgdGhlIA0Kc2FtcGxlZCBwb3B1bGF0aW9uLiBJdCBpcyBhbHNvIGNhbGxlZCB0aGUgc3VydmV5IHBvcHVsYXRpb24uDQoNCiMgUHVycGxlcyBvZiBTYW1wbGluZw0KVGhlIGJhc2ljIHB1cnBvc2Ugb2Ygc2FtcGxpbmcgaXMgdG8gcHJvdmlkZSBhbiBlc3RpbWF0ZSBvZiB0aGUgcG9wdWxhdGlvbiBwYXJhbWV0ZXIgYW5kIHRvIHRlc3QgdGhlIGh5cG90aGVzaXMuIFRoZSBhZHZhbnRhZ2VzIG9mIHNhbXBsaW5nIGFyZSAtIA0KIA0KKglTYXZlIHRpbWUgYW5kIG1vbmV5LiAgDQoNCioJRW5hYmxlIGNvbGxlY3Rpb24gb2YgY29tcHJlaGVuc2l2ZSBkYXRhLiAgDQogDQoqCUVuYWJsZSBtb3JlIGFjY3VyYXRlIG1lYXN1cmVtZW50IGFzIGl0IGlzIGNvbmR1Y3RlZCBieSB0cmFpbmVkIGFuZCBleHBlcmllbmNlZCBpbnZlc3RpZ2F0b3JzLiAgDQogDQoqIFNhbXBsaW5nIHJlbWFpbnMgdGhlIG9ubHkgd2F5IHdoZW4gdGhlIHBvcHVsYXRpb24gY29udGFpbnMgaW5maW5pdGVseSBtYW55IG1lbWJlcnMuIA0KDQoqCUluIGNlcnRhaW4gc2l0dWF0aW9ucywgc2FtcGxpbmcgaXMgdGhlIG9ubHkgd2F5IG9mIGRhdGEgY29sbGVjdGlvbi4gRm9yIGV4YW1wbGUsIGluIHRlc3RpbmcgdGhlIHBhdGhvbG9naWNhbCBzdGF0dXMgb2YgYmxvb2QsIGJvaWxpbmcgc3RhdHVzIG9mIHJpY2UsIGV0Yy4gDQogDQoqCUl0IHByb3ZpZGVzIGEgdmFsaWQgZXN0aW1hdGlvbiBvZiBzYW1wbGluZyBlcnJvci4NCg0KIyBTYW1wbGluZyBQcm9jZXNzDQoNClRoZSBzYW1wbGluZyBwcm9jZXNzIGNvbXByaXNlcyBzZXZlcmFsIHN0YWdlcw0KDQoxLiBEZWZpbmUgdGhlIHBvcHVsYXRpb24uIA0KDQoyLiBTcGVjaWZ5aW5nIHRoZSBzYW1wbGluZyBmcmFtZS4gDQoNCjMuIFNwZWNpZnlpbmcgdGhlIHNhbXBsaW5nIHVuaXQuIA0KDQo0LiBTZWxlY3Rpb24gb2YgdGhlIHNhbXBsaW5nIG1ldGhvZC4gDQoNCjUuIERldGVybWluYXRpb24gb2Ygc2FtcGxlIHNpemUuIA0KDQo2LiBTcGVjaWZ5IHRoZSBzYW1wbGluZyBwbGFuLiANCg0KNy4gU2VsZWN0aW5nIHRoZSBzYW1wbGUuIA0KIA0KIyMgRGVmaW5pbmcgdGhlIFBvcHVsYXRpb24gDQoNClRoZSBwb3B1bGF0aW9uIG11c3QgYmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBlbGVtZW50cywgc2FtcGxpbmcgdW5pdHMsIGV4dGVudCwgYW5kIHRpbWUuIEJlY2F1c2UgdGhlcmUgaXMgdmVyeSByYXJlbHkgZW5vdWdoIHRpbWUgb3IgbW9uZXkgdG8gZ2F0aGVyIGluZm9ybWF0aW9uIGZyb20gZXZlcnlvbmUgb3IgZXZlcnl0aGluZyBpbiBhIHBvcHVsYXRpb24sIHRoZSBnb2FsIGJlY29tZXMgZmluZGluZyBhIHJlcHJlc2VudGF0aXZlIHNhbXBsZSAob3Igc3Vic2V0KSBvZiB0aGF0IHBvcHVsYXRpb24uIA0KIA0KIyMgU3BlY2lmeWluZyBTYW1wbGluZyBGcmFtZQ0KDQpBcyBhIHJlbWVkeSwgd2Ugc2VlayBhIHNhbXBsaW5nIGZyYW1lIHRoYXQgaGFzIHRoZSBwcm9wZXJ0eSB0aGF0IHdlIGNhbiBpZGVudGlmeSBldmVyeSBzaW5nbGUgZWxlbWVudCBhbmQgaW5jbHVkZSBhbnkgaW4gb3VyIHNhbXBsZS4gVGhlIG1vc3Qgc3RyYWlnaHRmb3J3YXJkIHR5cGUgb2YgZnJhbWUgaXMgYSBsaXN0IG9mIGVsZW1lbnRzIG9mIHRoZSBwb3B1bGF0aW9uICAocHJlZmVyYWJseSB0aGUgZW50aXJlIHBvcHVsYXRpb24pIHdpdGggYXBwcm9wcmlhdGUgY29udGFjdCBpbmZvcm1hdGlvbi4NCg0KQSBzYW1wbGluZyBmcmFtZSBtYXkgYmUgYSB0ZWxlcGhvbmUgYm9vaywgYSBjaXR5IGRpcmVjdG9yeSwgYW4gZW1wbG95ZWUgcm9zdGVyLCBhIGxpc3Rpbmcgb2YgYWxsIHN0dWRlbnRzIGF0dGVuZGluZyBhIHVuaXZlcnNpdHksIG9yIGEgbGlzdCBvZiBhbGwgcG9zc2libGUgcGhvbmUgbnVtYmVycy4gDQogDQojIyBTcGVjaWZ5aW5nIFNhbXBsaW5nIFVuaXQNCg0KQSBzYW1wbGluZyB1bml0IGlzIGEgYmFzaWMgdW5pdCB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGVsZW1lbnQgb3IgYSBncm91cCBvZiBlbGVtZW50cyBvZiB0aGUgcG9wdWxhdGlvbiB0byBiZSBzYW1wbGVkLiBUaGUgc2FtcGxpbmcgdW5pdCBzZWxlY3RlZCBpcyBvZnRlbiBkZXBlbmRlbnQgdXBvbiB0aGUgc2FtcGxpbmcgZnJhbWUuIElmIGEgcmVsYXRpdmVseSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUgbGlzdGluZyBvZiBlbGVtZW50cyBpcyBhdmFpbGFibGUgKGUuZy4gcmVnaXN0ZXIgb2YgcHVyY2hhc2luZyBhZ2VudHMpIG9uZSBtYXkgd2VsbCB3YW50IHRvIHNhbXBsZSB0aGVtIGRpcmVjdGx5LiBJZiBubyBzdWNoIHJlZ2lzdGVyIGlzIGF2YWlsYWJsZSwgb25lIG1heSBuZWVkIHRvIHNhbXBsZSBjb21wYW5pZXMgYXMgdGhlIGJhc2ljIHNhbXBsaW5nIHVuaXQuICANCiAgDQojIyBTZWxlY3RpbmcgU2FtcGxpbmcgTWV0aG9kDQoNClRoZSBzYW1wbGluZyBtZXRob2Qgb3V0bGluZXMgdGhlIHdheSBpbiB3aGljaCB0aGUgc2FtcGxlIHVuaXRzIGFyZSB0byBiZSANCnNlbGVjdGVkLiBUaGUgY2hvaWNlIG9mIHRoZSBzYW1wbGluZyBtZXRob2QgaXMgaW5mbHVlbmNlZCBieSB0aGUgb2JqZWN0aXZlcyBvZiB0aGUgcmVzZWFyY2gsIGF2YWlsYWJpbGl0eSBvZiBmaW5hbmNpYWwgcmVzb3VyY2VzLCB0aW1lIGNvbnN0cmFpbnRzLCBhbmQgdGhlIG5hdHVyZSBvZiB0aGUgcHJvYmxlbSB0byBiZSBpbnZlc3RpZ2F0ZWQuIEFsbCBzYW1wbGluZyBtZXRob2RzIGNhbiBiZSBncm91cGVkIHVuZGVyIHR3byBkaXN0aW5jdCBoZWFkcywgdGhhdCBpcywgcHJvYmFiaWxpdHkgYW5kIG5vbi1wcm9iYWJpbGl0eSBzYW1wbGluZy4gDQogDQojIyBEZXRlcm1pbmluZyBTYW1wbGUgU2l6ZSANCg0KVGhlIHNhbXBsZSBzaXplIGNhbGN1bGF0aW9uIGRlcGVuZHMgcHJpbWFyaWx5IG9uIHRoZSB0eXBlIG9mIHNhbXBsaW5nIGRlc2lnbiB1c2VkLiBIb3dldmVyLCBmb3IgYWxsIHNhbXBsaW5nIGRlc2lnbnMsIHRoZSBlc3RpbWF0ZXMgZm9yIHRoZSBleHBlY3RlZCBzYW1wbGUgY2hhcmFjdGVyaXN0aWNzIChlLmcuIG1lYW4sIHByb3BvcnRpb24sIG9yIHRvdGFsKSBkZXNpcmVkIGxldmVsIG9mIGNlcnRhaW50eSwgYW5kIHRoZSBsZXZlbCBvZiBwcmVjaXNpb24gbXVzdCBiZSBjbGVhcmx5IHNwZWNpZmllZCBpbiBhZHZhbmNlLiBUaGUgc3RhdGVtZW50IG9mIHRoZSBwcmVjaXNpb24gZGVzaXJlZCBtaWdodCBiZSBtYWRlIGJ5IGdpdmluZyB0aGUgYW1vdW50IG9mIGVycm9yIHRoYXQgd2UgYXJlIHdpbGxpbmcgdG8gdG9sZXJhdGUgaW4gdGhlIHJlc3VsdGluZyBlc3RpbWF0ZXMuIENvbW1vbiBsZXZlbHMgb2YgcHJlY2lzaW9uIGFyZSA1JSBhbmQgMTAlLiANCiANCiMjIFNwZWNpZnlpbmcgU2FtcGxpbmcgUGxhbg0KDQpJbiB0aGlzIHN0ZXAsIHRoZSBzcGVjaWZpY2F0aW9ucyBhbmQgZGVjaXNpb25zIHJlZ2FyZGluZyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MgYXJlIG91dGxpbmVkLiBBcyB0aGUgaW50ZXJ2aWV3ZXJzIGFuZCB0aGVpciBjby13b3JrZXJzIHdpbGwgYmUgb24gZmllbGQgZHV0eSBtb3N0IG9mIHRoZSB0aW1lLCBhIHByb3BlciBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzYW1wbGluZyBwbGFucyB3b3VsZCBtYWtlIHRoZWlyIHdvcmsgZWFzeSwgYW5kIHRoZXkgd291bGQgbm90IGhhdmUgdG8gcmV2ZXJ0IHRvIG9wZXJhdGlvbmFsIHByb2JsZW1zLg0KDQojIyBTZWxlY3RpbmcgdGhlIFNhbXBsZQ0KDQpUaGUgZmluYWwgc3RlcCBpbiB0aGUgc2FtcGxpbmcgcHJvY2VzcyBpcyB0aGUgYWN0dWFsIHNlbGVjdGlvbiBvZiB0aGUgc2FtcGxlIGVsZW1lbnRzLiBUaGlzIHJlcXVpcmVzIGEgc3Vic3RhbnRpYWwgYW1vdW50IG9mIG9mZmljZSBhbmQgZmllbGR3b3JrLCBwYXJ0aWN1bGFybHkgaWYgcGVyc29uYWwgaW50ZXJ2aWV3cyBhcmUgaW52b2x2ZWQuIA0KDQojIFNhbXBsaW5nIE1ldGhvZHMNCg0KVGhlcmUgYXJlIHR3byBiYXNpYyBhcHByb2FjaGVzIHRvIHNhbXBsaW5nOiBQcm9iYWJpbGl0eSBTYW1wbGluZyBhbmQgTm9uLXByb2JhYmlsaXR5IFNhbXBsaW5nLiBXZSBvbmx5IGZvY3VzIG9uIG1ldGhvZHMgb2YgcHJvYmFiaWxpdHkgc2FtcGxpbmcgcGxhbnMuICANCg0KUHJvYmFiaWxpdHkgc2FtcGxpbmcgaXMgYWxzbyBrbm93biBhcyByYW5kb20gc2FtcGxpbmcgb3IgY2hhbmNlIHNhbXBsaW5nLiBJbiB0aGlzLCAqc2FtcGxlIGlzIHRha2VuIGluIHN1Y2ggYSBtYW5uZXIgdGhhdCBlYWNoIGFuZCBldmVyeSB1bml0IG9mIHRoZSBwb3B1bGF0aW9uIGhhcyBhbiBlcXVhbCBhbmQgcG9zaXRpdmUgY2hhbmNlIG9mIGJlaW5nIHNlbGVjdGVkKi4gSW4gdGhpcyB3YXksIGl0IGlzIGVuc3VyZWQgdGhhdCB0aGUgc2FtcGxlIHdvdWxkIHRydWx5IHJlcHJlc2VudCB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uLiBQcm9iYWJpbGl0eSBzYW1wbGluZyBjYW4gYmUgYWNoaWV2ZWQgYnkgcmFuZG9tIHNlbGVjdGlvbiBvZiB0aGUgc2FtcGxlIGFtb25nIGFsbCB0aGUgdW5pdHMgb2YgdGhlIHBvcHVsYXRpb24uIE1ham9yIHJhbmRvbSBzYW1wbGluZyBwcm9jZWR1cmVzIGFyZSAgIA0KDQoqCVNpbXBsZSBSYW5kb20gU2FtcGxlICAgDQoqCVN5c3RlbWF0aWMgUmFuZG9tIFNhbXBsZSAgIA0KKglTdHJhdGlmaWVkIFJhbmRvbSBTYW1wbGUsIGFuZCAgIA0KKglDbHVzdGVyLyBNdWx0aXN0YWdlIFNhbXBsZS4gIA0KDQojIyBTaW1wbGUgUmFuZG9tIFNhbXBsZQ0KIA0KSW4gYSBzaW1wbGUgcmFuZG9tIHZhcmlhYmxlIChTUlMpLCBlYWNoIG1lbWJlciBvZiB0aGUgcG9wdWxhdGlvbiBpcyBudW1iZXJlZC4gVGhlbiwgYSBnaXZlbiBzaXplIG9mIHRoZSBzYW1wbGUgaXMgZHJhd24gd2l0aCB0aGUgaGVscCBvZiBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIChjaGFydCkuIEl0IGlzIHJlbGF0aXZlbHkgc2ltcGxlIHRvIGltcGxlbWVudCBidXQgdGhlIGZpbmFsIHNhbXBsZSBtYXkgbWlzcyBvdXQgb24gc21hbGwgc3ViZ3JvdXBzLiAgDQoNCiAqQWR2YW50YWdlcyo6IFRoZSBzYW1wbGUgd2lsbCBiZSBmcmVlIGZyb20gQmlhcyAoaS5lLiBpdOKAmXMgcmFuZG9tISkuDQogDQoqRGlzYWR2YW50YWdlcyo6IFNSUyBpcyBkaWZmaWN1bHQgdG8gb2J0YWluIGR1ZSB0byBpdHMgcmFuZG9tbmVzcy4gSWYgdGhlIHNhbXBsZSBzaXplIGlzIHNtYWxsLCBpdCBjb3VsZCBnZW5lcmF0ZSBhIHJlc3VsdCB0aGF0IGlzIGNvbXBsZXRlbHkgb2ZmIHRoZSB0cnVlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgYW5kIGlzIGFsc28gZGlmZmljdWx0IHRvIHNwb3QuIEluY3JlYXNpbmcgdGhlIHNhbXBsZSBzaXplIGlzIHRoZSBiZXN0IHdheSB0byBlcmFkaWNhdGUgdGhpcyBwcm9ibGVtLiAgDQoNCiMjIFN5c3RlbWF0aWMgIFJhbmRvbSAgU2FtcGxlICANCg0KSXQgYWxzbyByZXF1aXJlcyBudW1iZXJpbmcgdGhlIGVudGlyZSBwb3B1bGF0aW9uLiBUaGVuIGV2ZXJ5IG50aCBudW1iZXIgKHNheSBldmVyeSA1dGggb3IgMTB0aCBudW1iZXIsIGFzIHRoZSBjYXNlIG1heSBiZSkgaXMgc2VsZWN0ZWQgdG8gY29uc3RpdHV0ZSB0aGUgc2FtcGxlLiBJdCBpcyBlYXNpZXIgYW5kIG1vcmUgbGlrZWx5IHRvIHJlcHJlc2VudCBkaWZmZXJlbnQgc3ViZ3JvdXBzLiAgDQoNCiAqQWR2YW50YWdlcyo6IENhbiBlbGltaW5hdGUgb3RoZXIgc291cmNlcyBvZiBiaWFzLiANCiANCipEaXNhZHZhbnRhZ2VzKjogVGhpcyBjYW4gaW50cm9kdWNlIGJpYXMgd2hlcmUgdGhlIHBhdHRlcm4gdXNlZCBmb3IgdGhlIHNhbXBsZXMgY29pbmNpZGVzIHdpdGggYSBwYXR0ZXJuIGluIHRoZSBwb3B1bGF0aW9uLiANCg0KIyMgU3RyYXRpZmllZCBSYW5kb20gU2FtcGxlIA0KDQpBdCBmaXJzdCwgdGhlIHBvcHVsYXRpb24gaXMgZGl2aWRlZCBpbnRvIGdyb3VwcyBvciBzdHJhdGEgZWFjaCBvZiB3aGljaCBpcyBob21vZ2VuZW91cyB3aXRoIHJlc3BlY3QgdG8gdGhlIGdpdmVuIGNoYXJhY3RlcmlzdGljIGZlYXR1cmUuICBGcm9tIGVhY2ggc3RyYXR1bSwgdGhlbiwgc2FtcGxlcyBhcmUgZHJhd24gYXQgcmFuZG9tLiBUaGlzIGlzIGNhbGxlZCBzdHJhdGlmaWVkIHJhbmRvbSBzYW1wbGluZy4gRm9yIGV4YW1wbGUsIHdpdGggcmVzcGVjdCB0byB0aGUgbGV2ZWwgb2Ygc29jaW8tZWNvbm9taWMgc3RhdHVzLCB0aGUgcG9wdWxhdGlvbiBtYXkgZmlyc3QgYmUgZ3JvdXBlZCBpbiBzdWNoIHN0cmF0YSBhcyBoaWdoLCBtaWRkbGUsIGxvdywgYW5kIHZlcnkgbG93IHNvY2lvLWVjb25vbWljIGxldmVscyBhcyBwZXIgcHJlLWRldGVybWluZWQgY3JpdGVyaWEsIGFuZCBhIHJhbmRvbSBzYW1wbGUgZHJhd24gZnJvbSBlYWNoIGdyb3VwLg0KDQogVGhlIHNhbXBsZSBzaXplIGZvciBlYWNoIHN1Yi1ncm91cCBjYW4gYmUgZml4ZWQgdG8gZ2V0IGEgcmVwcmVzZW50YXRpdmUgc2FtcGxlLiBUaGlzIHdheSwgaXQgaXMgcG9zc2libGUgdGhhdCBkaWZmZXJlbnQgY2F0ZWdvcmllcyBpbiB0aGUgcG9wdWxhdGlvbiBhcmUgZmFpcmx5IHJlcHJlc2VudGVkIGluIHRoZSBzYW1wbGUsICB3aGljaCBjb3VsZCBoYXZlIGJlZW4gbGVmdCBvdXQgb3RoZXJ3aXNlIGluIGEgc2ltcGxlIHJhbmRvbSBzYW1wbGUuIA0KIA0KICpBZHZhbnRhZ2VzKjogICBZaWVsZHMgbW9yZSBhY2N1cmF0ZSByZXN1bHRzIHRoYW4gc2ltcGxlIHJhbmRvbSBzYW1wbGluZy4gIA0KQ2FuIHNob3cgZGlmZmVyZW50IHRlbmRlbmNpZXMgd2l0aGluIGVhY2ggY2F0ZWdvcnkgKGUuZy4gbWVuIGFuZCB3b21lbikuICANCipEaXNhZHZhbnRhZ2VzKjogICBOb3RoaW5nIG1ham9yLCBoZW5jZSBpdOKAmXMgdXNlZCBhIGxvdC4gIA0KIA0KQXMgd2l0aCBzdHJhdGlmaWVkIHNhbXBsZXMsIHRoZSBwb3B1bGF0aW9uIGlzIGJyb2tlbiBkb3duIGludG8gZGlmZmVyZW50IGNhdGVnb3JpZXMuIEhvd2V2ZXIsIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgb2YgZWFjaCBjYXRlZ29yeSBkb2VzIG5vdCByZWZsZWN0IHRoZSBwb3B1bGF0aW9uIGFzIGEgd2hvbGUuIFRoZSBRdW90YSBzYW1wbGluZyB0ZWNobmlxdWUgY2FuIGJlICB1c2VkIHdoZXJlIGFuIHVucmVwcmVzZW50YXRpdmUgc2FtcGxlIGlzIGRlc2lyYWJsZSAoZS5nLiB5b3UgbWlnaHQgd2FudCAgdG8gaW50ZXJ2aWV3IG1vcmUgY2hpbGRyZW4gdGhhbiBhZHVsdHMgZm9yIGEgc3VydmV5IG9uIGNvbXB1dGVyIGdhbWVzKSwgIG9yIHdoZXJlIGl0IHdvdWxkIGJlIHRvbyBkaWZmaWN1bHQgdG8gdW5kZXJ0YWtlIGEgc3RyYXRpZmllZCBzYW1wbGUNCg0KIyMgQ2x1c3Rlci8gTXVsdGlzdGFnZSBTYW1wbGUNCg0KSW4gc29tZSBjYXNlcywgdGhlIHNlbGVjdGlvbiBvZiB1bml0cyBtYXkgcGFzcyB0aHJvdWdoIHZhcmlvdXMgc3RhZ2VzLCBiZWZvcmUgeW91IGZpbmFsbHkgcmVhY2ggeW91ciBzYW1wbGUgb2Ygc3R1ZHkuIEZvciB0aGlzLCBhIFN0YXRlLCBmb3IgZXhhbXBsZSwgbWF5IGJlIGRpdmlkZWQgaW50byBkaXN0cmljdHMsIGRpc3RyaWN0cyBpbnRvIGJsb2NrcywgYmxvY2tzIGludG8gdmlsbGFnZXMsIGFuZCB2aWxsYWdlcyBpbnRvIGlkZW50aWZpYWJsZSBncm91cHMgb2YgcGVvcGxlLCBhbmQgdGhlbiB0aGUgcmFuZG9tIG9yIHF1b3RhIHNhbXBsZSBmcm9tIGVhY2ggZ3JvdXAuIA0KDQpGb3IgZXhhbXBsZSwgdGFraW5nIGEgcmFuZG9tIHNlbGVjdGlvbiBvZiAzIG91dCBvZiAxNSBkaXN0cmljdHMgb2YgYSBTdGF0ZSwgNiBibG9ja3MgZnJvbSBlYWNoIHNlbGVjdGVkIGRpc3RyaWN0LCAxMCB2aWxsYWdlcyBmcm9tIGVhY2ggc2VsZWN0ZWQgYmxvY2ssIGFuZCAyMCBob3VzZWhvbGRzIGZyb20gZWFjaCBzZWxlY3RlZCB2aWxsYWdlLCB0b3RhbGluZyAzNjAwIHJlc3BvbmRlbnRzLiBUaGlzIGRlc2lnbiBpcyB1c2VkIGZvciBsYXJnZS1zY2FsZSBzdXJ2ZXlzIHNwcmVhZCBvdmVyIGxhcmdlIGFyZWFzLg0KDQpUaGUgYWR2YW50YWdlIGlzIHRoYXQgaXQgbmVlZHMgYSBkZXRhaWxlZCBzYW1wbGluZyBmcmFtZSBmb3Igc2VsZWN0ZWQgY2x1c3RlcnMgb25seSByYXRoZXIgdGhhbiBmb3IgdGhlIGVudGlyZSB0YXJnZXQgYXJlYS4gVGhlcmUgYXJlIHNhdmluZ3MgaW4gdHJhdmVsIGNvc3RzIGFuZCB0aW1lIGFzIHdlbGwuIA0KDQpIb3dldmVyLCB0aGVyZSBpcyBhIHJpc2sgb2YgbWlzc2luZyBpbXBvcnRhbnQgc3ViLWdyb3VwcyBhbmQgbm90IGhhdmluZyBhIGNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YXJnZXQgcG9wdWxhdGlvbi4gDQoNCipBZHZhbnRhZ2VzKjogIExlc3MgZXhwZW5zaXZlIGFuZCB0aW1lLWNvbnN1bWluZyB0aGFuIGEgZnVsbHkgcmFuZG9tIHNhbXBsZS4gQ2FuIHNob3cg4oCYcmVnaW9uYWzigJkgdmFyaWF0aW9ucy4gIA0KDQoqRGlzYWR2YW50YWdlcyo6ICBOb3QgYSBnZW51aW5lIHJhbmRvbSBzYW1wbGUuIExpa2VseSB0byB5aWVsZCBhIGJpYXNlZCByZXN1bHQgKGVzcGVjaWFsbHkgaWYgb25seSBhIGZldyBjbHVzdGVycyBhcmUgc2FtcGxlZCkuIA0KDQojIFNhbXBsaW5nIEVycm9yIGFuZCBTdXJ2ZXkgQmlhcw0KDQpTdXJ2ZXkgcmVzdWx0cyBhcmUgdHlwaWNhbGx5IHN1YmplY3QgdG8gc29tZSBlcnJvci4gVG90YWwgZXJyb3JzIGNhbiBiZSBjbGFzc2lmaWVkIGludG8gc2FtcGxpbmcgZXJyb3JzIGFuZCBub24tc2FtcGxpbmcgZXJyb3JzLiBUaGUgdGVybSDigJhlcnJvcuKAmSBoZXJlIGluY2x1ZGVzIHN5c3RlbWF0aWMgYmlhc2VzIGFzIHdlbGwgYXMgcmFuZG9tIGVycm9ycy4gDQoNCiMjIFNhbXBsaW5nIGVycm9ycyBhbmQgYmlhc2VzOiANCg0KU2FtcGxpbmcgZXJyb3JzIGFuZCBiaWFzZXMgYXJlIGluZHVjZWQgYnkgdGhlIHNhbXBsZSBkZXNpZ24uICBUaGV5IGluY2x1ZGUNCg0KKiBTZWxlY3Rpb24gYmlhczogV2hlbiB0aGUgdHJ1ZSBzZWxlY3Rpb24gcHJvYmFiaWxpdGllcyBkaWZmZXIgZnJvbSB0aG9zZSBhc3N1bWVkIGluIGNhbGN1bGF0aW5nIHRoZSByZXN1bHRzLiANCiANCioJUmFuZG9tIHNhbXBsaW5nIGVycm9yOiBSYW5kb20gdmFyaWF0aW9uIGluIHRoZSByZXN1bHRzIGR1ZSB0byB0aGUgZWxlbWVudHMgaW4gdGhlIHNhbXBsZSBiZWluZyBzZWxlY3RlZCBhdCByYW5kb20uIA0KDQoqKk5vbi1zYW1wbGluZyBlcnJvcioqICBOb24tc2FtcGxpbmcgZXJyb3JzIGFyZSBvdGhlciBlcnJvcnMgdGhhdCBjYW4gaW1wYWN0IHRoZSBmaW5hbCBzdXJ2ZXkgZXN0aW1hdGVzLCBjYXVzZWQgYnkgcHJvYmxlbXMgaW4gZGF0YSBjb2xsZWN0aW9uLCBwcm9jZXNzaW5nLCBvciBzYW1wbGUgZGVzaWduLiBUaGV5IGluY2x1ZGUNCiANCiAqT3Zlci1jb3ZlcmFnZSo6IEluY2x1c2lvbiBvZiBkYXRhIGZyb20gb3V0c2lkZSBvZiB0aGUgcG9wdWxhdGlvbi4gDQogDQogKlVuZGVyLWNvdmVyYWdlKjogT2NjdXJzIHdoZW4gc29tZSBtZW1iZXJzIG9mIHRoZSBwb3B1bGF0aW9uIGFyZSBpbmFkZXF1YXRlbHkgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbXBsZS4gVW5kZXItY292ZXJhZ2UgaXMgb2Z0ZW4gYSBwcm9ibGVtIHdpdGggY29udmVuaWVuY2Ugc2FtcGxlcy4gDQoNCioqTWVhc3VyZW1lbnQgZXJyb3IqKjogV2hlbiByZXNwb25kZW50cyBtaXN1bmRlcnN0YW5kIGEgcXVlc3Rpb24gb3IgZmluZCBpdCBkaWZmaWN1bHQgdG8gYW5zd2VyLg0KDQoqKlByb2Nlc3NpbmcgZXJyb3IqKjogTWlzdGFrZXMgaW4gZGF0YSBjb2RpbmcuDQoNCioqTm9uLXJlc3BvbnNlKio6IEZhaWx1cmUgdG8gb2J0YWluIGNvbXBsZXRlIGRhdGEgZnJvbSBhbGwgc2VsZWN0ZWQgaW5kaXZpZHVhbHMuIA0KDQpBZnRlciBzYW1wbGluZywgYSByZXZpZXcgc2hvdWxkIGJlIGhlbGQgb2YgdGhlIGV4YWN0IHByb2Nlc3MgZm9sbG93ZWQgaW4gc2FtcGxpbmcsIHJhdGhlciB0aGFuIHRoYXQgaW50ZW5kZWQsIGluIG9yZGVyIHRvIHN0dWR5IGFueSBlZmZlY3RzIHRoYXQgYW55IGRpdmVyZ2VuY2VzIG1pZ2h0IGhhdmUgb24gc3Vic2VxdWVudCBhbmFseXNpcy4gDQogDQojIyBCaWFzIER1ZSB0byBNZWFzdXJlbWVudCBFcnJvciANCg0KQSBwb29yIG1lYXN1cmVtZW50IHByb2Nlc3MgY2FuIGFsc28gbGVhZCB0byBiaWFzLiBJbiBzdXJ2ZXkgcmVzZWFyY2gsIHRoZSBtZWFzdXJlbWVudCBwcm9jZXNzIGluY2x1ZGVzIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgc3VydmV5IGlzIGNvbmR1Y3RlZCwgdGhlIHdheSB0aGF0IHF1ZXN0aW9ucyBhcmUgYXNrZWQsIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN1cnZleSByZXNwb25kZW50LiANCg0KKipSZXNwb25zZSBiaWFzKiogcmVmZXJzIHRvIHRoZSBiaWFzIHRoYXQgcmVzdWx0cyBmcm9tIHByb2JsZW1zIGluIHRoZSBtZWFzdXJlbWVudCBwcm9jZXNzLiBGb3IgZXhhbXBsZSwgYSBzYXRpc2ZhY3Rpb24gc3VydmV5IG1heSBhc2sgdGhlIHJlc3BvbmRlbnQgdG8gaW5kaWNhdGUgd2hlcmUgc2hlIGlzIHNhdGlzZmllZCwgZGlzc2F0aXNmaWVkLCBvciB2ZXJ5IGRpc3NhdGlzZmllZC4gQnkgZ2l2aW5nIHRoZSByZXNwb25kZW50IG9uZSByZXNwb25zZSBvcHRpb24gdG8gZXhwcmVzcyBzYXRpc2ZhY3Rpb24gYW5kIHR3byByZXNwb25zZSBvcHRpb25zIHRvIGV4cHJlc3MgZGlzc2F0aXNmYWN0aW9uLCB0aGlzIHN1cnZleSBxdWVzdGlvbiBpcyBiaWFzZWQgdG93YXJkIGdldHRpbmcgYSBkaXNzYXRpc2ZpZWQgcmVzcG9uc2UuIFRoaXMgYmVjb21lcyBtb3JlIHNlcmlvdXMgaWYgdGhlIHN1cnZleSByZXNwb25zZSBpcyBzb2NpYWxseSBzZW5zaXRpdmUuDQoNCiBJbmNyZWFzaW5nIHRoZSBzYW1wbGUgc2l6ZSB0ZW5kcyB0byByZWR1Y2UgdGhlIHNhbXBsaW5nIGVycm9yOyB0aGF0IGlzLCBpdCBtYWtlcyB0aGUgc2FtcGxlIHN0YXRpc3RpYyBsZXNzIHZhcmlhYmxlLiBIb3dldmVyLCBpbmNyZWFzaW5nIHRoZSBzYW1wbGUgc2l6ZSBkb2VzIG5vdCBhZmZlY3Qgc3VydmV5IGJpYXMuIEEgbGFyZ2Ugc2FtcGxlIHNpemUgY2Fubm90IGNvcnJlY3QgdGhlIG1ldGhvZG9sb2dpY2FsIHByb2JsZW1zICh1bmRlci1jb3ZlcmFnZSwgbm9uLXJlc3BvbnNlIGJpYXMsIGV0Yy4pIHRoYXQgcHJvZHVjZSBzdXJ2ZXkgYmlhcy4gDQoNCg0KIyBTYW1wbGUgU2l6ZSBEZXRlcm1pbmF0aW9uDQoNCkRldGVybWluYXRpb24gb2Ygc2FtcGxlIHNpemUgaXMgcHJvYmFibHkgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBwaGFzZXMgaW4gdGhlIHNhbXBsaW5nIHByb2Nlc3MuIA0KDQpGcm9tIGEgdGhlb3JldGljYWwgcGVyc3BlY3RpdmUsIHRoZSBsYXJnZXIgdGhlIHNhbXBsZSBzaXplLCB0aGUgYmV0dGVyIHRoZSBlc3RpbWF0aW9uLiBIb3dldmVyLCBhcyB0aGUgc2FtcGxlIHNpemUgcmVhY2hlcyBhIGNlcnRhaW4gc2l6ZSwgdGhlIGltcGFjdCBvbiB0aGUgZXN0aW1hdGUgd2lsbCBiZWNvbWUgbmVnbGlnaWJsZS4gT24gdGhlIG90aGVyIGhhbmQsIHNhbXBsaW5nIGNhbiBiZSBleHBlbnNpdmUuIElmIHRoZSBzYW1wbGluZyBwcmVjaXNpb24gaXMgcHJlLXNwZWNpZmllZCwgd2Ugb25seSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHNpemUgdG8gbWVldCB0aGUgcHJlY2lzaW9uIHdpdGhvdXQgd2FzdGluZyByZXNvdXJjZXMuDQoNCkZvciBleGFtcGxlLCBpZiB0aGUgZXN0aW1hdGUgb2YgdGhlICoqbWVhbioqIG9mIHRoZSBwb3B1bGF0aW9uIGlzIHJlcXVpcmVkIHRvIGJlIHdpdGhpbiAkXHBtIDMkIG9mIHRoZSB0cnVlIG1lYW4gd2l0aCA5NSUgY29uZmlkZW5jZS4gVGhhdCBpcywgaWYgdGhlIHRydWUgbWVhbiBpcyAxMDAsIHRoZSBlc3RpbWF0ZWQgdmFsdWUgb2YgdGhlIG1lYW4gd2lsbCBiZSBubyBsZXNzIHRoYW4gOTcgYW5kIG5vIG1vcmUgdGhhbiAxMDMuIEluIG90aGVyIHdvcmRzLCBhbGwgdGhpcyBtZWFucyB0aGF0IHRoZSBhY2NlcHRhYmxlIGVycm9yLCBlLCBpcyBlcXVhbCB0byAzLiANCg0KVGhlIG1ldGhvZHMgb2YgZGV0ZXJtaW5pbmcgdGhlIHNhbXBsZSBzaXplIGFyZSBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljIGVzdGltYXRpb24gdGFza3Mgc3VjaCBhcyBwb3B1bGF0aW9uIG1lYW5zLCB2YXJpYW5jZSwgY29ycmVsYXRpb25zLCBldGMuICBJbiBvdGhlciB3b3JkcywgdGhlcmUgaXMgbm8gc2luZ2xlIGFsZ29yaXRobSB0aGF0IGZpdHMgYWxsIHNhbXBsZSBzaXplIGRldGVybWluYXRpb24gcHJvYmxlbXMgYmVjYXVzZSBpdCBpcyBvbmUgdHlwZSBvZiBzdGF0aXN0aWNzIHByb2JsZW0ganVzdCBsaWtlIHRoZSBwcm9ibGVtcyBvZiBzdGF0aXN0aWNhbCBoeXBvdGhlc2lzLiANCg0KDQojIyBQcm9ibGVtcyBvZiBFc3RpbWF0aW5nIE1lYW4gYW5kIFByb3BvcnRpb24NCg0KVGhlIGFib3ZlIGV4YW1wbGUgZXhwbGFpbmVkIHRoZSBpZGVhIG9mIGVzdGltYXRpbmcgdGhlIHBvcHVsYXRpb24gbWVhbiB3aXRoIGEgcHJlLXNwZWNpZmllZCBlc3RpbWF0aW9uIGVycm9yICgkXHBtIDMkKS4gVGhlIGFjY2VwdGFibGUgZXN0aW1hdGlvbiBlcnJvciBpcywgaW4gZmFjdCwgdGhlIG1hcmdpbiBvZiBlcnJvciBpbiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCB3aGljaCBpcyBnaXZlbiBieQ0KDQokJA0KXGJhcnt4fSBccG0gXHRleHR7Q1Z9X3tcYWxwaGEvMn1cZnJhY3tcc2lnbWF9e1xzcXJ0e259fQ0KJCQNCg0Kd2hlcmUgJEUgPSAgXHRleHR7Q1Z9X3tcYWxwaGEvMn1cc2lnbWEvXHNxcnR7bn0kIGlzIHRoZSBtYXJnaW4gZXJyb3IgKGkuZS4sIHByZS1zcGVjaWZpZWQgZXN0aW1hdGlvbiBlcnJvcikuDQoNCkluIG90aGVyIHdvcmRzLCBpZiBlc3RpbWF0aW9uIGVycm9yICRFJCBhbmQgY29uZmlkZW5jZSBsZXZlbCAkMTAwKDEtXGFscGhhKVwlJCBpcyBnaXZlbiwgd2UgY2FuIHRoZW4gc29sdmUgZm9yIHRoZSBkZXNpcmVkIHNhbXBsZSBzaXplICRuJCBieSB0aGUgZm9sbG93aW5nIGZvcm11bGENCg0KJCQNCm4gPSBcbGVmdFsgXGZyYWN7XHNpZ21hfXtcdGV4dHtDVn1fe1xhbHBoYS8yfX1ccmlnaHRdXjINCiQkDQoNClRoZSBmb3JtdWxhIGZvciBkZXRlcm1pbmluZyB0aGUgc2FtcGxlIHNpemUgb2YgZXN0aW1hdGluZyBhIHBvcHVsYXRpb24gcHJvcG9ydGlvbiB3aXRoIGEgZ2l2ZW4gZXN0aW1hdGlvbiBlcnJvciBhbmQgY29uZmlkZW5jZSBsZXZlbCBpcyBnaXZlbiBieQ0KDQokJA0KbiA9IFxsZWZ0WyBcZnJhY3tcc3FydHtcaGF0e3B9KDEtXGhhdHtwfSl9fXtcdGV4dHtDVn1fe1xhbHBoYS8yfX1ccmlnaHRdXjINCiQkDQoNCiMjIEVzdGltYXRpbmcgVmFyaWFuY2UgYW5kIE90aGVyIENoYXJhY3RlcmlzdGljcw0KDQpUaGUgZGVyaXZhdGlvbiBvZiBmb3JtdWxhcyBmb3IgY2FsY3VsYXRpbmcgc2FtcGxlIHNpemUgZm9yIGVzdGltYXRpbmcgdmFyaWFuY2Ugb3Igb3RoZXIgcG9wdWxhdGlvbiBjaGFyYWN0ZXJpc3RpY3MgaXMgbm90IHN0cmFpZ2h0Zm9yd2FyZC4gU2luY2UgdGhpcyBpcyBub3QgdGhlIGZvY3VzIG9mIHRoaXMgY291cnNlLCB3ZSB3aWxsIG5vdCBleHBhbmQgdGhlIGRpc2N1c3Npb24gaW4gYW55IGRpcmVjdGlvbi4gDQoNCiMjIFNhbXBsZSBTaXplIERldGVybWluYXRpb24gYW5kIFBvd2VyIENhbGN1bGF0aW9uDQoNClNhbXBsZSBzaXplIGRldGVybWluYXRpb24gaW4gcG93ZXIgYW5hbHlzaXMgaXMgYW5vdGhlciB2ZXJ5IGltcG9ydGFudCBwcm9jZWR1cmUgaW4gY2xpbmljYWwgc3R1ZGllcy4gSXQgaXMgYSByZXF1aXJlZCBjb21wb25lbnQgaW4gdGhlICpzdGF0aXN0aWNhbCBhbmFseXNpcyBwbGFuKiAoU0FQKSBmb3IgaW50ZXJ2ZW50aW9uIGFuZCBub24taW50ZXJ2ZW50aW9uIG9ic2VydmF0aW9uYWwgc3R1ZGllcy4gV2Ugd2lsbCBhbHNvIG5vdCBleHBhbmQgdGhlIGRpc2N1c3Npb24gZnJvbSB0aGlzIGRpcmVjdGlvbi4NCg0KDQoNCg0K