WHO Immunization Implementation Guide
1.0.0 - release
WHO Immunization Implementation Guide, published by WHO. This guide is not an authorized publication; it is the continuous build for version 1.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/WorldHealthOrganization/smart-immunizations/tree/132/merge and changes regularly. See the Directory of published versions
| Draft as of 2026-03-31 |
<Library xmlns="http://hl7.org/fhir">
<id value="IMMZIndicatorElements"/>
<meta>
<profile
value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"/>
<profile
value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"/>
<profile
value="http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"/>
<profile
value="http://hl7.org/fhir/uv/cql/StructureDefinition/cql-module"/>
</meta>
<text>
<status value="extensions"/>
<div xmlns="http://www.w3.org/1999/xhtml">
<div>
<table class="grid dict">
<tr>
<th scope="row"><b>Title: </b></th>
<td style="padding-left: 4px;">IMMZIndicatorElements</td>
</tr>
<tr>
<th scope="row"><b>Id: </b></th>
<td style="padding-left: 4px;">IMMZIndicatorElements</td>
</tr>
<tr>
<th scope="row"><b>Version: </b></th>
<td style="padding-left: 4px;">1.0.0</td>
</tr>
<tr>
<th scope="row"><b>Url: </b></th>
<td style="padding-left: 4px;"><a href="Library-IMMZIndicatorElements.html">IMMZIndicatorElements</a></td>
</tr>
<tr>
<th scope="row"><b>Status: </b></th>
<td style="padding-left: 4px;">draft</td>
</tr>
<tr>
<th scope="row"><b>Experimental: </b></th>
<td style="padding-left: 4px;">true</td>
</tr>
<tr>
<th scope="row"><b>Type: </b></th>
<td style="padding-left: 4px;">
<p style="margin-bottom: 5px;">
<b>system: </b> <span><a href="http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html">http://terminology.hl7.org/CodeSystem/library-type</a></span>
</p>
<p style="margin-bottom: 5px;">
<b>code: </b> <span>logic-library</span>
</p>
</td>
</tr>
<tr>
<th scope="row"><b>Date: </b></th>
<td style="padding-left: 4px;">2026-03-31 13:54:17+0000</td>
</tr>
<tr>
<th scope="row"><b>Publisher: </b></th>
<td style="padding-left: 4px;">WHO</td>
</tr>
<tr>
<th scope="row"><b>Description: </b></th>
<td style="padding-left: 4px;"><div><p>This library defines indicator-based elements and terminologies used throughout the Immunization CPG indicators</p>
</div></td>
</tr>
<tr>
<th scope="row"><b>Related Artifacts: </b></th>
<td style="padding-left: 4px;">
<p><b>Dependencies</b></p>
<ul>
<li><a href="Library-WHOConcepts.html">WHOConcepts</a></li>
<li><a href="Library-WHOCommon.html">WHOCommon</a></li>
<li><a href="Library-IMMZConcepts.html">IMMZConcepts</a></li>
<li><a href="Library-IMMZAgeConcepts.html">IMMZAgeConcepts</a></li>
<li><a href="Library-IMMZCommon.html">IMMZCommon</a></li>
<li><a href="Library-IMMZElements.html">IMMZElements</a></li>
<li><a href="http://hl7.org/fhir/R4/codesystem-administrative-gender.html">AdministrativeGender</a></li>
</ul>
</td>
</tr>
<tr>
<th scope="row"><b>Parameters: </b></th>
<td style="padding-left: 4px;">
<table class="grid-dict">
<tr><th><b>Name</b></th><th><b>Type</b></th><th><b>Min</b></th><th><b>Max</b></th><th><b>In/Out</b></th></tr>
<tr><th>Measurement Period</th><th>Period</th><th>0</th><th>1</th><th>In</th></tr>
<tr><th>Patient</th><th>Patient</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Newborn By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Infant By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Toddler By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Child By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Adolescent By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>By Age Group Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>By Administrative Gender Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>By Geographic Region Stratifier</th><th>string</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Patient Deceased During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Patient Born During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Patient Under 12 Months Old During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Patient Under 2 Years Old During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>
<tr><th>Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>Adverse Events During Measurement Period</th><th>AdverseEvent</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>Immunizations And Adverse Events During Measurement Period</th><th>Resource</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>Pentavalent Doses Administered to Patient</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>Pentavalent Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>Measles and Rubella Doses Administered to Patient</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>Measles and Rubella Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>COVID-19 Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>Adverse Events for Immunization</th><th>AdverseEvent</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>Immunizations with Adverse Events During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>
<tr><th>Adverse Event Reactions During Measurement Period</th><th>AdverseEvent</th><th>0</th><th>*</th><th>Out</th></tr>
</table>
</td>
</tr>
<tr>
<th scope="row"><b>Data Requirements:</b></th>
<td style="padding-left: 4px;">
<table class="grid-dict">
<tr><th><b>Type</b></th><th><b>Profile</b></th><th><b>MS</b></th><th><b>Code Filter</b></th></tr>
<tr>
<th>AdverseEvent</th>
<th>http://hl7.org/fhir/StructureDefinition/AdverseEvent</th>
<th/>
<th>
</th>
</tr>
<tr>
<th>AdverseEvent</th>
<th>http://hl7.org/fhir/StructureDefinition/AdverseEvent</th>
<th/>
<th>
</th>
</tr>
<tr>
<th>Location</th>
<th>http://hl7.org/fhir/StructureDefinition/Location</th>
<th/>
<th>
</th>
</tr>
<tr>
<th>Location</th>
<th>http://hl7.org/fhir/StructureDefinition/Location</th>
<th/>
<th>
</th>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2">
<table>
<tr><th><a id="cql-content"><b>Content: </b></a> text/cql</th></tr>
<tr><td><pre><code class="language-cql">/**
* Immunization Indicator Elements by Patients as Context
*/
library IMMZIndicatorElements
using FHIR version '4.0.1'
include FHIRHelpers version '4.0.1'
include WHOConcepts
include WHOCommon called WC
include IMMZConcepts called Concepts
include IMMZAgeConcepts called Age
include IMMZCommon called Common
include IMMZElements called Elements
codesystem "Administrative Gender Codes": 'http://hl7.org/fhir/administrative-gender'
code "Males" : 'male' from "Administrative Gender Codes" display 'Males'
code "Females" : 'female' from "Administrative Gender Codes" display 'Females'
code "Other" : 'other' from "Administrative Gender Codes" display 'Other/NA'
parameter "Measurement Period" Interval<Date> default Interval[@2025-01-01, @2025-12-31]
context Patient
/*
@stratifier: Age in Years
*/
define "Age Stratifier":
case
when AgeInYearsAt(end of "Measurement Period") < 1 then Age."P0Y--P1Y"
when AgeInYearsAt(end of "Measurement Period") < 2 then Age."P1Y--P2Y"
when AgeInYearsAt(end of "Measurement Period") < 3 then Age."P2Y--P3Y"
when AgeInYearsAt(end of "Measurement Period") < 4 then Age."P3Y--P4Y"
when AgeInYearsAt(end of "Measurement Period") < 5 then Age."P4Y--P5Y"
when AgeInYearsAt(end of "Measurement Period") < 6 then Age."P5Y--P6Y"
when AgeInYearsAt(end of "Measurement Period") < 7 then Age."P6Y--P7Y"
when AgeInYearsAt(end of "Measurement Period") < 8 then Age."P7Y--P8Y"
when AgeInYearsAt(end of "Measurement Period") < 9 then Age."P8Y--P9Y"
when AgeInYearsAt(end of "Measurement Period") < 10 then Age."P9Y--P10Y"
when AgeInYearsAt(end of "Measurement Period") < 11 then Age."P10Y--P11Y"
when AgeInYearsAt(end of "Measurement Period") < 12 then Age."P11Y--P12Y"
when AgeInYearsAt(end of "Measurement Period") < 13 then Age."P12Y--P13Y"
when AgeInYearsAt(end of "Measurement Period") < 14 then Age."P13Y--P14Y"
when AgeInYearsAt(end of "Measurement Period") < 15 then Age."P14Y--P15Y"
when AgeInYearsAt(end of "Measurement Period") < 16 then Age."P15Y--P16Y"
when AgeInYearsAt(end of "Measurement Period") < 17 then Age."P16Y--P17Y"
when AgeInYearsAt(end of "Measurement Period") < 18 then Age."P17Y--P18Y"
when AgeInYearsAt(end of "Measurement Period") < 19 then Age."P18Y--P19Y"
when AgeInYearsAt(end of "Measurement Period") < 20 then Age."P19Y--P20Y"
when AgeInYearsAt(end of "Measurement Period") < 21 then Age."P20Y--P21Y"
when AgeInYearsAt(end of "Measurement Period") < 22 then Age."P21Y--P22Y"
when AgeInYearsAt(end of "Measurement Period") < 23 then Age."P22Y--P23Y"
when AgeInYearsAt(end of "Measurement Period") < 24 then Age."P23Y--P24Y"
when AgeInYearsAt(end of "Measurement Period") < 25 then Age."P24Y--P25Y"
when AgeInYearsAt(end of "Measurement Period") < 26 then Age."P25Y--P26Y"
when AgeInYearsAt(end of "Measurement Period") < 27 then Age."P26Y--P27Y"
when AgeInYearsAt(end of "Measurement Period") < 28 then Age."P27Y--P28Y"
when AgeInYearsAt(end of "Measurement Period") < 29 then Age."P28Y--P29Y"
when AgeInYearsAt(end of "Measurement Period") < 30 then Age."P29Y--P30Y"
when AgeInYearsAt(end of "Measurement Period") < 31 then Age."P30Y--P31Y"
when AgeInYearsAt(end of "Measurement Period") < 32 then Age."P31Y--P32Y"
when AgeInYearsAt(end of "Measurement Period") < 33 then Age."P32Y--P33Y"
when AgeInYearsAt(end of "Measurement Period") < 34 then Age."P33Y--P34Y"
when AgeInYearsAt(end of "Measurement Period") < 35 then Age."P34Y--P35Y"
when AgeInYearsAt(end of "Measurement Period") < 36 then Age."P35Y--P36Y"
when AgeInYearsAt(end of "Measurement Period") < 37 then Age."P36Y--P37Y"
when AgeInYearsAt(end of "Measurement Period") < 38 then Age."P37Y--P38Y"
when AgeInYearsAt(end of "Measurement Period") < 39 then Age."P38Y--P39Y"
when AgeInYearsAt(end of "Measurement Period") < 40 then Age."P39Y--P40Y"
when AgeInYearsAt(end of "Measurement Period") < 41 then Age."P40Y--P41Y"
when AgeInYearsAt(end of "Measurement Period") < 42 then Age."P41Y--P42Y"
when AgeInYearsAt(end of "Measurement Period") < 43 then Age."P42Y--P43Y"
when AgeInYearsAt(end of "Measurement Period") < 44 then Age."P43Y--P44Y"
when AgeInYearsAt(end of "Measurement Period") < 45 then Age."P44Y--P45Y"
when AgeInYearsAt(end of "Measurement Period") < 46 then Age."P45Y--P46Y"
when AgeInYearsAt(end of "Measurement Period") < 47 then Age."P46Y--P47Y"
when AgeInYearsAt(end of "Measurement Period") < 48 then Age."P47Y--P48Y"
when AgeInYearsAt(end of "Measurement Period") < 49 then Age."P48Y--P49Y"
when AgeInYearsAt(end of "Measurement Period") < 50 then Age."P49Y--P50Y"
when AgeInYearsAt(end of "Measurement Period") < 51 then Age."P50Y--P51Y"
when AgeInYearsAt(end of "Measurement Period") < 52 then Age."P51Y--P52Y"
when AgeInYearsAt(end of "Measurement Period") < 53 then Age."P52Y--P53Y"
when AgeInYearsAt(end of "Measurement Period") < 54 then Age."P53Y--P54Y"
when AgeInYearsAt(end of "Measurement Period") < 55 then Age."P54Y--P55Y"
when AgeInYearsAt(end of "Measurement Period") < 56 then Age."P55Y--P56Y"
when AgeInYearsAt(end of "Measurement Period") < 57 then Age."P56Y--P57Y"
when AgeInYearsAt(end of "Measurement Period") < 58 then Age."P57Y--P58Y"
when AgeInYearsAt(end of "Measurement Period") < 59 then Age."P58Y--P59Y"
when AgeInYearsAt(end of "Measurement Period") < 60 then Age."P59Y--P60Y"
when AgeInYearsAt(end of "Measurement Period") < 61 then Age."P60Y--P61Y"
when AgeInYearsAt(end of "Measurement Period") < 62 then Age."P61Y--P62Y"
when AgeInYearsAt(end of "Measurement Period") < 63 then Age."P62Y--P63Y"
when AgeInYearsAt(end of "Measurement Period") < 64 then Age."P63Y--P64Y"
when AgeInYearsAt(end of "Measurement Period") < 65 then Age."P64Y--P65Y"
when AgeInYearsAt(end of "Measurement Period") < 66 then Age."P65Y--P66Y"
when AgeInYearsAt(end of "Measurement Period") < 67 then Age."P66Y--P67Y"
when AgeInYearsAt(end of "Measurement Period") < 68 then Age."P67Y--P68Y"
when AgeInYearsAt(end of "Measurement Period") < 69 then Age."P68Y--P69Y"
when AgeInYearsAt(end of "Measurement Period") < 70 then Age."P69Y--P70Y"
when AgeInYearsAt(end of "Measurement Period") < 71 then Age."P70Y--P71Y"
when AgeInYearsAt(end of "Measurement Period") < 72 then Age."P71Y--P72Y"
when AgeInYearsAt(end of "Measurement Period") < 73 then Age."P72Y--P73Y"
when AgeInYearsAt(end of "Measurement Period") < 74 then Age."P73Y--P74Y"
when AgeInYearsAt(end of "Measurement Period") < 75 then Age."P74Y--P75Y"
when AgeInYearsAt(end of "Measurement Period") < 76 then Age."P75Y--P76Y"
when AgeInYearsAt(end of "Measurement Period") < 77 then Age."P76Y--P77Y"
when AgeInYearsAt(end of "Measurement Period") < 78 then Age."P77Y--P78Y"
when AgeInYearsAt(end of "Measurement Period") < 79 then Age."P78Y--P79Y"
when AgeInYearsAt(end of "Measurement Period") < 80 then Age."P79Y--P80Y"
when AgeInYearsAt(end of "Measurement Period") < 81 then Age."P80Y--P81Y"
when AgeInYearsAt(end of "Measurement Period") < 82 then Age."P81Y--P82Y"
when AgeInYearsAt(end of "Measurement Period") < 83 then Age."P82Y--P83Y"
when AgeInYearsAt(end of "Measurement Period") < 84 then Age."P83Y--P84Y"
when AgeInYearsAt(end of "Measurement Period") < 85 then Age."P84Y--P85Y"
when AgeInYearsAt(end of "Measurement Period") < 86 then Age."P85Y--P86Y"
when AgeInYearsAt(end of "Measurement Period") < 87 then Age."P86Y--P87Y"
when AgeInYearsAt(end of "Measurement Period") < 88 then Age."P87Y--P88Y"
when AgeInYearsAt(end of "Measurement Period") < 89 then Age."P88Y--P89Y"
when AgeInYearsAt(end of "Measurement Period") < 90 then Age."P89Y--P90Y"
when AgeInYearsAt(end of "Measurement Period") < 91 then Age."P90Y--P91Y"
when AgeInYearsAt(end of "Measurement Period") < 92 then Age."P91Y--P92Y"
when AgeInYearsAt(end of "Measurement Period") < 93 then Age."P92Y--P93Y"
when AgeInYearsAt(end of "Measurement Period") < 94 then Age."P93Y--P94Y"
when AgeInYearsAt(end of "Measurement Period") < 95 then Age."P94Y--P95Y"
when AgeInYearsAt(end of "Measurement Period") < 96 then Age."P95Y--P96Y"
when AgeInYearsAt(end of "Measurement Period") < 97 then Age."P96Y--P97Y"
when AgeInYearsAt(end of "Measurement Period") < 98 then Age."P97Y--P98Y"
when AgeInYearsAt(end of "Measurement Period") < 99 then Age."P98Y--P99Y"
when AgeInYearsAt(end of "Measurement Period") < 100 then Age."P99Y--P100Y"
when AgeInYearsAt(end of "Measurement Period") >= 100 then Age."P100Y--P9999Y"
else null
end
/*
@stratifier: Infant disaggregations by age
*/
define "Newborn By Age Stratifier":
case
when AgeInHoursAt(end of "Measurement Period") <= 24 then Age."PT0H--PT24H"
when AgeInWeeksAt(end of "Measurement Period") <= 2 then Age."PT24H--P2W"
when AgeInWeeksAt(end of "Measurement Period") > 2 then Age."P2W--P9999Y"
else null
end
/*
@stratifier: Infant disaggregations by age
*/
define "Infant By Age Stratifier":
case
when AgeInYearsAt(end of "Measurement Period") < 1 then Age."P0Y--P1Y"
when AgeInYearsAt(end of "Measurement Period") >= 1 then Age."P1Y--P9999Y"
else null
end
/*
@stratifier: Toddler By Age Stratifiers
*/
define "Toddler By Age Stratifier":
case
when AgeInYearsAt(end of "Measurement Period") < 1 then Age."P0Y--P1Y"
when AgeInYearsAt(end of "Measurement Period") < 2 then Age."P1Y--P2Y"
when AgeInYearsAt(end of "Measurement Period") >= 2 then Age."P2Y--P9999Y"
else null
end
/*
@stratifier: Child By Age Stratifiers
*/
define "Child By Age Stratifier":
case
when AgeInYearsAt(end of "Measurement Period") < 1 then Age."P0Y--P1Y"
when AgeInYearsAt(end of "Measurement Period") < 3 then Age."P1Y--P3Y"
when AgeInYearsAt(end of "Measurement Period") < 6 then Age."P3Y--P6Y"
when AgeInYearsAt(end of "Measurement Period") < 13 then Age."P6Y--P13Y"
when AgeInYearsAt(end of "Measurement Period") >= 13 then Age."P13Y--P9999Y"
else null
end
/*
@stratifier: Adolescent By Age Stratifiers
*/
define "Adolescent By Age Stratifier":
case
when AgeInYearsAt(end of "Measurement Period") < 9 then Age."P0Y--P9Y"
when AgeInYearsAt(end of "Measurement Period") <= 14 then Age."P9Y--P15Y"
when AgeInYearsAt(end of "Measurement Period") > 14 then Age."P15Y--P9999Y"
else null
end
/*
@stratifier: Age Group Stratifier
*/
define "By Age Group Stratifier":
case
when AgeInYearsAt(end of "Measurement Period") < 18 then Age."P0Y--P18Y"
when AgeInYearsAt(end of "Measurement Period") < 30 then Age."P18Y--P30Y"
when AgeInYearsAt(end of "Measurement Period") < 50 then Age."P30Y--P50Y"
when AgeInYearsAt(end of "Measurement Period") < 70 then Age."P50Y--P70Y"
when AgeInYearsAt(end of "Measurement Period") >= 70 then Age."P70Y--P9999Y"
else null
end
/*
@stratifier: By Administrative Gender of Patient Stratifier
*/
define "By Administrative Gender Stratifier":
case
when Patient.gender = 'male' then "Males"
when Patient.gender = 'female' then "Females"
else "Other"
end
/*
@stratifier: By Geographic Region of Patient Stratifier
*/
define "By Geographic Region Stratifier":
First(Patient.address A where A.use in { 'home' }).state
/**
* @dataElement Patient is deceased
*/
define "Patient Deceased During Measurement Period":
case
when Patient.deceased is FHIR.boolean then Patient.deceased as FHIR.boolean
when Patient.deceased is FHIR.dateTime then Patient.deceased as FHIR.dateTime before end of "Measurement Period"
else false
end
/**
* Patient was born during measurement period
*/
define "Patient Born During Measurement Period":
Patient.birthDate during "Measurement Period"
/**
* Patient is < 12 months old at the end of the measurement period
*/
define "Patient Under 12 Months Old During Measurement Period":
Patient.birthDate less than 12 months before end of "Measurement Period"
/**
* Patient is < 12 years old at the end of the measurement period
*/
define "Patient Under 2 Years Old During Measurement Period":
Patient.birthDate less than 2 years before end of "Measurement Period"
/**
* @define Doses which were administered during the measurement period
*/
define "Doses Administered to Patient During Measurement Period":
Elements."Doses Administered to Patient" I
where I.occurrence.toInterval() starts during "Measurement Period"
define "Adverse Events During Measurement Period":
[AdverseEvent] AE
where AE.date.toInterval() starts during "Measurement Period"
/*
[Observation: WHOConcepts."Adverse Events"] O
where O.effective.toInterval() during "Measurement Period"
*/
define "Immunizations And Adverse Events During Measurement Period":
from
"Doses Administered to Patient During Measurement Period" I,
"Adverse Events During Measurement Period" O
where I.reaction.detail.references(O)
return { immunization: I, adverseEvent: O }
define "Pentavalent Doses Administered to Patient":
Elements."Doses Administered to Patient" I
where I.vaccineCode in Concepts."Pentavalent vaccines"
define "Pentavalent Doses Administered to Patient During Measurement Period":
"Pentavalent Doses Administered to Patient" I
where I.occurrence.toInterval() starts during "Measurement Period"
define "Measles and Rubella Doses Administered to Patient":
Elements."Doses Administered to Patient" I
where I.vaccineCode in Concepts."Measles and rubella-containing vaccines"
define "Measles and Rubella Doses Administered to Patient During Measurement Period":
"Measles and Rubella Doses Administered to Patient" I
where I.occurrence.toInterval() starts during "Measurement Period"
define "COVID-19 Doses Administered to Patient During Measurement Period":
"Doses Administered to Patient During Measurement Period" I
where I.vaccineCode in Concepts."COVID-19 vaccines"
define "Adverse Events for Immunization":
[AdverseEvent] AE
where AE.actuality = 'actual'
/**
* @define Adverse events for immunizations which occurred during (or observed) during measurement period
*/
define "Immunizations with Adverse Events During Measurement Period":
"Immunizations And Adverse Events During Measurement Period" I
return I.immunization
/**
* @define Adverse events for immunizations which occurred during (or observed) during measurement period
*/
define "Adverse Event Reactions During Measurement Period":
"Immunizations And Adverse Events During Measurement Period" I
return I.adverseEvent
/**
* @function
* @param immunization The immunization record for which the location should be retrieved
* @return FHIR.address The location that the immunization event occurred
*/
define function GetGeographicRegionForImmunization(immunization Immunization):
(
[Location] L
where immunization.location.references(L)
).only().address.state
/**
* @function
* @param immunization The immunization record for which the location should be retrieved
* @return FHIR.name The name of the location that the immunization event occurred
*/
define function GetLocationNameForImmunization(immunization Immunization):
(
[Location] L
where immunization.location.references(L)
).only().name
</code></pre></td></tr>
</table>
</td>
</tr>
</table>
</div>
</div>
</text>
<extension
url="http://hl7.org/fhir/StructureDefinition/cqf-knowledgeCapability">
<valueCode value="computable"/>
</extension>
<url
value="http://smart.who.int/immunizations-measles/Library/IMMZIndicatorElements"/>
<version value="1.0.0"/>
<name value="IMMZIndicatorElements"/>
<title value="IMMZIndicatorElements"/>
<status value="draft"/>
<experimental value="true"/>
<type>
<coding>
<system value="http://terminology.hl7.org/CodeSystem/library-type"/>
<code value="logic-library"/>
</coding>
</type>
<date value="2026-03-31T13:54:17+00:00"/>
<publisher value="WHO"/>
<contact>
<name value="WHO"/>
<telecom>
<system value="url"/>
<value value="http://who.int"/>
</telecom>
</contact>
<description
value="This library defines indicator-based elements and terminologies used throughout the Immunization CPG indicators"/>
<relatedArtifact>
<type value="depends-on"/>
<display value="Library WHOConcepts"/>
<resource value="http://smart.who.int/immunizations/Library/WHOConcepts"/>
</relatedArtifact>
<relatedArtifact>
<type value="depends-on"/>
<display value="Library WC"/>
<resource value="http://smart.who.int/immunizations/Library/WHOCommon"/>
</relatedArtifact>
<relatedArtifact>
<type value="depends-on"/>
<display value="Library Concepts"/>
<resource
value="http://smart.who.int/immunizations/Library/IMMZConcepts"/>
</relatedArtifact>
<relatedArtifact>
<type value="depends-on"/>
<display value="Library Age"/>
<resource
value="http://smart.who.int/immunizations/Library/IMMZAgeConcepts"/>
</relatedArtifact>
<relatedArtifact>
<type value="depends-on"/>
<display value="Library Common"/>
<resource value="http://smart.who.int/immunizations/Library/IMMZCommon"/>
</relatedArtifact>
<relatedArtifact>
<type value="depends-on"/>
<display value="Library Elements"/>
<resource
value="http://smart.who.int/immunizations/Library/IMMZElements"/>
</relatedArtifact>
<relatedArtifact>
<type value="depends-on"/>
<display value="Code System Administrative Gender Codes"/>
<resource value="http://hl7.org/fhir/administrative-gender"/>
</relatedArtifact>
<parameter>
<name value="Measurement Period"/>
<use value="in"/>
<min value="0"/>
<max value="1"/>
<type value="Period"/>
</parameter>
<parameter>
<name value="Patient"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="Patient"/>
</parameter>
<parameter>
<name value="Age Stratifier"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="Coding"/>
</parameter>
<parameter>
<name value="Newborn By Age Stratifier"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="Coding"/>
</parameter>
<parameter>
<name value="Infant By Age Stratifier"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="Coding"/>
</parameter>
<parameter>
<name value="Toddler By Age Stratifier"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="Coding"/>
</parameter>
<parameter>
<name value="Child By Age Stratifier"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="Coding"/>
</parameter>
<parameter>
<name value="Adolescent By Age Stratifier"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="Coding"/>
</parameter>
<parameter>
<name value="By Age Group Stratifier"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="Coding"/>
</parameter>
<parameter>
<name value="By Administrative Gender Stratifier"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="Coding"/>
</parameter>
<parameter>
<name value="By Geographic Region Stratifier"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="string"/>
</parameter>
<parameter>
<name value="Patient Deceased During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="boolean"/>
</parameter>
<parameter>
<name value="Patient Born During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="boolean"/>
</parameter>
<parameter>
<name value="Patient Under 12 Months Old During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="boolean"/>
</parameter>
<parameter>
<name value="Patient Under 2 Years Old During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="1"/>
<type value="boolean"/>
</parameter>
<parameter>
<name value="Doses Administered to Patient During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="Immunization"/>
</parameter>
<parameter>
<name value="Adverse Events During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="AdverseEvent"/>
</parameter>
<parameter>
<name value="Immunizations And Adverse Events During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="Resource"/>
</parameter>
<parameter>
<name value="Pentavalent Doses Administered to Patient"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="Immunization"/>
</parameter>
<parameter>
<name
value="Pentavalent Doses Administered to Patient During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="Immunization"/>
</parameter>
<parameter>
<name value="Measles and Rubella Doses Administered to Patient"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="Immunization"/>
</parameter>
<parameter>
<name
value="Measles and Rubella Doses Administered to Patient During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="Immunization"/>
</parameter>
<parameter>
<name
value="COVID-19 Doses Administered to Patient During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="Immunization"/>
</parameter>
<parameter>
<name value="Adverse Events for Immunization"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="AdverseEvent"/>
</parameter>
<parameter>
<name
value="Immunizations with Adverse Events During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="Immunization"/>
</parameter>
<parameter>
<name value="Adverse Event Reactions During Measurement Period"/>
<use value="out"/>
<min value="0"/>
<max value="*"/>
<type value="AdverseEvent"/>
</parameter>
<dataRequirement>
<type value="AdverseEvent"/>
<profile value="http://hl7.org/fhir/StructureDefinition/AdverseEvent"/>
</dataRequirement>
<dataRequirement>
<type value="AdverseEvent"/>
<profile value="http://hl7.org/fhir/StructureDefinition/AdverseEvent"/>
</dataRequirement>
<dataRequirement>
<type value="Location"/>
<profile value="http://hl7.org/fhir/StructureDefinition/Location"/>
</dataRequirement>
<dataRequirement>
<type value="Location"/>
<profile value="http://hl7.org/fhir/StructureDefinition/Location"/>
</dataRequirement>
<content>
<contentType value="text/cql"/>
<data
value="LyoqCiAqIEltbXVuaXphdGlvbiBJbmRpY2F0b3IgRWxlbWVudHMgYnkgUGF0aWVudHMgYXMgQ29udGV4dAogKi8KCmxpYnJhcnkgSU1NWkluZGljYXRvckVsZW1lbnRzCgp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBGSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgV0hPQ29uY2VwdHMKaW5jbHVkZSBXSE9Db21tb24gY2FsbGVkIFdDCgppbmNsdWRlIElNTVpDb25jZXB0cyBjYWxsZWQgQ29uY2VwdHMKaW5jbHVkZSBJTU1aQWdlQ29uY2VwdHMgY2FsbGVkIEFnZQppbmNsdWRlIElNTVpDb21tb24gY2FsbGVkIENvbW1vbgppbmNsdWRlIElNTVpFbGVtZW50cyBjYWxsZWQgRWxlbWVudHMKCgoKY29kZXN5c3RlbSAiQWRtaW5pc3RyYXRpdmUgR2VuZGVyIENvZGVzIjogJ2h0dHA6Ly9obDcub3JnL2ZoaXIvYWRtaW5pc3RyYXRpdmUtZ2VuZGVyJwpjb2RlICJNYWxlcyIgOiAnbWFsZScgZnJvbSAiQWRtaW5pc3RyYXRpdmUgR2VuZGVyIENvZGVzIiBkaXNwbGF5ICdNYWxlcycKY29kZSAiRmVtYWxlcyIgOiAnZmVtYWxlJyBmcm9tICJBZG1pbmlzdHJhdGl2ZSBHZW5kZXIgQ29kZXMiIGRpc3BsYXkgJ0ZlbWFsZXMnCmNvZGUgIk90aGVyIiA6ICdvdGhlcicgZnJvbSAiQWRtaW5pc3RyYXRpdmUgR2VuZGVyIENvZGVzIiBkaXNwbGF5ICdPdGhlci9OQScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlPiBkZWZhdWx0IEludGVydmFsW0AyMDI1LTAxLTAxLCBAMjAyNS0xMi0zMV0KCmNvbnRleHQgUGF0aWVudAoKLyoKQHN0cmF0aWZpZXI6IEFnZSBpbiBZZWFycwoqLwpkZWZpbmUgIkFnZSBTdHJhdGlmaWVyIjoKICBjYXNlCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMSB0aGVuIEFnZS4iUDBZLS1QMVkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMiB0aGVuIEFnZS4iUDFZLS1QMlkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMyB0aGVuIEFnZS4iUDJZLS1QM1kiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNCB0aGVuIEFnZS4iUDNZLS1QNFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNSB0aGVuIEFnZS4iUDRZLS1QNVkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNiB0aGVuIEFnZS4iUDVZLS1QNlkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNyB0aGVuIEFnZS4iUDZZLS1QN1kiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgOCB0aGVuIEFnZS4iUDdZLS1QOFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgOSB0aGVuIEFnZS4iUDhZLS1QOVkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMTAgdGhlbiBBZ2UuIlA5WS0tUDEwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMSB0aGVuIEFnZS4iUDEwWS0tUDExWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMiB0aGVuIEFnZS4iUDExWS0tUDEyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMyB0aGVuIEFnZS4iUDEyWS0tUDEzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNCB0aGVuIEFnZS4iUDEzWS0tUDE0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNSB0aGVuIEFnZS4iUDE0WS0tUDE1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNiB0aGVuIEFnZS4iUDE1WS0tUDE2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNyB0aGVuIEFnZS4iUDE2WS0tUDE3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxOCB0aGVuIEFnZS4iUDE3WS0tUDE4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxOSB0aGVuIEFnZS4iUDE4WS0tUDE5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMCB0aGVuIEFnZS4iUDE5WS0tUDIwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMSB0aGVuIEFnZS4iUDIwWS0tUDIxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMiB0aGVuIEFnZS4iUDIxWS0tUDIyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMyB0aGVuIEFnZS4iUDIyWS0tUDIzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNCB0aGVuIEFnZS4iUDIzWS0tUDI0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNSB0aGVuIEFnZS4iUDI0WS0tUDI1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNiB0aGVuIEFnZS4iUDI1WS0tUDI2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNyB0aGVuIEFnZS4iUDI2WS0tUDI3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyOCB0aGVuIEFnZS4iUDI3WS0tUDI4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyOSB0aGVuIEFnZS4iUDI4WS0tUDI5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMCB0aGVuIEFnZS4iUDI5WS0tUDMwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMSB0aGVuIEFnZS4iUDMwWS0tUDMxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMiB0aGVuIEFnZS4iUDMxWS0tUDMyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMyB0aGVuIEFnZS4iUDMyWS0tUDMzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNCB0aGVuIEFnZS4iUDMzWS0tUDM0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNSB0aGVuIEFnZS4iUDM0WS0tUDM1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNiB0aGVuIEFnZS4iUDM1WS0tUDM2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNyB0aGVuIEFnZS4iUDM2WS0tUDM3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzOCB0aGVuIEFnZS4iUDM3WS0tUDM4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzOSB0aGVuIEFnZS4iUDM4WS0tUDM5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MCB0aGVuIEFnZS4iUDM5WS0tUDQwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MSB0aGVuIEFnZS4iUDQwWS0tUDQxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MiB0aGVuIEFnZS4iUDQxWS0tUDQyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MyB0aGVuIEFnZS4iUDQyWS0tUDQzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NCB0aGVuIEFnZS4iUDQzWS0tUDQ0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NSB0aGVuIEFnZS4iUDQ0WS0tUDQ1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NiB0aGVuIEFnZS4iUDQ1WS0tUDQ2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NyB0aGVuIEFnZS4iUDQ2WS0tUDQ3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0OCB0aGVuIEFnZS4iUDQ3WS0tUDQ4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0OSB0aGVuIEFnZS4iUDQ4WS0tUDQ5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MCB0aGVuIEFnZS4iUDQ5WS0tUDUwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MSB0aGVuIEFnZS4iUDUwWS0tUDUxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MiB0aGVuIEFnZS4iUDUxWS0tUDUyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MyB0aGVuIEFnZS4iUDUyWS0tUDUzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NCB0aGVuIEFnZS4iUDUzWS0tUDU0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NSB0aGVuIEFnZS4iUDU0WS0tUDU1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NiB0aGVuIEFnZS4iUDU1WS0tUDU2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NyB0aGVuIEFnZS4iUDU2WS0tUDU3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1OCB0aGVuIEFnZS4iUDU3WS0tUDU4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1OSB0aGVuIEFnZS4iUDU4WS0tUDU5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MCB0aGVuIEFnZS4iUDU5WS0tUDYwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MSB0aGVuIEFnZS4iUDYwWS0tUDYxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MiB0aGVuIEFnZS4iUDYxWS0tUDYyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MyB0aGVuIEFnZS4iUDYyWS0tUDYzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NCB0aGVuIEFnZS4iUDYzWS0tUDY0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NSB0aGVuIEFnZS4iUDY0WS0tUDY1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NiB0aGVuIEFnZS4iUDY1WS0tUDY2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NyB0aGVuIEFnZS4iUDY2WS0tUDY3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2OCB0aGVuIEFnZS4iUDY3WS0tUDY4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2OSB0aGVuIEFnZS4iUDY4WS0tUDY5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MCB0aGVuIEFnZS4iUDY5WS0tUDcwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MSB0aGVuIEFnZS4iUDcwWS0tUDcxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MiB0aGVuIEFnZS4iUDcxWS0tUDcyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MyB0aGVuIEFnZS4iUDcyWS0tUDczWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NCB0aGVuIEFnZS4iUDczWS0tUDc0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NSB0aGVuIEFnZS4iUDc0WS0tUDc1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NiB0aGVuIEFnZS4iUDc1WS0tUDc2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NyB0aGVuIEFnZS4iUDc2WS0tUDc3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3OCB0aGVuIEFnZS4iUDc3WS0tUDc4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3OSB0aGVuIEFnZS4iUDc4WS0tUDc5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MCB0aGVuIEFnZS4iUDc5WS0tUDgwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MSB0aGVuIEFnZS4iUDgwWS0tUDgxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MiB0aGVuIEFnZS4iUDgxWS0tUDgyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MyB0aGVuIEFnZS4iUDgyWS0tUDgzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NCB0aGVuIEFnZS4iUDgzWS0tUDg0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NSB0aGVuIEFnZS4iUDg0WS0tUDg1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NiB0aGVuIEFnZS4iUDg1WS0tUDg2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NyB0aGVuIEFnZS4iUDg2WS0tUDg3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4OCB0aGVuIEFnZS4iUDg3WS0tUDg4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4OSB0aGVuIEFnZS4iUDg4WS0tUDg5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MCB0aGVuIEFnZS4iUDg5WS0tUDkwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MSB0aGVuIEFnZS4iUDkwWS0tUDkxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MiB0aGVuIEFnZS4iUDkxWS0tUDkyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MyB0aGVuIEFnZS4iUDkyWS0tUDkzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NCB0aGVuIEFnZS4iUDkzWS0tUDk0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NSB0aGVuIEFnZS4iUDk0WS0tUDk1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NiB0aGVuIEFnZS4iUDk1WS0tUDk2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NyB0aGVuIEFnZS4iUDk2WS0tUDk3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5OCB0aGVuIEFnZS4iUDk3WS0tUDk4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5OSB0aGVuIEFnZS4iUDk4WS0tUDk5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMDAgdGhlbiBBZ2UuIlA5OVktLVAxMDBZIgogICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxMDAgdGhlbiBBZ2UuIlAxMDBZLS1QOTk5OVkiCiAgICBlbHNlIG51bGwKICBlbmQKCi8qIApAc3RyYXRpZmllcjogSW5mYW50IGRpc2FnZ3JlZ2F0aW9ucyBieSBhZ2UKKi8KZGVmaW5lICJOZXdib3JuIEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJbkhvdXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8PSAyNCB0aGVuIEFnZS4iUFQwSC0tUFQyNEgiCiAgICAgICAgd2hlbiBBZ2VJbldlZWtzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8PSAyIHRoZW4gQWdlLiJQVDI0SC0tUDJXIgogICAgICAgIHdoZW4gQWdlSW5XZWVrc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPiAyIHRoZW4gQWdlLiJQMlctLVA5OTk5WSIKICAgICAgICBlbHNlIG51bGwKICAgIGVuZAoKLyoKQHN0cmF0aWZpZXI6IEluZmFudCBkaXNhZ2dyZWdhdGlvbnMgYnkgYWdlCiovCmRlZmluZSAiSW5mYW50IEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEgdGhlbiBBZ2UuIlAwWS0tUDFZIgogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPj0gMSB0aGVuIEFnZS4iUDFZLS1QOTk5OVkiCiAgICAgICAgZWxzZSBudWxsCiAgICBlbmQKCi8qIApAc3RyYXRpZmllcjogVG9kZGxlciBCeSBBZ2UgU3RyYXRpZmllcnMKKi8KZGVmaW5lICJUb2RkbGVyIEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEgdGhlbiBBZ2UuIlAwWS0tUDFZIgogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyIHRoZW4gQWdlLiJQMVktLVAyWSIKICAgICAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDIgdGhlbiBBZ2UuIlAyWS0tUDk5OTlZIgogICAgICAgIGVsc2UgbnVsbAogICAgZW5kCgovKiAKQHN0cmF0aWZpZXI6IENoaWxkIEJ5IEFnZSBTdHJhdGlmaWVycwoqLwpkZWZpbmUgIkNoaWxkIEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEgdGhlbiBBZ2UuIlAwWS0tUDFZIgogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzIHRoZW4gQWdlLiJQMVktLVAzWSIKICAgICAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNiB0aGVuIEFnZS4iUDNZLS1QNlkiCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEzIHRoZW4gQWdlLiJQNlktLVAxM1kiCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxMyB0aGVuIEFnZS4iUDEzWS0tUDk5OTlZIgogICAgICAgIGVsc2UgbnVsbAogICAgZW5kCgovKiAKQHN0cmF0aWZpZXI6IEFkb2xlc2NlbnQgQnkgQWdlIFN0cmF0aWZpZXJzCiovCmRlZmluZSAiQWRvbGVzY2VudCBCeSBBZ2UgU3RyYXRpZmllciI6CiAgICBjYXNlIAogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5IHRoZW4gQWdlLiJQMFktLVA5WSIKICAgICAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDw9IDE0IHRoZW4gQWdlLiJQOVktLVAxNVkiCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+IDE0IHRoZW4gQWdlLiJQMTVZLS1QOTk5OVkiCiAgICAgICAgZWxzZSBudWxsCiAgICBlbmQKCi8qCkBzdHJhdGlmaWVyOiBBZ2UgR3JvdXAgU3RyYXRpZmllcgoqLwpkZWZpbmUgIkJ5IEFnZSBHcm91cCBTdHJhdGlmaWVyIjoKICBjYXNlIAogICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDE4IHRoZW4gQWdlLiJQMFktLVAxOFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMzAgdGhlbiBBZ2UuIlAxOFktLVAzMFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNTAgdGhlbiBBZ2UuIlAzMFktLVA1MFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNzAgdGhlbiBBZ2UuIlA1MFktLVA3MFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDcwIHRoZW4gQWdlLiJQNzBZLS1QOTk5OVkiCiAgICBlbHNlIG51bGwKICBlbmQKCi8qCkBzdHJhdGlmaWVyOiBCeSBBZG1pbmlzdHJhdGl2ZSBHZW5kZXIgb2YgUGF0aWVudCBTdHJhdGlmaWVyCiovCmRlZmluZSAiQnkgQWRtaW5pc3RyYXRpdmUgR2VuZGVyIFN0cmF0aWZpZXIiOgogICAgY2FzZSAKICAgICAgICB3aGVuIFBhdGllbnQuZ2VuZGVyID0gJ21hbGUnIHRoZW4gIk1hbGVzIgogICAgICAgIHdoZW4gUGF0aWVudC5nZW5kZXIgPSAnZmVtYWxlJyB0aGVuICJGZW1hbGVzIgogICAgICAgIGVsc2UgIk90aGVyIgogICAgZW5kCgovKgpAc3RyYXRpZmllcjogQnkgR2VvZ3JhcGhpYyBSZWdpb24gb2YgUGF0aWVudCBTdHJhdGlmaWVyCiovCmRlZmluZSAiQnkgR2VvZ3JhcGhpYyBSZWdpb24gU3RyYXRpZmllciI6CiAgICBGaXJzdChQYXRpZW50LmFkZHJlc3MgQSB3aGVyZSBBLnVzZSBpbiB7ICdob21lJyB9KS5zdGF0ZQoKLyoqIAogKiBAZGF0YUVsZW1lbnQgUGF0aWVudCBpcyBkZWNlYXNlZAogKi8KZGVmaW5lICJQYXRpZW50IERlY2Vhc2VkIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogIGNhc2UgCiAgICB3aGVuIFBhdGllbnQuZGVjZWFzZWQgaXMgRkhJUi5ib29sZWFuIHRoZW4gUGF0aWVudC5kZWNlYXNlZCBhcyBGSElSLmJvb2xlYW4KICAgIHdoZW4gUGF0aWVudC5kZWNlYXNlZCBpcyBGSElSLmRhdGVUaW1lIHRoZW4gUGF0aWVudC5kZWNlYXNlZCBhcyBGSElSLmRhdGVUaW1lIGJlZm9yZSBlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgIGVsc2UgZmFsc2UKICBlbmQKCi8qKiAKICogUGF0aWVudCB3YXMgYm9ybiBkdXJpbmcgbWVhc3VyZW1lbnQgcGVyaW9kCiAqLwpkZWZpbmUgIlBhdGllbnQgQm9ybiBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIjoKICAgIFBhdGllbnQuYmlydGhEYXRlIGR1cmluZyAiTWVhc3VyZW1lbnQgUGVyaW9kIgoKLyoqIAogKiBQYXRpZW50IGlzIDwgMTIgbW9udGhzIG9sZCBhdCB0aGUgZW5kIG9mIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QKICovCmRlZmluZSAiUGF0aWVudCBVbmRlciAxMiBNb250aHMgT2xkIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICAgUGF0aWVudC5iaXJ0aERhdGUgbGVzcyB0aGFuIDEyIG1vbnRocyBiZWZvcmUgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCgovKiogCiAqIFBhdGllbnQgaXMgPCAxMiB5ZWFycyBvbGQgYXQgdGhlIGVuZCBvZiB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kCiAqLwpkZWZpbmUgIlBhdGllbnQgVW5kZXIgMiBZZWFycyBPbGQgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgICBQYXRpZW50LmJpcnRoRGF0ZSBsZXNzIHRoYW4gMiB5ZWFycyBiZWZvcmUgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCgovKiogCiAqIEBkZWZpbmUgRG9zZXMgd2hpY2ggd2VyZSBhZG1pbmlzdGVyZWQgZHVyaW5nIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QKICovCmRlZmluZSAiRG9zZXMgQWRtaW5pc3RlcmVkIHRvIFBhdGllbnQgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgRWxlbWVudHMuIkRvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IiAgSQogICAgd2hlcmUgSS5vY2N1cnJlbmNlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIkFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogIFtBZHZlcnNlRXZlbnRdIEFFCiAgICB3aGVyZSBBRS5kYXRlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCi8qCiAgW09ic2VydmF0aW9uOiBXSE9Db25jZXB0cy4iQWR2ZXJzZSBFdmVudHMiXSBPCiAgICB3aGVyZSBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCiovCgpkZWZpbmUgIkltbXVuaXphdGlvbnMgQW5kIEFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogIGZyb20KICAgICJEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJLAogICAgIkFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIE8KICB3aGVyZSBJLnJlYWN0aW9uLmRldGFpbC5yZWZlcmVuY2VzKE8pCiAgcmV0dXJuIHsgaW1tdW5pemF0aW9uOiBJLCBhZHZlcnNlRXZlbnQ6IE8gfQoKZGVmaW5lICJQZW50YXZhbGVudCBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCI6CiAgRWxlbWVudHMuIkRvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IiBJIAogICAgd2hlcmUgSS52YWNjaW5lQ29kZSBpbiBDb25jZXB0cy4iUGVudGF2YWxlbnQgdmFjY2luZXMiCgpkZWZpbmUgIlBlbnRhdmFsZW50IERvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJQZW50YXZhbGVudCBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCIgSQogICAgd2hlcmUgSS5vY2N1cnJlbmNlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIk1lYXNsZXMgYW5kIFJ1YmVsbGEgRG9zZXMgQWRtaW5pc3RlcmVkIHRvIFBhdGllbnQiOgogIEVsZW1lbnRzLiJEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCIgSSAKICAgIHdoZXJlIEkudmFjY2luZUNvZGUgaW4gQ29uY2VwdHMuIk1lYXNsZXMgYW5kIHJ1YmVsbGEtY29udGFpbmluZyB2YWNjaW5lcyIKCmRlZmluZSAiTWVhc2xlcyBhbmQgUnViZWxsYSBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIjoKICAiTWVhc2xlcyBhbmQgUnViZWxsYSBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCIgSQogICAgd2hlcmUgSS5vY2N1cnJlbmNlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIkNPVklELTE5IERvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJIAogICAgd2hlcmUgSS52YWNjaW5lQ29kZSBpbiBDb25jZXB0cy4iQ09WSUQtMTkgdmFjY2luZXMiCgpkZWZpbmUgIkFkdmVyc2UgRXZlbnRzIGZvciBJbW11bml6YXRpb24iOgogIFtBZHZlcnNlRXZlbnRdIEFFCiAgICB3aGVyZSBBRS5hY3R1YWxpdHkgPSAnYWN0dWFsJwoKLyoqIAogKiBAZGVmaW5lIEFkdmVyc2UgZXZlbnRzIGZvciBpbW11bml6YXRpb25zIHdoaWNoIG9jY3VycmVkIGR1cmluZyAob3Igb2JzZXJ2ZWQpIGR1cmluZyBtZWFzdXJlbWVudCBwZXJpb2QKICovCmRlZmluZSAiSW1tdW5pemF0aW9ucyB3aXRoIEFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJJbW11bml6YXRpb25zIEFuZCBBZHZlcnNlIEV2ZW50cyBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJCiAgICByZXR1cm4gSS5pbW11bml6YXRpb24KCi8qKiAKICogQGRlZmluZSBBZHZlcnNlIGV2ZW50cyBmb3IgaW1tdW5pemF0aW9ucyB3aGljaCBvY2N1cnJlZCBkdXJpbmcgKG9yIG9ic2VydmVkKSBkdXJpbmcgbWVhc3VyZW1lbnQgcGVyaW9kCiAqLwpkZWZpbmUgIkFkdmVyc2UgRXZlbnQgUmVhY3Rpb25zIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJJbW11bml6YXRpb25zIEFuZCBBZHZlcnNlIEV2ZW50cyBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJCiAgICByZXR1cm4gSS5hZHZlcnNlRXZlbnQKCi8qKiAKICogQGZ1bmN0aW9uCiAqIEBwYXJhbSBpbW11bml6YXRpb24gVGhlIGltbXVuaXphdGlvbiByZWNvcmQgZm9yIHdoaWNoIHRoZSBsb2NhdGlvbiBzaG91bGQgYmUgcmV0cmlldmVkCiAqIEByZXR1cm4gRkhJUi5hZGRyZXNzIFRoZSBsb2NhdGlvbiB0aGF0IHRoZSBpbW11bml6YXRpb24gZXZlbnQgb2NjdXJyZWQKICovCmRlZmluZSBmdW5jdGlvbiBHZXRHZW9ncmFwaGljUmVnaW9uRm9ySW1tdW5pemF0aW9uKGltbXVuaXphdGlvbiBJbW11bml6YXRpb24pOgogICgKICAgIFtMb2NhdGlvbl0gTAogICAgICAgIHdoZXJlIGltbXVuaXphdGlvbi5sb2NhdGlvbi5yZWZlcmVuY2VzKEwpCiAgKS5vbmx5KCkuYWRkcmVzcy5zdGF0ZQoKLyoqIAogKiBAZnVuY3Rpb24KICogQHBhcmFtIGltbXVuaXphdGlvbiBUaGUgaW1tdW5pemF0aW9uIHJlY29yZCBmb3Igd2hpY2ggdGhlIGxvY2F0aW9uIHNob3VsZCBiZSByZXRyaWV2ZWQKICogQHJldHVybiBGSElSLm5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2F0aW9uIHRoYXQgdGhlIGltbXVuaXphdGlvbiBldmVudCBvY2N1cnJlZAogKi8KZGVmaW5lIGZ1bmN0aW9uIEdldExvY2F0aW9uTmFtZUZvckltbXVuaXphdGlvbihpbW11bml6YXRpb24gSW1tdW5pemF0aW9uKToKICAoCiAgICBbTG9jYXRpb25dIEwKICAgICAgICB3aGVyZSBpbW11bml6YXRpb24ubG9jYXRpb24ucmVmZXJlbmNlcyhMKQogICkub25seSgpLm5hbWUK"/>
</content>
</Library>