Introduction
A survey instrument is a structured tool
used to collect data from respondents, typically consisting of a set of
questions. Several concepts are key to understanding the design of
surveys.
A questionnaire is a structured research tool
consisting of a set of written questions designed to collect data from
respondents.
A construct is an abstract concept being
measured (e.g., satisfaction, trust) through single or multi-item
questionnaires.
Operationalization is the process of defining
how to measure a construct. That is, it bridges construct and
questionnaire.
Single-item measure uses one question measuring
a construct. It is used only for simple, unambiguous
constructs.
A Multiple-item measure uses several questions
measuring one construct. It is good for complex or multidimensional
constructs.
A scale is a set of items (questions) designed
to measure a construct, often using a standardized response system
(e.g., Likert scales). It could be either a single (overall rating) or
multiple (multi-dimensional information) scale.
A subscale is a subset of items within a scale
that measures a specific dimension of the construct.

This brief note primarily focuses on the reliability of the survey
instrument a survey. Since discussing the reliability of a survey is
meaningless if it is invalid. So we will also briefly discuss the
validity of a survey instrument.
In other words, for the survey results to be useful, the survey must
demonstrate both reliability and validity.
Validity – This is the extent to which a survey
question measures what it is supposed to
measure.
Reliability – This is the extent to which
repeatedly measuring the
same thing produces the
same result.
Although validity and reliability are viewed as completely separate
ideas, the two are related. We can use the following diagram to
illustrate the relationship.
Next, we briefly describe the types of validity and primarily focus
on the reliability of the survey instrument.
Validity
Before we discuss the validity, we first introduce the concept of
operationalization. According to Wikipedia,
In research design, especially in psychology, social sciences, life
sciences, and physics, operationalization is a process of defining the
measurement of a phenomenon that is not directly measurable, though its
existence is inferred by other phenomena.
Operationalization is the process by which researchers translate
theoretical variables into observable and measurable procedures.
Types of
validity
As mentioned earlier, in survey design, a
construct is the abstract
idea, the underlying theme, or subject matter that one wishes to measure
using survey questions.
There are many different versions of descriptions of different types
of validity. The following are modern descriptions of the validity of
the survey construct.
Content Validity – An operationalization has
content validity when it adequately covers the range of
meanings included in the construct it is intended to measure. When
assessing this, one should also consider the content relevance of each
item and its technical quality.
Substantive Validity considers the strength of
the theoretical rationales for interpreting the survey scores.
Structural Validity is assessed by investigating
the degree to which the operationalization adequately reflects the
dimensionality of the construct to be measured.
Generalizability examines the extent to which
scores generalize across different population groups, different
situations or settings, different periods, and/or other
operationalizations representative of the construct domain.
Improving
Validity
The strategy for improving the validity of survey instruments is to
reduce (or even avoid) bias. The following are
common potential biases in questionnaire design.
Deliberate bias - If the objective of a survey
study is to support a certain cause, the creators of the survey may
deliberately try to influence the results by using questions that are
purposefully worded in a biased manner.
Unintentional bias - One way that this can occur
is when questions are worded in such a way that the meaning is
misinterpreted by a large proportion of the respondents. This can often
happen inadvertently when words have multiple meanings or when words are
interpreted differently than intended.
Social desirability bias - In general,
respondents tend to respond to questions with answers they think will be
viewed favorably by others. This involves both understating
behaviors/opinions that are viewed negatively and overstating
behaviors/opinions that are viewed positively. Careful wording of
questions or utilizing certain randomized response techniques can help
reduce this bias. Here are things that may be misreported:
- Abilities and skills
- Personality
- Religion and spirituality
- Financial earning
- Unlawful behavior
- Other very personal things
Non-Response Bias - occurs where a survey sample
is non-representative of the target population. In these cases, the
opinions shared by those respondents are disproportionate to those of
the larger population. To reduce the risk of this bias occurring, we can
share the survey across a range of platforms and to a diverse group as
possible. E.g. social media, website, via email, etc.
Uninformed response bias - Sometimes,
respondents claim to know something about an issue because they are
embarrassed to admit that they don’t. To avoid this type of bias, be
sure to keep the survey questions clear of technical jargon, and clearly
define any terms that need to be defined.
Complex bias - is the tendency to look at
something easy to understand, or look at it when we are in a state of
confusion, and view it as having many parts that are difficult to
understand. Questions should be worded as simply and clearly as
possible. If technical jargon must be used, it is best to define the
term specifically in the survey. Finally, we should
avoid using double-barreled questions in any
survey.
Reliability
For survey results to be useful, the survey must demonstrate
reliability. The best practice for questionnaire design is to help
maximize the instrument’s reliability.
Based on the definition given earlier, reliability is a quality
measure of the survey instrument. We can use quantitative approaches to
analyze the reliability of the survey. There are several different types
of reliability measures available in literature and practice. We will
introduce some commonly used ones.
Test-Retest
Reliability
We estimate test-retest reliability when we administer the same
questionnaire (or test) to the same set of
subjects on two different occasions. Note that this
approach assumes there is no substantial change in what is being
measured between the two occasions. To maximize the chance that what is
being measured is not changing, one should not let too much time pass
between the test and the retest.
For continuous scale, measures such as Pearson correlation can be
used to assess the strength of reliability. For a categorical scale,
Kappa-related statistics can be used.
Internal Consistency
Reliability
In internal consistency reliability estimation, we use our single
measurement instrument administered to a group of people on one occasion
to estimate reliability. In effect, we judge the reliability of the
instrument by estimating how well the items that reflect the same
construct yield similar results. We are looking at how consistent the
results are for different items for the same construct within the
measure.
Different internal consistency measures can be used. The following
are commonly used in practice.
Average Inter-item
Correlation
The average inter-item correlation uses all of the items on our
instrument that are designed to measure the same construct. We first
compute the correlation between each pair of items. The average
inter-item correlation is simply the average or mean of all these
correlations.
For example, we have six items in the gratitude survey. There are 15
different item pairings (i.e., 15 correlations). We take the average of
all 15 correlation coefficients as illustrated in the following
figure.
Caution: To get truthful information from
respondents, researchers often intentionally reverse the scale. In this
case, we need to calculate the mean absolute correlation.
Cronbach’s Alpha
(\(\alpha\))
Cronbach’s Alpha is the most commonly used measure of reliability in
practice. The mathematical formula of the Cronbach Alpha is given by
\[
\alpha = \frac{N\times \bar{c}}{\bar{\nu} + (N-1)\times \bar{c}}
\]
where
- N = the number of items.
- \(\bar{c}\) = average covariance
between item-pairs.
- \(\bar{\nu}\) = average
variance.
Note: As the sample size \(N\) increase, \(\alpha\) goes to 1.
The use of the Cronbach Alpha is summarized in the following
table.
R function for
Calculating Cronbach Alpha
You can write a simple R function based on the above formula to
calculate Cronbach’s Alpha. Several R libraries have functions to
calculate Cronbach’s alpha and corresponding confidence intervals. For
example alpha() in library
{psych}.
The following code demonstrates how to calculate Cronbach’s Alpha
using the R function in library {psych}. The data set
to be used in the following example can be found at https://raw.githubusercontent.com/pengdsci/STA490/main/w11-CronbachAlpha-dataset.csv
Data Structure For
Calculating Cronbach Alpha
From the definition of Cronbach’s Alpha, we can see that only items
within the same scale can be used. If a survey instrument has several
scales, we should group items according to their corresponding scales
(even sub-scales) and then calculate Cronbach’s Alpha separately.
In the above data, variables 2-4 are at the same scale. So we define
a data frame that contains only the three items (variables) at the
sample scale to calculate Cronbach’s Alpha of the scale.
# need to load package {psych} first.
example.data = read.csv("https://pengdsci.github.io/STA490/w11/w11-CronbachAlpha-dataset.csv")
my.scale = example.data[, 2:4]
cronbach.a = as.numeric(alpha(my.scale)$total[1])
CI.sc = cronbach.alpha.CI(alpha=cronbach.a, n=104, items=6, conf.level = 0.95)
CI.comp = cbind(LCI = CI.sc[1], alpha = cronbach.a, UCI =CI.sc[2])
row.names(CI.comp) = ""
pander(CI.comp, caption="Confodence Interval of Cranbach Alpha")
Confodence Interval of Cranbach Alpha
0.4294 |
0.571 |
0.6872 |
Interpretation of
Cronbach’s Alpha
Cronbach’s \(\alpha\) is also called
the coefficient of reliability that ranges from 0 to 1. It provides the
overall assessment of a measure’s reliability of the underlying
scale.
If all of the scale items are entirely independent of one another
(i.e., are not correlated or share no covariance), then \(\alpha\) = 0;
if all of the items have high covariances, then \(\alpha\) will approach 1 as the number of
items in the scale approaches infinity.
In other words, the higher the \(\alpha\) coefficient, the more the items
have shared covariance and probably measure the same underlying
concept.
Methods of Survey
Administration
There are three major ways of administering a survey. Which one is
used is dependent on the scope of the study and factors such as project
budget, characteristics of the study population, the sampling frame,
desired response rate, and the characteristics of the survey, etc.
Face-to-face interviews. This involves the oral
presentation of survey questions by a well-trained interviewer.
Computer-Assisted Personal Interviewing (CAPI) software is often used,
which reduces some types of interviewer error.
Telephone interviews. This also involves the
oral presentation of survey questions by a well-trained interviewer, but
it is conducted over the phone instead of in person. Computer-Assisted
Telephone Interviewing (CATI) is often used.
Self-administered questionnaires. This requires
respondents to complete a written questionnaire without any guidance
from an interviewer. Sometimes, such questionnaires are printed on paper
and mailed out with instructions. Other times, such surveys are
conducted via a Computer-Assisted Self-Interview (CASI).
LS0tDQp0aXRsZTogIlN1cnZleSBEZXNnaW46IFZhbGlkaXR5IGFuZCBSZWxpYWJpbGl0eSINCmF1dGhvcjogIkNoZW5nIFBlbmciDQpkYXRlOiAiICINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiA1DQogICAgZmlnX2hlaWdodDogNA0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCjwvc3R5bGU+DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQppZiAoIXJlcXVpcmUoInBzeWNoIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBzeWNoIikNCiAgIGxpYnJhcnkocHN5Y2gpDQp9DQppZiAoIXJlcXVpcmUoImNvY3JvbiIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjb2Nyb24iKQ0KICAgbGlicmFyeShjb2Nyb24pDQp9DQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQojIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ249J2NlbnRlcicsIA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5wb3MgPSAnaHQnKQ0KYGBgDQoNCg0KDQpcDQoNCiMgSW50cm9kdWN0aW9uDQoNCkEgKipzdXJ2ZXkgaW5zdHJ1bWVudCoqIGlzIGEgKnN0cnVjdHVyZWQgdG9vbCogdXNlZCB0byBjb2xsZWN0IGRhdGEgZnJvbSByZXNwb25kZW50cywgdHlwaWNhbGx5IGNvbnNpc3Rpbmcgb2YgYSBzZXQgb2YgcXVlc3Rpb25zLiBTZXZlcmFsIGNvbmNlcHRzIGFyZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgZGVzaWduIG9mIHN1cnZleXMuICANCg0KKiBBICoqcXVlc3Rpb25uYWlyZSoqIGlzIGEgc3RydWN0dXJlZCByZXNlYXJjaCB0b29sIGNvbnNpc3Rpbmcgb2YgYSBzZXQgb2Ygd3JpdHRlbiBxdWVzdGlvbnMgZGVzaWduZWQgdG8gY29sbGVjdCBkYXRhIGZyb20gcmVzcG9uZGVudHMuIA0KDQoqIEEgKipjb25zdHJ1Y3QqKiBpcyBhbiBhYnN0cmFjdCBjb25jZXB0IGJlaW5nIG1lYXN1cmVkIChlLmcuLCBzYXRpc2ZhY3Rpb24sIHRydXN0KSB0aHJvdWdoIHNpbmdsZSBvciBtdWx0aS1pdGVtIHF1ZXN0aW9ubmFpcmVzLg0KDQoqICoqT3BlcmF0aW9uYWxpemF0aW9uKiogaXMgdGhlIHByb2Nlc3Mgb2YgZGVmaW5pbmcgaG93IHRvIG1lYXN1cmUgYSBjb25zdHJ1Y3QuIFRoYXQgaXMsIGl0IGJyaWRnZXMgY29uc3RydWN0IGFuZCBxdWVzdGlvbm5haXJlLg0KDQoqICoqU2luZ2xlLWl0ZW0gbWVhc3VyZSoqIHVzZXMgb25lIHF1ZXN0aW9uIG1lYXN1cmluZyBhIGNvbnN0cnVjdC4gSXQgaXMgdXNlZCBvbmx5IGZvciBzaW1wbGUsIHVuYW1iaWd1b3VzIGNvbnN0cnVjdHMuDQoNCiogQSAqKk11bHRpcGxlLWl0ZW0gbWVhc3VyZSoqIHVzZXMgc2V2ZXJhbCBxdWVzdGlvbnMgbWVhc3VyaW5nIG9uZSBjb25zdHJ1Y3QuIEl0IGlzIGdvb2QgZm9yIGNvbXBsZXggb3IgbXVsdGlkaW1lbnNpb25hbCBjb25zdHJ1Y3RzLg0KDQoqIEEgKipzY2FsZSoqIGlzIGEgc2V0IG9mIGl0ZW1zIChxdWVzdGlvbnMpIGRlc2lnbmVkIHRvIG1lYXN1cmUgYSBjb25zdHJ1Y3QsIG9mdGVuIHVzaW5nIGEgc3RhbmRhcmRpemVkIHJlc3BvbnNlIHN5c3RlbSAoZS5nLiwgTGlrZXJ0IHNjYWxlcykuIEl0IGNvdWxkIGJlIGVpdGhlciBhIHNpbmdsZSAob3ZlcmFsbCByYXRpbmcpIG9yIG11bHRpcGxlIChtdWx0aS1kaW1lbnNpb25hbCBpbmZvcm1hdGlvbikgc2NhbGUuDQoNCiogQSAqKnN1YnNjYWxlKiogaXMgYSBzdWJzZXQgb2YgaXRlbXMgd2l0aGluIGEgc2NhbGUgdGhhdCBtZWFzdXJlcyBhIHNwZWNpZmljIGRpbWVuc2lvbiBvZiB0aGUgY29uc3RydWN0Lg0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI3MCUifQ0KaW5jbHVkZV9ncmFwaGljcygiaW1nL1N1cnZleUNvbmNlcHRzLnBuZyIpDQpgYGANCg0KVGhpcyBicmllZiBub3RlIHByaW1hcmlseSBmb2N1c2VzIG9uIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgc3VydmV5IGluc3RydW1lbnQgYSBzdXJ2ZXkuIFNpbmNlIGRpc2N1c3NpbmcgdGhlIHJlbGlhYmlsaXR5IG9mIGEgc3VydmV5IGlzIG1lYW5pbmdsZXNzIGlmIGl0IGlzIGludmFsaWQuIFNvIHdlIHdpbGwgYWxzbyBicmllZmx5IGRpc2N1c3MgdGhlIHZhbGlkaXR5IG9mIGEgc3VydmV5IGluc3RydW1lbnQuDQoNCkluIG90aGVyIHdvcmRzLCBmb3IgdGhlIHN1cnZleSByZXN1bHRzIHRvIGJlIHVzZWZ1bCwgdGhlIHN1cnZleSBtdXN0IGRlbW9uc3RyYXRlIGJvdGggcmVsaWFiaWxpdHkgYW5kIHZhbGlkaXR5Lg0KDQoqICoqVmFsaWRpdHkqKiDigJMgVGhpcyBpcyB0aGUgZXh0ZW50IHRvIHdoaWNoIGEgc3VydmV5IHF1ZXN0aW9uIG1lYXN1cmVzIDxmb250IGNvbG9yID0gInJlZCI+PGI+d2hhdCBpdCBpcyBzdXBwb3NlZCB0byBtZWFzdXJlPC9iPjwvZm9udD4uDQoNCiogKipSZWxpYWJpbGl0eSoqIOKAkyBUaGlzIGlzIHRoZSBleHRlbnQgdG8gd2hpY2ggPGZvbnQgY29sb3IgPSAicmVkIj48Yj4gcmVwZWF0ZWRseSA8L2I+PC9mb250Pm1lYXN1cmluZyB0aGUgPGZvbnQgY29sb3IgPSAicmVkIj48Yj4gc2FtZSA8L2I+PC9mb250PiB0aGluZyBwcm9kdWNlcyB0aGUgPGZvbnQgY29sb3IgPSAicmVkIj48Yj4gc2FtZSA8L2I+PC9mb250PiByZXN1bHQuDQoNCkFsdGhvdWdoIHZhbGlkaXR5IGFuZCByZWxpYWJpbGl0eSBhcmUgdmlld2VkIGFzIGNvbXBsZXRlbHkgc2VwYXJhdGUgaWRlYXMsIHRoZSB0d28gYXJlIHJlbGF0ZWQuIFdlIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBkaWFncmFtIHRvIGlsbHVzdHJhdGUgdGhlIHJlbGF0aW9uc2hpcC4gDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuY2FwPSJGaWd1cmUgMTogVmFsaWRpdHkgdnMgcmVsaWFiaWxpdHkgb2YgYSBzdXJ2ZXkgaW5zdHJ1bWVudCIsIG91dC53aWR0aCA9ICc0MCUnfQ0KaW5jbHVkZV9ncmFwaGljcygiaW1nL3cxMS12YWxpZGl0eS1yZWxpYWJpbGl0eS5qcGciKQ0KYGBgDQoNCg0KTmV4dCwgd2UgYnJpZWZseSBkZXNjcmliZSB0aGUgdHlwZXMgb2YgdmFsaWRpdHkgYW5kIHByaW1hcmlseSBmb2N1cyBvbiB0aGUgcmVsaWFiaWxpdHkgb2YgdGhlIHN1cnZleSBpbnN0cnVtZW50LiANCg0KDQoNCiMgVmFsaWRpdHkNCg0KQmVmb3JlIHdlIGRpc2N1c3MgdGhlIHZhbGlkaXR5LCB3ZSBmaXJzdCBpbnRyb2R1Y2UgdGhlIGNvbmNlcHQgb2Ygb3BlcmF0aW9uYWxpemF0aW9uLiBBY2NvcmRpbmcgdG8gV2lraXBlZGlhLA0KDQo+SW4gcmVzZWFyY2ggZGVzaWduLCBlc3BlY2lhbGx5IGluIHBzeWNob2xvZ3ksIHNvY2lhbCBzY2llbmNlcywgbGlmZSBzY2llbmNlcywgYW5kIHBoeXNpY3MsIG9wZXJhdGlvbmFsaXphdGlvbiBpcyBhIHByb2Nlc3Mgb2YgZGVmaW5pbmcgdGhlIG1lYXN1cmVtZW50IG9mIGEgcGhlbm9tZW5vbiB0aGF0IGlzIG5vdCBkaXJlY3RseSBtZWFzdXJhYmxlLCB0aG91Z2ggaXRzIGV4aXN0ZW5jZSBpcyBpbmZlcnJlZCBieSBvdGhlciBwaGVub21lbmEuDQoNCg0KT3BlcmF0aW9uYWxpemF0aW9uIGlzIHRoZSBwcm9jZXNzIGJ5IHdoaWNoIHJlc2VhcmNoZXJzIHRyYW5zbGF0ZSB0aGVvcmV0aWNhbCB2YXJpYWJsZXMgaW50byBvYnNlcnZhYmxlIGFuZCBtZWFzdXJhYmxlIHByb2NlZHVyZXMuDQoNCg0KIyMgVHlwZXMgb2YgdmFsaWRpdHkNCg0KQXMgbWVudGlvbmVkIGVhcmxpZXIsIGluIHN1cnZleSBkZXNpZ24sIGEgPGZvbnQgY29sb3IgPSAicmVkIj4qKmNvbnN0cnVjdCoqPC9mb250PiBpcyB0aGUgYWJzdHJhY3QgaWRlYSwgdGhlIHVuZGVybHlpbmcgdGhlbWUsIG9yIHN1YmplY3QgbWF0dGVyIHRoYXQgb25lIHdpc2hlcyB0byBtZWFzdXJlIHVzaW5nIHN1cnZleSBxdWVzdGlvbnMuIA0KDQpUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgZGVzY3JpcHRpb25zIG9mIGRpZmZlcmVudCB0eXBlcyBvZiB2YWxpZGl0eS4gVGhlIGZvbGxvd2luZyBhcmUgbW9kZXJuIGRlc2NyaXB0aW9ucyBvZiB0aGUgdmFsaWRpdHkgb2YgdGhlIHN1cnZleSBjb25zdHJ1Y3QuDQoNCg0KKiAqKkNvbnRlbnQgVmFsaWRpdHkqKiDigJMgQW4gb3BlcmF0aW9uYWxpemF0aW9uIGhhcyAqKmNvbnRlbnQgdmFsaWRpdHkqKiB3aGVuIGl0IGFkZXF1YXRlbHkgY292ZXJzIHRoZSByYW5nZSBvZiBtZWFuaW5ncyBpbmNsdWRlZCBpbiB0aGUgY29uc3RydWN0IGl0IGlzIGludGVuZGVkIHRvIG1lYXN1cmUuIFdoZW4gYXNzZXNzaW5nIHRoaXMsIG9uZSBzaG91bGQgYWxzbyBjb25zaWRlciB0aGUgY29udGVudCByZWxldmFuY2Ugb2YgZWFjaCBpdGVtIGFuZCBpdHMgdGVjaG5pY2FsIHF1YWxpdHkuDQoNCg0KKiAqKlN1YnN0YW50aXZlIFZhbGlkaXR5KiogY29uc2lkZXJzIHRoZSBzdHJlbmd0aCBvZiB0aGUgdGhlb3JldGljYWwgcmF0aW9uYWxlcyBmb3IgaW50ZXJwcmV0aW5nIHRoZSBzdXJ2ZXkgc2NvcmVzLg0KDQoNCiogKipTdHJ1Y3R1cmFsIFZhbGlkaXR5KiogaXMgYXNzZXNzZWQgYnkgaW52ZXN0aWdhdGluZyB0aGUgZGVncmVlIHRvIHdoaWNoIHRoZSBvcGVyYXRpb25hbGl6YXRpb24gYWRlcXVhdGVseSByZWZsZWN0cyB0aGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIGNvbnN0cnVjdCB0byBiZSBtZWFzdXJlZC4NCg0KDQoqICoqR2VuZXJhbGl6YWJpbGl0eSoqIGV4YW1pbmVzIHRoZSBleHRlbnQgdG8gd2hpY2ggc2NvcmVzIGdlbmVyYWxpemUgYWNyb3NzIGRpZmZlcmVudCBwb3B1bGF0aW9uIGdyb3VwcywgZGlmZmVyZW50IHNpdHVhdGlvbnMgb3Igc2V0dGluZ3MsIGRpZmZlcmVudCBwZXJpb2RzLCBhbmQvb3Igb3RoZXIgb3BlcmF0aW9uYWxpemF0aW9ucyByZXByZXNlbnRhdGl2ZSBvZiB0aGUgY29uc3RydWN0IGRvbWFpbi4NCg0KDQpcDQoNCiMjIEltcHJvdmluZyBWYWxpZGl0eQ0KDQpUaGUgc3RyYXRlZ3kgZm9yIGltcHJvdmluZyB0aGUgdmFsaWRpdHkgb2Ygc3VydmV5IGluc3RydW1lbnRzIGlzIHRvICoqcmVkdWNlIChvciBldmVuIGF2b2lkKSBiaWFzKiouIFRoZSBmb2xsb3dpbmcgYXJlICoqY29tbW9uIHBvdGVudGlhbCBiaWFzZXMqKiBpbiBxdWVzdGlvbm5haXJlIGRlc2lnbi4gDQoNCg0KKiAqKkRlbGliZXJhdGUgYmlhcyoqIC0gSWYgdGhlIG9iamVjdGl2ZSBvZiBhIHN1cnZleSBzdHVkeSBpcyB0byBzdXBwb3J0IGEgY2VydGFpbiBjYXVzZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBzdXJ2ZXkgbWF5IGRlbGliZXJhdGVseSB0cnkgdG8gaW5mbHVlbmNlIHRoZSByZXN1bHRzIGJ5IHVzaW5nIHF1ZXN0aW9ucyB0aGF0IGFyZSBwdXJwb3NlZnVsbHkgd29yZGVkIGluIGEgYmlhc2VkIG1hbm5lci4NCg0KDQoqICoqVW5pbnRlbnRpb25hbCBiaWFzKiogLSBPbmUgd2F5IHRoYXQgdGhpcyBjYW4gb2NjdXIgaXMgd2hlbiBxdWVzdGlvbnMgYXJlIHdvcmRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIG1lYW5pbmcgaXMgbWlzaW50ZXJwcmV0ZWQgYnkgYSBsYXJnZSBwcm9wb3J0aW9uIG9mIHRoZSByZXNwb25kZW50cy4gVGhpcyBjYW4gb2Z0ZW4gaGFwcGVuIGluYWR2ZXJ0ZW50bHkgd2hlbiB3b3JkcyBoYXZlIG11bHRpcGxlIG1lYW5pbmdzIG9yIHdoZW4gd29yZHMgYXJlIGludGVycHJldGVkIGRpZmZlcmVudGx5IHRoYW4gaW50ZW5kZWQuDQoNCg0KKiAqKlNvY2lhbCBkZXNpcmFiaWxpdHkgYmlhcyoqIC0gSW4gZ2VuZXJhbCwgcmVzcG9uZGVudHMgdGVuZCB0byByZXNwb25kIHRvIHF1ZXN0aW9ucyB3aXRoIGFuc3dlcnMgdGhleSB0aGluayB3aWxsIGJlIHZpZXdlZCBmYXZvcmFibHkgYnkgb3RoZXJzLiBUaGlzIGludm9sdmVzIGJvdGggdW5kZXJzdGF0aW5nIGJlaGF2aW9ycy9vcGluaW9ucyB0aGF0IGFyZSB2aWV3ZWQgbmVnYXRpdmVseSBhbmQgb3ZlcnN0YXRpbmcgYmVoYXZpb3JzL29waW5pb25zIHRoYXQgYXJlIHZpZXdlZCBwb3NpdGl2ZWx5LiBDYXJlZnVsIHdvcmRpbmcgb2YgcXVlc3Rpb25zIG9yIHV0aWxpemluZyBjZXJ0YWluIHJhbmRvbWl6ZWQgcmVzcG9uc2UgdGVjaG5pcXVlcyBjYW4gaGVscCByZWR1Y2UgdGhpcyBiaWFzLiBIZXJlIGFyZSB0aGluZ3MgdGhhdCBtYXkgYmUgbWlzcmVwb3J0ZWQ6DQogIC0gQWJpbGl0aWVzIGFuZCBza2lsbHMNCiAgLSBQZXJzb25hbGl0eQ0KICAtIFJlbGlnaW9uIGFuZCBzcGlyaXR1YWxpdHkNCiAgLSBGaW5hbmNpYWwgZWFybmluZw0KICAtIFVubGF3ZnVsIGJlaGF2aW9yDQogIC0gT3RoZXIgdmVyeSBwZXJzb25hbCB0aGluZ3MNCg0KDQoqICoqTm9uLVJlc3BvbnNlIEJpYXMqKiAtIG9jY3VycyB3aGVyZSBhIHN1cnZleSBzYW1wbGUgaXMgbm9uLXJlcHJlc2VudGF0aXZlIG9mIHRoZSB0YXJnZXQgcG9wdWxhdGlvbi4gSW4gdGhlc2UgY2FzZXMsIHRoZSBvcGluaW9ucyBzaGFyZWQgYnkgdGhvc2UgcmVzcG9uZGVudHMgYXJlIGRpc3Byb3BvcnRpb25hdGUgdG8gdGhvc2Ugb2YgdGhlIGxhcmdlciBwb3B1bGF0aW9uLiBUbyByZWR1Y2UgdGhlIHJpc2sgb2YgdGhpcyBiaWFzIG9jY3VycmluZywgd2UgY2FuIHNoYXJlIHRoZSBzdXJ2ZXkgYWNyb3NzIGEgcmFuZ2Ugb2YgcGxhdGZvcm1zIGFuZCB0byBhIGRpdmVyc2UgZ3JvdXAgYXMgcG9zc2libGUuIEUuZy4gc29jaWFsIG1lZGlhLCB3ZWJzaXRlLCB2aWEgZW1haWwsIGV0Yy4NCg0KDQoqICoqVW5pbmZvcm1lZCByZXNwb25zZSBiaWFzKiogLSBTb21ldGltZXMsIHJlc3BvbmRlbnRzIGNsYWltIHRvIGtub3cgc29tZXRoaW5nIGFib3V0IGFuIGlzc3VlIGJlY2F1c2UgdGhleSBhcmUgZW1iYXJyYXNzZWQgdG8gYWRtaXQgdGhhdCB0aGV5IGRvbuKAmXQuIFRvIGF2b2lkIHRoaXMgdHlwZSBvZiBiaWFzLCBiZSBzdXJlIHRvIGtlZXAgdGhlIHN1cnZleSBxdWVzdGlvbnMgY2xlYXIgb2YgdGVjaG5pY2FsIGphcmdvbiwgYW5kIGNsZWFybHkgZGVmaW5lIGFueSB0ZXJtcyB0aGF0IG5lZWQgdG8gYmUgZGVmaW5lZC4NCg0KDQoqICoqQ29tcGxleCBiaWFzKiogLSBpcyB0aGUgdGVuZGVuY3kgdG8gbG9vayBhdCBzb21ldGhpbmcgZWFzeSB0byB1bmRlcnN0YW5kLCBvciBsb29rIGF0IGl0IHdoZW4gd2UgYXJlIGluIGEgc3RhdGUgb2YgY29uZnVzaW9uLCBhbmQgdmlldyBpdCBhcyBoYXZpbmcgbWFueSBwYXJ0cyB0aGF0IGFyZSBkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZC4gUXVlc3Rpb25zIHNob3VsZCBiZSB3b3JkZWQgYXMgc2ltcGx5IGFuZCBjbGVhcmx5IGFzIHBvc3NpYmxlLiBJZiB0ZWNobmljYWwgamFyZ29uIG11c3QgYmUgdXNlZCwgaXQgaXMgYmVzdCB0byBkZWZpbmUgdGhlIHRlcm0gc3BlY2lmaWNhbGx5IGluIHRoZSBzdXJ2ZXkuIEZpbmFsbHksIHdlIHNob3VsZCAqKmF2b2lkKiogdXNpbmcgZG91YmxlLWJhcnJlbGVkIHF1ZXN0aW9ucyBpbiBhbnkgc3VydmV5Lg0KDQpcDQoNCiMgUmVsaWFiaWxpdHkNCg0KRm9yIHN1cnZleSByZXN1bHRzIHRvIGJlIHVzZWZ1bCwgdGhlIHN1cnZleSBtdXN0IGRlbW9uc3RyYXRlIHJlbGlhYmlsaXR5LiBUaGUgYmVzdCBwcmFjdGljZSBmb3IgcXVlc3Rpb25uYWlyZSBkZXNpZ24gaXMgdG8gaGVscCBtYXhpbWl6ZSB0aGUgaW5zdHJ1bWVudOKAmXMgcmVsaWFiaWxpdHkuDQoNCkJhc2VkIG9uIHRoZSBkZWZpbml0aW9uIGdpdmVuIGVhcmxpZXIsIHJlbGlhYmlsaXR5IGlzIGEgcXVhbGl0eSBtZWFzdXJlIG9mIHRoZSBzdXJ2ZXkgaW5zdHJ1bWVudC4gV2UgY2FuIHVzZSBxdWFudGl0YXRpdmUgYXBwcm9hY2hlcyB0byBhbmFseXplIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgc3VydmV5LiBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgdHlwZXMgb2YgcmVsaWFiaWxpdHkgbWVhc3VyZXMgYXZhaWxhYmxlIGluIGxpdGVyYXR1cmUgYW5kIHByYWN0aWNlLiBXZSB3aWxsIGludHJvZHVjZSBzb21lIGNvbW1vbmx5IHVzZWQgb25lcy4NCg0KDQojIyBUZXN0LVJldGVzdCBSZWxpYWJpbGl0eQ0KDQpXZSBlc3RpbWF0ZSB0ZXN0LXJldGVzdCByZWxpYWJpbGl0eSB3aGVuIHdlIGFkbWluaXN0ZXIgdGhlIHNhbWUgcXVlc3Rpb25uYWlyZSAob3IgdGVzdCkgdG8gdGhlIDxmb250IGNvbG9yID0gInJlZCI+KipzYW1lIHNldCBvZiBzdWJqZWN0cyoqPC9mb250PiBvbiB0d28gZGlmZmVyZW50IG9jY2FzaW9ucy4gTm90ZSB0aGF0IHRoaXMgYXBwcm9hY2ggYXNzdW1lcyB0aGVyZSBpcyBubyBzdWJzdGFudGlhbCBjaGFuZ2UgaW4gd2hhdCBpcyBiZWluZyBtZWFzdXJlZCBiZXR3ZWVuIHRoZSB0d28gb2NjYXNpb25zLiBUbyBtYXhpbWl6ZSB0aGUgY2hhbmNlIHRoYXQgd2hhdCBpcyBiZWluZyBtZWFzdXJlZCBpcyBub3QgY2hhbmdpbmcsIG9uZSBzaG91bGQgbm90IGxldCB0b28gbXVjaCB0aW1lIHBhc3MgYmV0d2VlbiB0aGUgdGVzdCBhbmQgdGhlIHJldGVzdC4gDQoNCkZvciBjb250aW51b3VzIHNjYWxlLCBtZWFzdXJlcyBzdWNoIGFzIFBlYXJzb24gY29ycmVsYXRpb24gY2FuIGJlIHVzZWQgdG8gYXNzZXNzIHRoZSBzdHJlbmd0aCBvZiByZWxpYWJpbGl0eS4gRm9yIGEgY2F0ZWdvcmljYWwgc2NhbGUsIEthcHBhLXJlbGF0ZWQgc3RhdGlzdGljcyBjYW4gYmUgdXNlZC4NCg0KDQojIyBQYXJhbGxlbCBGb3JtcyBSZWxpYWJpbGl0eQ0KDQpUaGlzIGludm9sdmVzIGNyZWF0aW5nIGEgbGFyZ2Ugc2V0IG9mIHF1ZXN0aW9ucyB0aGF0IGFyZSBiZWxpZXZlZCB0byBtZWFzdXJlIHRoZSBzYW1lIGNvbnN0cnVjdCBhbmQgdGhlbiByYW5kb21seSBkaXZpZGluZyB0aGVzZSBxdWVzdGlvbnMgaW50byB0d28gc2V0cyAoa25vd24gYXMgcGFyYWxsZWwgZm9ybXMpLiBCb3RoIHNldHMgYXJlIHRoZW4gYWRtaW5pc3RlcmVkIHRvIHRoZSA8Zm9udCBjb2xvciA9ICJyZWQiPioqc2FtZSBncm91cCBvZiBwZW9wbGUqKjwvZm9udD4uIFRoZSBtZWFucywgc3RhbmRhcmQgZGV2aWF0aW9ucywgYW5kIGNvcnJlbGF0aW9ucyB3aXRoIG90aGVyIG1lYXN1cmVzICh3aGVuIGFwcHJvcHJpYXRlKSBzaG91bGQgYmUgY29tcGFyZWQgdG8gZXN0YWJsaXNoIHRoYXQgdGhlIHR3byBmb3JtcyBhcmUgZXF1aXZhbGVudC4gVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHR3byBwYXJhbGxlbCBmb3JtcyBjYW4gYmUgdXNlZCBhcyB0aGUgZXN0aW1hdGUgb2YgcmVsaWFiaWxpdHkgKHdlIHdhbnQgdGhlIHNjb3JlcyBvbiB0aGUgdHdvIGZvcm1zIHRvIGJlIGhpZ2hseSBjb3JyZWxhdGVkKS4NCg0KDQpIYXZpbmcgcGFyYWxsZWwgZm9ybXMgaXMgdXNlZnVsIGZvciBzdHVkaWVzIGludm9sdmluZyBib3RoIGEgcHJlLXRlc3QgYW5kIHBvc3QtdGVzdCBpbiB3aGljaCB0aGUgcmVzZWFyY2hlciBkb2VzIG5vdCB3YW50IHRvIHVzZSB0aGUgc2FtZSBmb3JtIGF0IGJvdGggcGVyaW9kcyAodGhpbmsgb2Ygd2h5IHRoZXkgbWF5IHdhbnQgdG8gYXZvaWQgdGhpcykuIElmIHBhcmFsbGVsIGZvcm1zIHJlbGlhYmlsaXR5IGNhbiBiZSBlc3RhYmxpc2hlZCwgdGhlbiB0aGUgcmVzZWFyY2hlciBjYW4gdXNlIGJvdGggZm9ybXMgaW4gdGhlaXIgc3R1ZHkuDQoNCg0KIyMgSW50ZXJuYWwgQ29uc2lzdGVuY3kgUmVsaWFiaWxpdHkNCg0KSW4gaW50ZXJuYWwgY29uc2lzdGVuY3kgcmVsaWFiaWxpdHkgZXN0aW1hdGlvbiwgd2UgdXNlIG91ciBzaW5nbGUgbWVhc3VyZW1lbnQgaW5zdHJ1bWVudCBhZG1pbmlzdGVyZWQgdG8gYSBncm91cCBvZiBwZW9wbGUgb24gb25lIG9jY2FzaW9uIHRvIGVzdGltYXRlIHJlbGlhYmlsaXR5LiBJbiBlZmZlY3QsIHdlIGp1ZGdlIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgaW5zdHJ1bWVudCBieSBlc3RpbWF0aW5nIGhvdyB3ZWxsIHRoZSBpdGVtcyB0aGF0IHJlZmxlY3QgdGhlIHNhbWUgY29uc3RydWN0IHlpZWxkIHNpbWlsYXIgcmVzdWx0cy4gV2UgYXJlIGxvb2tpbmcgYXQgaG93IGNvbnNpc3RlbnQgdGhlIHJlc3VsdHMgYXJlIGZvciBkaWZmZXJlbnQgaXRlbXMgZm9yIHRoZSBzYW1lIGNvbnN0cnVjdCB3aXRoaW4gdGhlIG1lYXN1cmUuIA0KDQpEaWZmZXJlbnQgaW50ZXJuYWwgY29uc2lzdGVuY3kgbWVhc3VyZXMgY2FuIGJlIHVzZWQuIFRoZSBmb2xsb3dpbmcgYXJlIGNvbW1vbmx5IHVzZWQgaW4gcHJhY3RpY2UuDQoNCg0KIyMjIEF2ZXJhZ2UgSW50ZXItaXRlbSBDb3JyZWxhdGlvbg0KDQpUaGUgYXZlcmFnZSBpbnRlci1pdGVtIGNvcnJlbGF0aW9uIHVzZXMgYWxsIG9mIHRoZSBpdGVtcyBvbiBvdXIgaW5zdHJ1bWVudCB0aGF0IGFyZSBkZXNpZ25lZCB0byBtZWFzdXJlIHRoZSBzYW1lIGNvbnN0cnVjdC4gV2UgZmlyc3QgY29tcHV0ZSB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBlYWNoIHBhaXIgb2YgaXRlbXMuIFRoZSBhdmVyYWdlIGludGVyLWl0ZW0gY29ycmVsYXRpb24gaXMgc2ltcGx5IHRoZSBhdmVyYWdlIG9yIG1lYW4gb2YgYWxsIHRoZXNlIGNvcnJlbGF0aW9ucy4gDQoNCkZvciBleGFtcGxlLCAgd2UgaGF2ZSBzaXggaXRlbXMgaW4gdGhlIGdyYXRpdHVkZSBzdXJ2ZXkuIFRoZXJlIGFyZSAxNSBkaWZmZXJlbnQgaXRlbSBwYWlyaW5ncyAoaS5lLiwgMTUgY29ycmVsYXRpb25zKS4gV2UgdGFrZSB0aGUgYXZlcmFnZSBvZiBhbGwgMTUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIGFzIGlsbHVzdHJhdGVkIGluIHRoZSBmb2xsb3dpbmcgZmlndXJlLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9IkZpZ3VyZSAyOiBJbnRlci1pdGVtIGNvcnJlbGF0aW9uIiwgb3V0LndpZHRoID0gJzQwJSd9DQppbmNsdWRlX2dyYXBoaWNzKCJpbWcvdzExLUludGVyLWNvcnJlbGF0aW9uLWdyYXRpdHVkZS5qcGciKQ0KYGBgDQoNCioqQ2F1dGlvbioqOiBUbyBnZXQgdHJ1dGhmdWwgaW5mb3JtYXRpb24gZnJvbSByZXNwb25kZW50cywgcmVzZWFyY2hlcnMgb2Z0ZW4gaW50ZW50aW9uYWxseSByZXZlcnNlIHRoZSBzY2FsZS4gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWVhbiBhYnNvbHV0ZSBjb3JyZWxhdGlvbi4gDQoNCg0KIyMjIENyb25iYWNo4oCZcyBBbHBoYSAoJFxhbHBoYSQpDQoNCkNyb25iYWNo4oCZcyBBbHBoYSBpcyB0aGUgbW9zdCBjb21tb25seSB1c2VkIG1lYXN1cmUgb2YgcmVsaWFiaWxpdHkgaW4gcHJhY3RpY2UuIFRoZSBtYXRoZW1hdGljYWwgZm9ybXVsYSBvZiB0aGUgQ3JvbmJhY2ggQWxwaGEgaXMgZ2l2ZW4gYnkNCg0KJCQNClxhbHBoYSA9IFxmcmFje05cdGltZXMgXGJhcntjfX17XGJhcntcbnV9ICsgKE4tMSlcdGltZXMgXGJhcntjfX0NCiQkDQoNCndoZXJlDQoNCiogTiA9IHRoZSBudW1iZXIgb2YgaXRlbXMuDQoqICRcYmFye2N9JCA9IGF2ZXJhZ2UgY292YXJpYW5jZSBiZXR3ZWVuIGl0ZW0tcGFpcnMuDQoqICRcYmFye1xudX0kID0gYXZlcmFnZSB2YXJpYW5jZS4NCg0KKipOb3RlKio6IEFzIHRoZSBzYW1wbGUgc2l6ZSAkTiQgaW5jcmVhc2UsICRcYWxwaGEkIGdvZXMgdG8gMS4NCg0KVGhlIHVzZSBvZiB0aGUgQ3JvbmJhY2ggQWxwaGEgaXMgc3VtbWFyaXplZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9IkZpZ3VyZSAzLiBDcm9uYmFjaCBBbHBoYSBUYWJsZSIsIG91dC53aWR0aCA9ICc0MCUnfQ0KaW5jbHVkZV9ncmFwaGljcygiaW1nL3cxMS1Dcm9uYmFjaC1BbHBoYS5qcGciKQ0KYGBgDQoNCiMjIyBSIGZ1bmN0aW9uIGZvciBDYWxjdWxhdGluZyBDcm9uYmFjaCBBbHBoYQ0KDQpZb3UgY2FuIHdyaXRlIGEgc2ltcGxlIFIgZnVuY3Rpb24gYmFzZWQgb24gdGhlIGFib3ZlIGZvcm11bGEgdG8gY2FsY3VsYXRlIENyb25iYWNoJ3MgQWxwaGEuIFNldmVyYWwgUiBsaWJyYXJpZXMgaGF2ZSBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIENyb25iYWNoJ3MgYWxwaGEgYW5kIGNvcnJlc3BvbmRpbmcgY29uZmlkZW5jZSBpbnRlcnZhbHMuIEZvciBleGFtcGxlICoqYWxwaGEoKSoqIGluIGxpYnJhcnkgKip7cHN5Y2h9KiouDQoNClRoZSBmb2xsb3dpbmcgY29kZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNhbGN1bGF0ZSBDcm9uYmFjaCdzIEFscGhhIHVzaW5nIHRoZSBSIGZ1bmN0aW9uIGluIGxpYnJhcnkgKip7cHN5Y2h9KiouIFRoZSBkYXRhIHNldCB0byBiZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjYW4gYmUgZm91bmQgYXQgPGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wZW5nZHNjaS9TVEE0OTAvbWFpbi93MTEtQ3JvbmJhY2hBbHBoYS1kYXRhc2V0LmNzdj4NCg0KDQojIyMgRGF0YSBTdHJ1Y3R1cmUgRm9yIENhbGN1bGF0aW5nIENyb25iYWNoIEFscGhhDQoNCkZyb20gdGhlIGRlZmluaXRpb24gb2YgQ3JvbmJhY2gncyBBbHBoYSwgd2UgY2FuIHNlZSB0aGF0IG9ubHkgaXRlbXMgd2l0aGluIHRoZSBzYW1lIHNjYWxlIGNhbiBiZSB1c2VkLiBJZiBhIHN1cnZleSBpbnN0cnVtZW50IGhhcyBzZXZlcmFsIHNjYWxlcywgd2Ugc2hvdWxkIGdyb3VwIGl0ZW1zIGFjY29yZGluZyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHNjYWxlcyAoZXZlbiBzdWItc2NhbGVzKSBhbmQgdGhlbiBjYWxjdWxhdGUgQ3JvbmJhY2gncyBBbHBoYSBzZXBhcmF0ZWx5Lg0KDQpJbiB0aGUgYWJvdmUgZGF0YSwgdmFyaWFibGVzIDItNCBhcmUgYXQgdGhlIHNhbWUgc2NhbGUuIFNvIHdlIGRlZmluZSBhIGRhdGEgZnJhbWUgdGhhdCBjb250YWlucyBvbmx5IHRoZSB0aHJlZSBpdGVtcyAodmFyaWFibGVzKSBhdCB0aGUgc2FtcGxlIHNjYWxlIHRvIGNhbGN1bGF0ZSBDcm9uYmFjaCdzIEFscGhhIG9mIHRoZSBzY2FsZS4NCg0KDQpgYGB7cn0NCiMgbmVlZCB0byBsb2FkIHBhY2thZ2Uge3BzeWNofSBmaXJzdC4NCmV4YW1wbGUuZGF0YSA9IHJlYWQuY3N2KCJodHRwczovL3Blbmdkc2NpLmdpdGh1Yi5pby9TVEE0OTAvdzExL3cxMS1Dcm9uYmFjaEFscGhhLWRhdGFzZXQuY3N2IikNCm15LnNjYWxlID0gZXhhbXBsZS5kYXRhWywgMjo0XQ0KY3JvbmJhY2guYSA9IGFzLm51bWVyaWMoYWxwaGEobXkuc2NhbGUpJHRvdGFsWzFdKQ0KQ0kuc2MgPSBjcm9uYmFjaC5hbHBoYS5DSShhbHBoYT1jcm9uYmFjaC5hLCBuPTEwNCwgaXRlbXM9NiwgY29uZi5sZXZlbCA9IDAuOTUpDQpDSS5jb21wID0gY2JpbmQoTENJID0gQ0kuc2NbMV0sIGFscGhhID0gY3JvbmJhY2guYSwgVUNJID1DSS5zY1syXSkNCnJvdy5uYW1lcyhDSS5jb21wKSA9ICIiDQpwYW5kZXIoQ0kuY29tcCwgY2FwdGlvbj0iQ29uZm9kZW5jZSBJbnRlcnZhbCBvZiBDcmFuYmFjaCBBbHBoYSIpDQpgYGANCg0KDQojIyMgSW50ZXJwcmV0YXRpb24gb2YgQ3JvbmJhY2jigJlzIEFscGhhDQoNCkNyb25iYWNoJ3MgJFxhbHBoYSQgaXMgYWxzbyBjYWxsZWQgdGhlIGNvZWZmaWNpZW50IG9mIHJlbGlhYmlsaXR5IHRoYXQgcmFuZ2VzIGZyb20gMCB0byAxLiBJdCBwcm92aWRlcyB0aGUgb3ZlcmFsbCBhc3Nlc3NtZW50IG9mIGEgbWVhc3VyZeKAmXMgcmVsaWFiaWxpdHkgb2YgdGhlIHVuZGVybHlpbmcgc2NhbGUuIA0KDQoqIElmIGFsbCBvZiB0aGUgc2NhbGUgaXRlbXMgYXJlIGVudGlyZWx5IGluZGVwZW5kZW50IG9mIG9uZSBhbm90aGVyIChpLmUuLCBhcmUgbm90IGNvcnJlbGF0ZWQgb3Igc2hhcmUgbm8gY292YXJpYW5jZSksIHRoZW4gICRcYWxwaGEkICA9IDA7IA0KDQoqIGlmIGFsbCBvZiB0aGUgaXRlbXMgaGF2ZSBoaWdoIGNvdmFyaWFuY2VzLCB0aGVuICAkXGFscGhhJCAgd2lsbCBhcHByb2FjaCAxIGFzIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHNjYWxlIGFwcHJvYWNoZXMgaW5maW5pdHkuIA0KDQpJbiBvdGhlciB3b3JkcywgdGhlIGhpZ2hlciB0aGUgICRcYWxwaGEkICBjb2VmZmljaWVudCwgdGhlIG1vcmUgdGhlIGl0ZW1zIGhhdmUgc2hhcmVkIGNvdmFyaWFuY2UgYW5kIHByb2JhYmx5IG1lYXN1cmUgdGhlIHNhbWUgdW5kZXJseWluZyBjb25jZXB0Lg0KDQoNCg0KIyBNZXRob2RzIG9mIFN1cnZleSBBZG1pbmlzdHJhdGlvbg0KDQpUaGVyZSBhcmUgdGhyZWUgbWFqb3Igd2F5cyBvZiBhZG1pbmlzdGVyaW5nIGEgc3VydmV5LiBXaGljaCBvbmUgaXMgdXNlZCBpcyBkZXBlbmRlbnQgb24gdGhlIHNjb3BlIG9mIHRoZSBzdHVkeSBhbmQgZmFjdG9ycyBzdWNoIGFzIHByb2plY3QgYnVkZ2V0LCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHN0dWR5IHBvcHVsYXRpb24sIHRoZSBzYW1wbGluZyBmcmFtZSwgZGVzaXJlZCByZXNwb25zZSByYXRlLCBhbmQgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgc3VydmV5LCBldGMuDQoNCg0KKiAqKkZhY2UtdG8tZmFjZSBpbnRlcnZpZXdzLioqICBUaGlzIGludm9sdmVzIHRoZSBvcmFsIHByZXNlbnRhdGlvbiBvZiBzdXJ2ZXkgcXVlc3Rpb25zIGJ5IGEgd2VsbC10cmFpbmVkIGludGVydmlld2VyLiBDb21wdXRlci1Bc3Npc3RlZCBQZXJzb25hbCBJbnRlcnZpZXdpbmcgKENBUEkpIHNvZnR3YXJlIGlzIG9mdGVuIHVzZWQsIHdoaWNoIHJlZHVjZXMgc29tZSB0eXBlcyBvZiBpbnRlcnZpZXdlciBlcnJvci4NCg0KDQoqICoqVGVsZXBob25lIGludGVydmlld3MuKiogIFRoaXMgYWxzbyBpbnZvbHZlcyB0aGUgb3JhbCBwcmVzZW50YXRpb24gb2Ygc3VydmV5IHF1ZXN0aW9ucyBieSBhIHdlbGwtdHJhaW5lZCBpbnRlcnZpZXdlciwgYnV0IGl0IGlzIGNvbmR1Y3RlZCBvdmVyIHRoZSBwaG9uZSBpbnN0ZWFkIG9mIGluIHBlcnNvbi4gQ29tcHV0ZXItQXNzaXN0ZWQgVGVsZXBob25lIEludGVydmlld2luZyAoQ0FUSSkgaXMgb2Z0ZW4gdXNlZC4NCg0KDQoqICoqU2VsZi1hZG1pbmlzdGVyZWQgcXVlc3Rpb25uYWlyZXMuKiogVGhpcyByZXF1aXJlcyByZXNwb25kZW50cyB0byBjb21wbGV0ZSBhIHdyaXR0ZW4gcXVlc3Rpb25uYWlyZSB3aXRob3V0IGFueSBndWlkYW5jZSBmcm9tIGFuIGludGVydmlld2VyLiBTb21ldGltZXMsIHN1Y2ggcXVlc3Rpb25uYWlyZXMgYXJlIHByaW50ZWQgb24gcGFwZXIgYW5kIG1haWxlZCBvdXQgd2l0aCBpbnN0cnVjdGlvbnMuIE90aGVyIHRpbWVzLCBzdWNoIHN1cnZleXMgYXJlIGNvbmR1Y3RlZCB2aWEgYSBDb21wdXRlci1Bc3Npc3RlZCBTZWxmLUludGVydmlldyAoQ0FTSSkuDQoNCg==