Introduction
Regardless of the research design, statistics are a crucial component
of research since it allows the researchers to summarize the collected
data and give it to others for interpretation.
We need a defined analytic plan before we start collecting data. The
SAP (statistical analysis plan) will direct us from the beginning to the
conclusion, help us summarize and describe the data, and test our
hypotheses.
The statistical analysis plan (SAP) describes the intended clinical
trial analysis. The SAP is a technical document that describes the
statistical methods of research analysis, as opposed to the protocol,
which represents the analysis.
What is a statistical
analysis plan?
Statistical Analysis Plan (SAP) is a detailed
document specifying how data will be analyzed, ensuring transparency,
reproducibility, and minimization of bias.
- Data Collection
- Primary Data: Clearly define the main outcome
variables (e.g., clinical endpoints, survey responses).
- Secondary Data: Specify additional variables (e.g.,
covariates, confounders) and their sources.
- Data Handling: Procedures for missing data,
outliers, and transformations (e.g., log-transformation for skewed
data).
- Methods of Analysis
- Descriptive Statistics: Summarize data (means,
proportions, SDs, visualizations).
- Inferential Statistics: Hypothesis testing,
confidence intervals, effect sizes.
- Software/Tools: Specify (e.g., R, SAS, SPSS) and
versions.
- Primary Analysis
- Define the primary outcome(s) and statistical test(s) (e.g., t-test,
ANOVA, regression).
- State how the primary hypothesis will be tested (e.g., superiority,
non-inferiority).
- Comparisons & Significance Levels
- Predefined Comparisons: Subgroup analyses, pairwise comparisons
(adjust for multiple testing if needed).
- Alpha (Significance Level): Typically 0.05, with justification if
adjusted.
- Power Analysis: Sample size justification based on
expected effect size.
- Exploratory Data Analyses (EDA)
- Unplanned analyses to identify patterns (e.g., trends,
interactions).
- Clarify that results are hypothesis-generating (not
confirmatory).
- Statistical Models
- Primary Model: Specify (e.g., linear regression,
logistic regression, Cox model).
- Response Variable: Clearly defined (e.g., blood
pressure, survival time).
- Predictors/Covariates: List included variables and
rationale.
- Alternative Models: Robustness checks (e.g.,
sensitivity analyses, different covariate adjustments).
Identifying the need
for an SAP
While a study protocol outlines the general research methodology, an
SAP provides a deeper, technical specification of statistical
procedures. Here’s when an SAP becomes essential:
- High-Risk or Regulated Studies
- Clinical trials (especially Phase II/III) requiring
regulatory approval (FDA, EMA).
- Studies with major clinical/public health
implications (e.g., drug efficacy, policy decisions).
- Pre-specified analyses to prevent bias (e.g.,
avoiding selective reporting).
- Complex Statistical Methods
- Advanced modeling (e.g., mixed-effects models,
survival analysis, machine learning).
- Adaptive trial designs (interim analyses, Bayesian
methods).
- Handling missing data (multiple imputation, inverse
probability weighting).
- Large or Multi-Center Studies
- Ensures consistency across sites/analysts.
- Prevents post-hoc decisions that could introduce bias.
- Reproducibility & Transparency
- Needed for peer-reviewed journals (e.g., ICMJE, CONSORT
requirements).
- Allows an independent statistician to replicate analyses without
ambiguity.
Study Protocol vs
SAP
The study protocol and SAP are complementary documents that guide
different aspects of a research study. While they overlap in some areas,
they serve distinct purposes and audiences.
The following table gives some comparisons of the two formal
documents:
Types |
Study Protocol |
Statistical Analysis Plan (SAP) |
Purposes |
Describes the overall study design, objectives, and methodology.
Ensures ethical and scientific validity (used for approvals by IRBs, regulators).
Guides the conduct of the study (e.g., recruitment, interventions, data |
Provides detailed, technical instructions for statistical analysis.
Ensures reproducibility, transparency, and minimization of bias.
Acts as a binding pre-specification to prevent data-driven decisions (e.g., p-hacking). |
Contents |
Research question & hypotheses
Study population & eligibility criteria
Study design (randomized trial, cohort, case-control, etc.)
Data collection procedures
General statistical approach (but not highly technical details) |
Exact statistical models (e.g., regression formulas, survival analysis methods)
Handling of missing data, outliers, and covariates
Primary/secondary endpoint analysis (including multiplicity adjustments)
Sensitivity & subgroup analyses
Software & code specifications (if applicable) |
Audience |
Investigators, ethics committees, funding agencies |
Statisticians, data analysts, regulatory reviewers, peer reviewers |
The protocol and SAP are interdependent: The protocol sets the rules;
the SAP enforces them statistically. Here are some examples:
- SAP Expands on the Protocol
- The protocol states: “We will compare Group A and
Group B using regression analysis.”
- The SAP specifies: “A Cox proportional hazards
model will be used with covariates X, Y, Z. Hazard ratios will be
reported with 95% CIs. Missing data will be handled via multiple
imputation.”
- SAP is More Rigid (Pre-Specified)
- The protocol may allow minor methodological flexibility.
- The SAP locks in analysis details before data unblinding to prevent
bias.
- SAP is Often a Separate Document
- For simple studies, statistical methods may be fully described in
the protocol.
- For complex/high-stakes studies, a standalone SAP is required (e.g.,
clinical trials for FDA submission).
LS0tDQp0aXRsZTogJ0EgQnJpZWYgRGVzY3JpcHRpb24gb2YgQmFzaWMgQ29tcG9uZW50cyBvZiBBIFNBUCcNCmF1dGhvcjogIkNoZW5nIFBlbmciDQpkYXRlOiAiICINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBgez1odG1sfQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQovKiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIChDU1MpIGlzIGEgc3R5bGVzaGVldCBsYW5ndWFnZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBwcmVzZW50YXRpb24gb2YgYSBkb2N1bWVudCB3cml0dGVuIGluIEhUTUwgb3IgWE1MLiBpdCBpcyBhIHNpbXBsZSBtZWNoYW5pc20gZm9yIGFkZGluZyBzdHlsZSAoZS5nLiwgZm9udHMsIGNvbG9ycywgc3BhY2luZykgdG8gV2ViIGRvY3VtZW50cy4gKi8NCg0KaDEudGl0bGUgeyAgLyogVGl0bGUgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIHRoZSByZXBvcnQgdGl0bGUgKi8NCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkYXRlICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDIycHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KPC9zdHlsZT4NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJsZWFmbGV0IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKQ0KICAgbGlicmFyeShsZWFmbGV0KQ0KfQ0KaWYgKCFyZXF1aXJlKCJmYWN0b2V4dHJhIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImZhY3RvZXh0cmEiKQ0KICAgbGlicmFyeShmYWN0b2V4dHJhKQ0KfQ0KaWYgKCFyZXF1aXJlKCJUU3N0dWRpbyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJUU3N0dWRpbyIpDQogICBsaWJyYXJ5KFRTc3R1ZGlvKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90cml4IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RyaXgiKQ0KbGlicmFyeShwbG90cml4KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3JpZGdlcyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3JpZGdlcyIpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJHR2FsbHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCmxpYnJhcnkoR0dhbGx5KQ0KfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkENCiAgICAgICAgICAgICAgICAgICAgICApICANCmBgYA0KDQpcDQoNCiMgSW50cm9kdWN0aW9uDQoNClJlZ2FyZGxlc3Mgb2YgdGhlIHJlc2VhcmNoIGRlc2lnbiwgc3RhdGlzdGljcyBhcmUgYSBjcnVjaWFsIGNvbXBvbmVudCBvZiByZXNlYXJjaCBzaW5jZSBpdCBhbGxvd3MgdGhlIHJlc2VhcmNoZXJzIHRvIHN1bW1hcml6ZSB0aGUgY29sbGVjdGVkIGRhdGEgYW5kIGdpdmUgaXQgdG8gb3RoZXJzIGZvciBpbnRlcnByZXRhdGlvbi4gDQoNCldlIG5lZWQgYSBkZWZpbmVkIGFuYWx5dGljIHBsYW4gYmVmb3JlIHdlIHN0YXJ0IGNvbGxlY3RpbmcgZGF0YS4gVGhlIFNBUCAoc3RhdGlzdGljYWwgYW5hbHlzaXMgcGxhbikgd2lsbCBkaXJlY3QgdXMgZnJvbSB0aGUgYmVnaW5uaW5nIHRvIHRoZSBjb25jbHVzaW9uLCBoZWxwIHVzIHN1bW1hcml6ZSBhbmQgZGVzY3JpYmUgdGhlIGRhdGEsIGFuZCB0ZXN0IG91ciBoeXBvdGhlc2VzLg0KDQoNClRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyBwbGFuIChTQVApIGRlc2NyaWJlcyB0aGUgaW50ZW5kZWQgY2xpbmljYWwgdHJpYWwgYW5hbHlzaXMuIFRoZSBTQVAgaXMgYSB0ZWNobmljYWwgZG9jdW1lbnQgdGhhdCBkZXNjcmliZXMgdGhlIHN0YXRpc3RpY2FsIG1ldGhvZHMgb2YgcmVzZWFyY2ggYW5hbHlzaXMsIGFzIG9wcG9zZWQgdG8gdGhlIHByb3RvY29sLCB3aGljaCByZXByZXNlbnRzIHRoZSBhbmFseXNpcy4NCg0KIyBXaGF0IGlzIGEgc3RhdGlzdGljYWwgYW5hbHlzaXMgcGxhbj8NCg0KKipTdGF0aXN0aWNhbCBBbmFseXNpcyBQbGFuIChTQVApKiogaXMgYSBkZXRhaWxlZCBkb2N1bWVudCBzcGVjaWZ5aW5nIGhvdyBkYXRhIHdpbGwgYmUgYW5hbHl6ZWQsIGVuc3VyaW5nIHRyYW5zcGFyZW5jeSwgcmVwcm9kdWNpYmlsaXR5LCBhbmQgbWluaW1pemF0aW9uIG9mIGJpYXMuDQoNCiogKipEYXRhIENvbGxlY3Rpb24qKg0KICArICoqUHJpbWFyeSBEYXRhKio6IENsZWFybHkgZGVmaW5lIHRoZSBtYWluIG91dGNvbWUgdmFyaWFibGVzIChlLmcuLCBjbGluaWNhbCBlbmRwb2ludHMsIHN1cnZleSByZXNwb25zZXMpLg0KICArICoqU2Vjb25kYXJ5IERhdGEqKjogU3BlY2lmeSBhZGRpdGlvbmFsIHZhcmlhYmxlcyAoZS5nLiwgY292YXJpYXRlcywgY29uZm91bmRlcnMpIGFuZCB0aGVpciBzb3VyY2VzLg0KICArICoqRGF0YSBIYW5kbGluZyoqOiBQcm9jZWR1cmVzIGZvciBtaXNzaW5nIGRhdGEsIG91dGxpZXJzLCBhbmQgdHJhbnNmb3JtYXRpb25zIChlLmcuLCBsb2ctdHJhbnNmb3JtYXRpb24gZm9yIHNrZXdlZCBkYXRhKS4NCg0KKiAqKk1ldGhvZHMgb2YgQW5hbHlzaXMqKg0KICArICoqRGVzY3JpcHRpdmUgU3RhdGlzdGljcyoqOiBTdW1tYXJpemUgZGF0YSAobWVhbnMsIHByb3BvcnRpb25zLCBTRHMsIHZpc3VhbGl6YXRpb25zKS4NCiAgKyAqKkluZmVyZW50aWFsIFN0YXRpc3RpY3MqKjogSHlwb3RoZXNpcyB0ZXN0aW5nLCBjb25maWRlbmNlIGludGVydmFscywgZWZmZWN0IHNpemVzLg0KICArICoqU29mdHdhcmUvVG9vbHMqKjogU3BlY2lmeSAoZS5nLiwgUiwgU0FTLCBTUFNTKSBhbmQgdmVyc2lvbnMuDQoNCiogKipQcmltYXJ5IEFuYWx5c2lzKioNCiAgKyBEZWZpbmUgdGhlIHByaW1hcnkgb3V0Y29tZShzKSBhbmQgc3RhdGlzdGljYWwgdGVzdChzKSAoZS5nLiwgdC10ZXN0LCBBTk9WQSwgcmVncmVzc2lvbikuDQogICsgU3RhdGUgaG93IHRoZSBwcmltYXJ5IGh5cG90aGVzaXMgd2lsbCBiZSB0ZXN0ZWQgKGUuZy4sIHN1cGVyaW9yaXR5LCBub24taW5mZXJpb3JpdHkpLg0KDQoqICoqQ29tcGFyaXNvbnMgJiBTaWduaWZpY2FuY2UgTGV2ZWxzKioNCiAgKyBQcmVkZWZpbmVkIENvbXBhcmlzb25zOiBTdWJncm91cCBhbmFseXNlcywgcGFpcndpc2UgY29tcGFyaXNvbnMgKGFkanVzdCBmb3IgbXVsdGlwbGUgdGVzdGluZyBpZiBuZWVkZWQpLg0KICArIEFscGhhIChTaWduaWZpY2FuY2UgTGV2ZWwpOiBUeXBpY2FsbHkgMC4wNSwgd2l0aCBqdXN0aWZpY2F0aW9uIGlmIGFkanVzdGVkLg0KICArICoqUG93ZXIgQW5hbHlzaXMqKjogU2FtcGxlIHNpemUganVzdGlmaWNhdGlvbiBiYXNlZCBvbiBleHBlY3RlZCBlZmZlY3Qgc2l6ZS4NCg0KKiAqKkV4cGxvcmF0b3J5IERhdGEgQW5hbHlzZXMgKEVEQSkqKg0KICArIFVucGxhbm5lZCBhbmFseXNlcyB0byBpZGVudGlmeSBwYXR0ZXJucyAoZS5nLiwgdHJlbmRzLCBpbnRlcmFjdGlvbnMpLg0KICArIENsYXJpZnkgdGhhdCByZXN1bHRzIGFyZSBoeXBvdGhlc2lzLWdlbmVyYXRpbmcgKG5vdCBjb25maXJtYXRvcnkpLg0KDQoqICoqU3RhdGlzdGljYWwgTW9kZWxzKioNCiAgKyAqKlByaW1hcnkgTW9kZWwqKjogU3BlY2lmeSAoZS5nLiwgbGluZWFyIHJlZ3Jlc3Npb24sIGxvZ2lzdGljIHJlZ3Jlc3Npb24sIENveCBtb2RlbCkuDQogICsgKipSZXNwb25zZSBWYXJpYWJsZSoqOiBDbGVhcmx5IGRlZmluZWQgKGUuZy4sIGJsb29kIHByZXNzdXJlLCBzdXJ2aXZhbCB0aW1lKS4NCiAgKyAqKlByZWRpY3RvcnMvQ292YXJpYXRlcyoqOiBMaXN0IGluY2x1ZGVkIHZhcmlhYmxlcyBhbmQgcmF0aW9uYWxlLg0KICArICoqQWx0ZXJuYXRpdmUgTW9kZWxzKio6IFJvYnVzdG5lc3MgY2hlY2tzIChlLmcuLCBzZW5zaXRpdml0eSBhbmFseXNlcywgZGlmZmVyZW50IGNvdmFyaWF0ZSBhZGp1c3RtZW50cykuDQoNCg0KDQojIElkZW50aWZ5aW5nIHRoZSBuZWVkIGZvciBhbiBTQVANCg0KV2hpbGUgYSBzdHVkeSBwcm90b2NvbCBvdXRsaW5lcyB0aGUgZ2VuZXJhbCByZXNlYXJjaCBtZXRob2RvbG9neSwgYW4gU0FQIHByb3ZpZGVzIGEgZGVlcGVyLCB0ZWNobmljYWwgc3BlY2lmaWNhdGlvbiBvZiBzdGF0aXN0aWNhbCBwcm9jZWR1cmVzLiBIZXJl4oCZcyB3aGVuIGFuIFNBUCBiZWNvbWVzIGVzc2VudGlhbDoNCg0KKiAqKkhpZ2gtUmlzayBvciBSZWd1bGF0ZWQgU3R1ZGllcyoqDQogICsgKipDbGluaWNhbCB0cmlhbHMqKiAoZXNwZWNpYWxseSBQaGFzZSBJSS9JSUkpIHJlcXVpcmluZyByZWd1bGF0b3J5IGFwcHJvdmFsIChGREEsIEVNQSkuDQogICsgKipTdHVkaWVzIHdpdGggbWFqb3IgY2xpbmljYWwvcHVibGljIGhlYWx0aCBpbXBsaWNhdGlvbnMqKiAoZS5nLiwgZHJ1ZyBlZmZpY2FjeSwgcG9saWN5IGRlY2lzaW9ucykuDQogICsgKipQcmUtc3BlY2lmaWVkIGFuYWx5c2VzIHRvIHByZXZlbnQgYmlhcyoqIChlLmcuLCBhdm9pZGluZyBzZWxlY3RpdmUgcmVwb3J0aW5nKS4NCg0KKiAqKkNvbXBsZXggU3RhdGlzdGljYWwgTWV0aG9kcyoqDQogICsgKipBZHZhbmNlZCBtb2RlbGluZyoqIChlLmcuLCBtaXhlZC1lZmZlY3RzIG1vZGVscywgc3Vydml2YWwgYW5hbHlzaXMsIG1hY2hpbmUgbGVhcm5pbmcpLg0KICArICoqQWRhcHRpdmUgdHJpYWwgZGVzaWducyoqIChpbnRlcmltIGFuYWx5c2VzLCBCYXllc2lhbiBtZXRob2RzKS4NCiAgKyAqKkhhbmRsaW5nIG1pc3NpbmcgZGF0YSoqIChtdWx0aXBsZSBpbXB1dGF0aW9uLCBpbnZlcnNlIHByb2JhYmlsaXR5IHdlaWdodGluZykuDQoNCiogKipMYXJnZSBvciBNdWx0aS1DZW50ZXIgU3R1ZGllcyoqDQogICsgRW5zdXJlcyBjb25zaXN0ZW5jeSBhY3Jvc3Mgc2l0ZXMvYW5hbHlzdHMuDQogICsgUHJldmVudHMgcG9zdC1ob2MgZGVjaXNpb25zIHRoYXQgY291bGQgaW50cm9kdWNlIGJpYXMuDQoNCiogKipSZXByb2R1Y2liaWxpdHkgJiBUcmFuc3BhcmVuY3kqKg0KICArIE5lZWRlZCBmb3IgcGVlci1yZXZpZXdlZCBqb3VybmFscyAoZS5nLiwgSUNNSkUsIENPTlNPUlQgcmVxdWlyZW1lbnRzKS4NCiAgKyBBbGxvd3MgYW4gaW5kZXBlbmRlbnQgc3RhdGlzdGljaWFuIHRvIHJlcGxpY2F0ZSBhbmFseXNlcyB3aXRob3V0IGFtYmlndWl0eS4NCg0KDQoNCiMgU3R1ZHkgUHJvdG9jb2wgdnMgU0FQDQoNClRoZSBzdHVkeSBwcm90b2NvbCBhbmQgU0FQIGFyZSBjb21wbGVtZW50YXJ5IGRvY3VtZW50cyB0aGF0IGd1aWRlIGRpZmZlcmVudCBhc3BlY3RzIG9mIGEgcmVzZWFyY2ggc3R1ZHkuIFdoaWxlIHRoZXkgb3ZlcmxhcCBpbiBzb21lIGFyZWFzLCB0aGV5IHNlcnZlIGRpc3RpbmN0IHB1cnBvc2VzIGFuZCBhdWRpZW5jZXMuDQoNClRoZSBmb2xsb3dpbmcgdGFibGUgZ2l2ZXMgc29tZSBjb21wYXJpc29ucyBvZiB0aGUgdHdvIGZvcm1hbCBkb2N1bWVudHM6DQoNCmBgYHs9aHRtbH0NCjx0YWJsZSBib3JkZXI9IjEiPg0KICA8dHI+DQogICAgPHRoPiBUeXBlcyA8L3RoPg0KICAgIDx0aD5TdHVkeSBQcm90b2NvbDwvdGg+DQogICAgPHRoPlN0YXRpc3RpY2FsIEFuYWx5c2lzIFBsYW4gKFNBUCk8L3RoPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkPlB1cnBvc2VzPC90ZD4NCiAgICA8dGQ+IDxsaT4gRGVzY3JpYmVzIHRoZSBvdmVyYWxsIHN0dWR5IGRlc2lnbiwgb2JqZWN0aXZlcywgYW5kIG1ldGhvZG9sb2d5Lg0KICAgICAgICAgPGxpPiBFbnN1cmVzIGV0aGljYWwgYW5kIHNjaWVudGlmaWMgdmFsaWRpdHkgKHVzZWQgZm9yIGFwcHJvdmFscyBieSBJUkJzLCByZWd1bGF0b3JzKS4NCiAgICAgICAgIDxsaT4gR3VpZGVzIHRoZSBjb25kdWN0IG9mIHRoZSBzdHVkeSAoZS5nLiwgcmVjcnVpdG1lbnQsIGludGVydmVudGlvbnMsIGRhdGE8L3RkPg0KICAgIDx0ZD4gPGxpPiBQcm92aWRlcyBkZXRhaWxlZCwgdGVjaG5pY2FsIGluc3RydWN0aW9ucyBmb3Igc3RhdGlzdGljYWwgYW5hbHlzaXMuDQogICAgICAgICA8bGk+IEVuc3VyZXMgcmVwcm9kdWNpYmlsaXR5LCB0cmFuc3BhcmVuY3ksIGFuZCBtaW5pbWl6YXRpb24gb2YgYmlhcy4NCiAgICAgICAgIDxsaT4gQWN0cyBhcyBhIGJpbmRpbmcgcHJlLXNwZWNpZmljYXRpb24gdG8gcHJldmVudCBkYXRhLWRyaXZlbiBkZWNpc2lvbnMgKGUuZy4sIHAtaGFja2luZykuPC90ZD4NCiAgPC90cj4NCiAgDQogIDx0cj4NCiAgICA8dGQ+Q29udGVudHM8L3RkPg0KICAgIDx0ZD4gPGxpPiBSZXNlYXJjaCBxdWVzdGlvbiAmIGh5cG90aGVzZXMNCiAgICAgICAgIDxsaT4gU3R1ZHkgcG9wdWxhdGlvbiAmIGVsaWdpYmlsaXR5IGNyaXRlcmlhDQogICAgICAgICA8bGk+IFN0dWR5IGRlc2lnbiAocmFuZG9taXplZCB0cmlhbCwgY29ob3J0LCBjYXNlLWNvbnRyb2wsIGV0Yy4pDQogICAgICAgICA8bGk+IERhdGEgY29sbGVjdGlvbiBwcm9jZWR1cmVzDQogICAgICAgICA8bGk+IEdlbmVyYWwgc3RhdGlzdGljYWwgYXBwcm9hY2ggKGJ1dCBub3QgaGlnaGx5IHRlY2huaWNhbCBkZXRhaWxzKTwvdGQ+DQogICAgPHRkPiA8bGk+IEV4YWN0IHN0YXRpc3RpY2FsIG1vZGVscyAoZS5nLiwgcmVncmVzc2lvbiBmb3JtdWxhcywgc3Vydml2YWwgYW5hbHlzaXMgbWV0aG9kcykNCiAgICAgICAgIDxsaT4gSGFuZGxpbmcgb2YgbWlzc2luZyBkYXRhLCBvdXRsaWVycywgYW5kIGNvdmFyaWF0ZXMNCiAgICAgICAgIDxsaT4gUHJpbWFyeS9zZWNvbmRhcnkgZW5kcG9pbnQgYW5hbHlzaXMgKGluY2x1ZGluZyBtdWx0aXBsaWNpdHkgYWRqdXN0bWVudHMpDQogICAgICAgICA8bGk+IFNlbnNpdGl2aXR5ICYgc3ViZ3JvdXAgYW5hbHlzZXMNCiAgICAgICAgIDxsaT4gU29mdHdhcmUgJiBjb2RlIHNwZWNpZmljYXRpb25zIChpZiBhcHBsaWNhYmxlKTwvdGQ+DQogIDwvdHI+DQogIA0KICA8dHI+DQogICAgPHRkPkF1ZGllbmNlPC90ZD4NCiAgICA8dGQ+SW52ZXN0aWdhdG9ycywgZXRoaWNzIGNvbW1pdHRlZXMsIGZ1bmRpbmcgYWdlbmNpZXM8L3RkPg0KICAgIDx0ZD5TdGF0aXN0aWNpYW5zLCBkYXRhIGFuYWx5c3RzLCByZWd1bGF0b3J5IHJldmlld2VycywgcGVlciByZXZpZXdlcnMgPC90ZD4NCiAgPC90cj4NCjwvdGFibGU+DQpgYGANCg0KDQpUaGUgcHJvdG9jb2wgYW5kIFNBUCBhcmUgaW50ZXJkZXBlbmRlbnQ6IFRoZSBwcm90b2NvbCBzZXRzIHRoZSBydWxlczsgdGhlIFNBUCBlbmZvcmNlcyB0aGVtIHN0YXRpc3RpY2FsbHkuIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6DQoNCiogKipTQVAgRXhwYW5kcyBvbiB0aGUgUHJvdG9jb2wqKg0KICArICoqVGhlIHByb3RvY29sKiogc3RhdGVzOiAiV2Ugd2lsbCBjb21wYXJlIEdyb3VwIEEgYW5kIEdyb3VwIEIgdXNpbmcgcmVncmVzc2lvbiBhbmFseXNpcy4iDQogICsgKipUaGUgU0FQKiogc3BlY2lmaWVzOiAiQSBDb3ggcHJvcG9ydGlvbmFsIGhhemFyZHMgbW9kZWwgd2lsbCBiZSB1c2VkIHdpdGggY292YXJpYXRlcyBYLCBZLCBaLiBIYXphcmQgcmF0aW9zIHdpbGwgYmUgcmVwb3J0ZWQgd2l0aCA5NSUgQ0lzLiBNaXNzaW5nIGRhdGEgd2lsbCBiZSBoYW5kbGVkIHZpYSBtdWx0aXBsZSBpbXB1dGF0aW9uLiINCg0KDQoqICoqU0FQIGlzIE1vcmUgUmlnaWQgKFByZS1TcGVjaWZpZWQpKioNCiAgKyBUaGUgcHJvdG9jb2wgbWF5IGFsbG93IG1pbm9yIG1ldGhvZG9sb2dpY2FsIGZsZXhpYmlsaXR5Lg0KICArIFRoZSBTQVAgbG9ja3MgaW4gYW5hbHlzaXMgZGV0YWlscyBiZWZvcmUgZGF0YSB1bmJsaW5kaW5nIHRvIHByZXZlbnQgYmlhcy4NCg0KKiAqKlNBUCBpcyBPZnRlbiBhIFNlcGFyYXRlIERvY3VtZW50KioNCiAgKyBGb3Igc2ltcGxlIHN0dWRpZXMsIHN0YXRpc3RpY2FsIG1ldGhvZHMgbWF5IGJlIGZ1bGx5IGRlc2NyaWJlZCBpbiB0aGUgcHJvdG9jb2wuDQogICsgRm9yIGNvbXBsZXgvaGlnaC1zdGFrZXMgc3R1ZGllcywgYSBzdGFuZGFsb25lIFNBUCBpcyByZXF1aXJlZCAoZS5nLiwgY2xpbmljYWwgdHJpYWxzIGZvciBGREEgc3VibWlzc2lvbikuDQoNCg0KIyBLZXkgSW5mb3JtYXRpb24gaW4gdGhlIFNBUA0KDQpUaGUgU0FQIHNob3VsZCBjb250YWluIHZhcmlvdXMgc2FtcGxlIHNpemUgY2FsY3VsYXRpb25zIGZvciBkaWZmZXJlbnQgc3RhdGlzdGljYWwgcHJvY2VkdXJlcyB0byBhY2hpZXZlIGNlcnRhaW4gc3RhdGlzdGljYWwgcG93ZXIgYW5kIGEgdGhvcm91Z2ggZXhwbGFuYXRpb24gb2YgdGhlIG1haW4gYW5kIGFueSBpbnRlcmltIGFuYWx5c2VzIHVzZWQgaW4gdGhlIGRhdGEgYW5hbHlzaXMgdGVjaG5pcXVlLiANCg0KVGhlIFNBUCBzaG91bGQgYWxzbyB0aG9yb3VnaGx5IGV4cGxhaW4gdGhlIHByb2NlZHVyZXMgdXNlZCB0byBhbmFseXplIGFuZCBkaXNwbGF5IHRoZSBzdHVkeSByZXN1bHRzLg0KDQoqICoqU3RhdGlzdGljYWwgU2lnbmlmaWNhbmNlKiog4oCTIFRoZSBwcmVkZWZpbmVkIGxldmVsIG9mIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSAoZS5nLiwgzrEgPSAwLjA1KSBhbmQgd2hldGhlciBvbmUtdGFpbGVkIG9yIHR3by10YWlsZWQgdGVzdHMgd2lsbCBiZSBlbXBsb3llZC4NCg0KKiAqKk1pc3NpbmcgRGF0YSBIYW5kbGluZyoqIOKAkyBNZXRob2RzIGZvciBhZGRyZXNzaW5nIG1pc3NpbmcgZGF0YSAoZS5nLiwgaW1wdXRhdGlvbiB0ZWNobmlxdWVzLCBjb21wbGV0ZS1jYXNlIGFuYWx5c2lzKS4NCg0KKiAqKk91dGxpZXIgTWFuYWdlbWVudCoqIOKAkyBBcHByb2FjaGVzIGZvciBpZGVudGlmeWluZyBhbmQgaGFuZGxpbmcgb3V0bGllcnMuDQoNCiogKipFc3RpbWF0aW9uIE1ldGhvZHMqKiDigJMgVGVjaG5pcXVlcyBmb3IgcG9pbnQgYW5kIGludGVydmFsIGVzdGltYXRpb24uDQoNCiogKipDb21wb3NpdGUvRGVyaXZlZCBWYXJpYWJsZXMqKiDigJMgUnVsZXMgZm9yIGNhbGN1bGF0aW5nIGNvbXBvc2l0ZSBvciBkZXJpdmVkIHZhcmlhYmxlcywgaW5jbHVkaW5nIGRhdGEtZHJpdmVuIGRlZmluaXRpb25zLCB3aXRoIHN1ZmZpY2llbnQgZGV0YWlsIHRvIG1pbmltaXplIGFtYmlndWl0eS4NCg0KKiAqKkJhc2VsaW5lIGFuZCBDb3ZhcmlhdGUgRGF0YSoqIOKAkyBIb3cgYmFzZWxpbmUgYW5kIGNvdmFyaWF0ZSBkYXRhIHdpbGwgYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGFuYWx5c2lzLg0KDQoqICoqUmFuZG9taXphdGlvbiBGYWN0b3JzKiog4oCTIEluY2x1c2lvbiBvZiByYW5kb21pemF0aW9uIGZhY3RvcnMgKGlmIGFwcGxpY2FibGUpLg0KDQoqICoqTXVsdGktc291cmNlcyBEYXRhIEhhbmRsaW5nKiog4oCTIE1ldGhvZHMgZm9yIG1hbmFnaW5nIGRhdGEgZnJvbSBtdWx0aXBsZSBzb3VyY2VzLg0KDQoqICoqTXVsdGlwbGUgQ29tcGFyaXNvbnMgJiBTdWJncm91cCBBbmFseXNpcyoqIOKAkyBNZXRob2RzIGZvciBhZGp1c3RpbmcgZm9yIG11bHRpcGxlIGNvbXBhcmlzb25zIGFuZCBjb25kdWN0aW5nIHN1Ymdyb3VwIGFuYWx5c2VzLg0KDQoqICoqSW50ZXJpbS9TZXF1ZW50aWFsIEFuYWx5c2VzKiog4oCTIERldGFpbHMgb2YgYW55IHBsYW5uZWQgaW50ZXJpbSBvciBzZXF1ZW50aWFsIGFuYWx5c2VzLg0KDQoqICoqU29mdHdhcmUgU3BlY2lmaWNhdGlvbnMqKiDigJMgSWRlbnRpZmljYXRpb24gb2YgdGhlIGNvbXB1dGVyIHN5c3RlbXMgYW5kIHN0YXRpc3RpY2FsIHNvZnR3YXJlIHBhY2thZ2VzIHVzZWQgZm9yIGRhdGEgYW5hbHlzaXMuDQoNCiogKipBc3N1bXB0aW9ucyAmIFNlbnNpdGl2aXR5IEFuYWx5c2VzKiog4oCTIENyaXRpY2FsIGFzc3VtcHRpb25zIG9mIHRoZSBzdGF0aXN0aWNhbCBtb2RlbHMgYW5kIG1ldGhvZHMgZm9yIGNvbmR1Y3Rpbmcgc2Vuc2l0aXZpdHkgYW5hbHlzZXMgdG8gdmFsaWRhdGUgdGhlc2UgYXNzdW1wdGlvbnMuDQoNCiogKipEYXRhIFByZXNlbnRhdGlvbioqIOKAkyBHdWlkZWxpbmVzIGZvciB0YWJsZXMgYW5kIGZpZ3VyZXMgdG8gcHJlc2VudCBzdHVkeSBkYXRhLg0KDQoqICoqU2FmZXR5IFBvcHVsYXRpb24gRGVmaW5pdGlvbioqIOKAkyBBIGNsZWFyIGRlZmluaXRpb24gb2YgdGhlIHNhZmV0eSBwb3B1bGF0aW9uLg0KDQoqICoqTW9kZWwgVmFsaWRhdGlvbiAmIEFsdGVybmF0aXZlcyoqIOKAkyBQcm92aXNpb25zIGZvciB0ZXN0aW5nIHRoZSBzdGF0aXN0aWNhbCBtb2RlbCBhbmQgYWx0ZXJuYXRpdmUgbWV0aG9kcyBpZiBtb2RlbCBhc3N1bXB0aW9ucyBhcmUgdmlvbGF0ZWQuDQoNCg0KPGZvbnQgY29sb3IgPSAicmVkIj4qXGNvbG9ye3JlZH1UaGUgU0FQIG11c3QgaW5jbHVkZSBwcm92aXNpb25zIGZvciB0ZXN0aW5nIHRoZSBzdGF0aXN0aWNhbCBtb2RlbCwgYWxvbmcgd2l0aCBhbHRlcm5hdGl2ZSBtZXRob2RzIHRvIGJlIHVzZWQgaWYgdGhlIG1vZGVsIGFzc3VtcHRpb25zIGFyZSBub3QgbWV0Lio8L2ZvbnQ+DQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==