{
  "resourceType" : "Library",
  "id" : "CMS1218FHIRHHRF",
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n  <table class=\"narrative-table\">\n    <tbody>\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"metadata\"> </a>Metadata</th>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Version</th>\n\n\n\n<td class=\"content-container\">1.1.000</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Status</th>\n\n\n\n<td class=\"content-container\">Draft</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Type</th>\n\n\n\n<td class=\"content-container\">\n    <a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library\n\n\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"parameters\"> </a>Parameters</th>\n\n\n</tr>\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Parameter</th>\n\n\n\n<td class=\"content-container\">None</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n  <tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\">Library Content</th>\n\n\n</tr>\n  \n    \n    <tr>\n      <th scope=\"row\" class=\"row-header\">CQL Content</th>\n      <td>\n        <a name=\"cql-content\"> </a>\n        <pre style=\"border: none;\" class=\"content-container highlight language-cql\"><code class=\"language-cql\">/*\nNOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.\n*/\nlibrary CMS1218FHIRHHRF version '1.1.000'\n\nusing USQualityCore version '0.1.0-cibuild'\nusing USCore version '6.1.0-derived'\nusing FHIR version '4.0.1'\n\ninclude hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers\ninclude hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon\ninclude hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon\ninclude hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements\n\ninclude CQMCommon version '5.1.000' called CQMCommon\ninclude USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon\ninclude SupplementalDataElements version '6.1.000' called SDE\ninclude Status version '2.1.000' called Status\n\ncodesystem &quot;LOINC&quot;: 'http://loinc.org'\ncodesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'\ncodesystem &quot;LocationRoles&quot;: 'http://terminology.hl7.org/CodeSystem/v3-RoleCode'\n\nvalueset &quot;Acute Respiratory Failure&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.88'\nvalueset &quot;Albumin Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.221'\nvalueset &quot;Anesthesia Requiring Monitored Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.255'\nvalueset &quot;Arterial Blood pH&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.96'\nvalueset &quot;ASA Physical Status Class&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.217'\nvalueset &quot;Aspartate transaminase Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.224'\nvalueset &quot;Bicarbonate Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.139'\nvalueset &quot;Bilirubin Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.223'\nvalueset &quot;Blood Urea Nitrogen Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.218'\nvalueset &quot;Carbon Dioxide Partial Pressure In Arterial Blood&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.95'\nvalueset &quot;Creatinine Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.2363'\nvalueset &quot;Degenerative Neurological Disorder&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.241'\nvalueset &quot;Elective Inpatient Encounter&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.85'\nvalueset &quot;Emergency Department Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.292'\nvalueset &quot;General And Neuraxial Anesthesia&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.208'\nvalueset &quot;Head, Neck, And Thoracic Surgeries With High Risk Airway Compromise&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.251'\nvalueset &quot;Hematocrit Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.114'\nvalueset &quot;Hemoglobin Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.219'\nvalueset &quot;Intubation&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.179'\nvalueset &quot;Leukocyte Count Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.222'\nvalueset &quot;Mechanical Ventilation&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.107'\nvalueset &quot;Neuromuscular Disorder&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.239'\nvalueset &quot;Non Invasive Oxygen Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.213'\nvalueset &quot;Non Invasive Oxygen Therapy By Nasal Cannula Or Mask&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.209'\nvalueset &quot;Obstetrical Or Pregnancy Related Conditions&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.263'\nvalueset &quot;Oxygen Partial Pressure In Arterial Blood&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.94'\nvalueset &quot;Platelet Count Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.127'\nvalueset &quot;Present On Admission Or Clinically Undetermined&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197'\nvalueset &quot;Procedural Hospital Locations&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.216'\nvalueset &quot;Smoking Status&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.220'\nvalueset &quot;Sodium Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.119'\nvalueset &quot;Tracheostomy Diagnoses&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.89'\nvalueset &quot;Tracheostomy Procedures&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.181'\nvalueset &quot;White Blood Cells Count Lab Test&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.129'\n\ncode &quot;American society of anesthesiologists morbidity state&quot;: '97816-3' from &quot;LOINC&quot; display 'American society of anesthesiologists morbidity state'\ncode &quot;Body temperature&quot;: '8310-5' from &quot;LOINC&quot; display 'Body temperature'\ncode &quot;Elective (qualifier value)&quot;: '103390000' from &quot;SNOMEDCT&quot; display 'Elective (qualifier value)'\ncode &quot;Heart rate&quot;: '8867-4' from &quot;LOINC&quot; display 'Heart rate'\ncode &quot;Removal of endotracheal tube (procedure)&quot;: '271280005' from &quot;SNOMEDCT&quot; display 'Removal of endotracheal tube (procedure)'\ncode &quot;Respiratory rate&quot;: '9279-1' from &quot;LOINC&quot; display 'Respiratory rate'\ncode &quot;Systolic blood pressure&quot;: '8480-6' from &quot;LOINC&quot; display 'Systolic blood pressure'\ncode &quot;ER&quot;: 'ER' from &quot;LocationRoles&quot; display 'Emergency room'\n\nparameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;\n  default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine &quot;Initial Population&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot;\n\ndefine &quot;Denominator&quot;:\n  &quot;Initial Population&quot;\n\ndefine &quot;Denominator Exclusions&quot;:\n  &quot;Encounter With Degenerative Neurological Disorder&quot;\n    union &quot;Encounter With High Risk To Airway Head Neck And Thoracic Surgery&quot;\n    union &quot;Encounter With Mechanical Ventilation That Starts More Than One Hour Prior To Start Of First OR Procedure&quot;\n    union &quot;Encounter With Neuromuscular Disorder&quot;\n    union &quot;Encounter With PaCO2 Greater Than 50 And Arterial pH Less Than 7.30 Within 48 Hours Prior To Start Of First OR Procedure&quot;\n    union &quot;Encounter With PaO2 Less Than 50 Within 48 Hours Prior To Start Of First OR Procedure&quot;\n    union &quot;Encounter With Principal Diagnosis Of Acute Respiratory Failure&quot;\n    union &quot;Encounter With Diagnosis Of Acute Respiratory Failure Present On Admission&quot;\n    union &quot;Encounter With Tracheostomy Present On Admission&quot;\n    union &quot;Encounter With Tracheostomy Prior To Or On The Same Day Of First OR Procedure&quot;\n\ndefine &quot;Numerator&quot;:\n  &quot;Encounter With Intubation Outside Of Procedural Area Within 30 Days Of End Of First OR Procedure&quot;\n    union &quot;Encounter With Mechanical Ventilation Outside Of Procedural Area Within 30 Days Of End Of First OR Procedure And Preceded By Non Invasive Oxygen Therapy&quot;\n    union &quot;Encounter With Extubation Outside Of Procedural Area Within 30 Days Of End Of First OR Procedure More Than 48 Hours After End Of Anesthesia&quot;\n    union &quot;Encounter With Mechanical Ventilation Within 30 Days Of End Of First OR Procedure And Between 48 And 72 Hours After End Of OR Procedure And Not Preceded By Non Invasive Oxygen Therapy Or Anesthesia&quot;\n\ndefine &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot;:\n  &quot;Elective Inpatient Encounter With Age And Without Obstetrical Condition&quot; ElectiveEncounter\n    with [&quot;Procedure&quot;: &quot;General And Neuraxial Anesthesia&quot;] SurgeryWithAnesthesia\n      such that SurgeryWithAnesthesia.status = 'completed'\n        and SurgeryWithAnesthesia.performed.earliest ( ) during ElectiveEncounter.hospitalizationWithObservationAndOutpatientSurgeryService ( )\n        and SurgeryWithAnesthesia.performed.earliest ( ) 3 days or less after start of ElectiveEncounter.hospitalizationWithObservationAndOutpatientSurgeryService ( )\n\ndefine &quot;Encounter With Degenerative Neurological Disorder&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    where EncounterWithSurgery.reasonCode in &quot;Degenerative Neurological Disorder&quot;\n      or EncounterWithSurgery.encounterReason ( ).code in &quot;Degenerative Neurological Disorder&quot;\n\ndefine &quot;Encounter With High Risk To Airway Head Neck And Thoracic Surgery&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    with [&quot;Procedure&quot;: &quot;Head, Neck, And Thoracic Surgeries With High Risk Airway Compromise&quot;] HeadNeckProcedures\n      such that HeadNeckProcedures.status = 'completed'\n        and HeadNeckProcedures.startsDuringHospitalization ( EncounterWithSurgery )\n\ndefine &quot;Encounter With Mechanical Ventilation That Starts More Than One Hour Prior To Start Of First OR Procedure&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    with [&quot;Procedure&quot;: &quot;Mechanical Ventilation&quot;] Ventilation\n      such that Ventilation.status = 'completed'\n        and Ventilation.performed.toInterval ( ) starts more than 1 hour before start of EncounterWithSurgery.firstAnesthesiaDuringHospitalization ( ).performed.toInterval ( )\n        and Ventilation.startsDuringHospitalization ( EncounterWithSurgery )\n\ndefine &quot;Encounter With Neuromuscular Disorder&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    where EncounterWithSurgery.reasonCode in &quot;Neuromuscular Disorder&quot;\n      or EncounterWithSurgery.encounterReason ( ).code in &quot;Neuromuscular Disorder&quot;\n\ndefine &quot;Encounter With PaCO2 Greater Than 50 And Arterial pH Less Than 7.30 Within 48 Hours Prior To Start Of First OR Procedure&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    let FirstProcedureTime: EncounterWithSurgery.firstAnesthesiaDuringHospitalization ( ).performed.toInterval ( )\n    with [&quot;LaboratoryResultObservation&quot;: &quot;Carbon Dioxide Partial Pressure In Arterial Blood&quot;] CarbonDioxide\n      such that CarbonDioxide.status in { 'final', 'amended', 'corrected' }\n        and CarbonDioxide.effective.toInterval ( ) starts 48 hours or less before start of FirstProcedureTime\n        and CarbonDioxide.value as Quantity &gt; 50 'mm[Hg]'\n    with [&quot;LaboratoryResultObservation&quot;: &quot;Arterial Blood pH&quot;] BloodpH\n      such that BloodpH.status in { 'final', 'amended', 'corrected' }\n        and BloodpH.effective.toInterval ( ) starts 48 hours or less before start of FirstProcedureTime\n        and BloodpH.value as Quantity &lt; 7.30 '[pH]'\n\ndefine &quot;Encounter With PaO2 Less Than 50 Within 48 Hours Prior To Start Of First OR Procedure&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    let FirstProcedure: EncounterWithSurgery.firstAnesthesiaDuringHospitalization ( )\n    with [&quot;LaboratoryResultObservation&quot;: &quot;Oxygen Partial Pressure In Arterial Blood&quot;] Oxygen\n      such that Oxygen.status in { 'final', 'amended', 'corrected' }\n        and Oxygen.effective.toInterval ( ) starts 48 hours or less before start of FirstProcedure.performed.toInterval ( )\n        and Oxygen.value as Quantity &lt; 50 'mm[Hg]'\n\ndefine &quot;Encounter With Principal Diagnosis Of Acute Respiratory Failure&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    where EncounterWithSurgery.hasPrincipalDiagnosisOf ( &quot;Acute Respiratory Failure&quot; )\n\ndefine &quot;Encounter With Diagnosis Of Acute Respiratory Failure Present On Admission&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    where EncounterWithSurgery.isDiagnosisPresentOnAdmission ( &quot;Acute Respiratory Failure&quot;, &quot;Present On Admission Or Clinically Undetermined&quot; )\n\ndefine &quot;Encounter With Tracheostomy Present On Admission&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    where EncounterWithSurgery.isDiagnosisPresentOnAdmission ( &quot;Tracheostomy Diagnoses&quot;, &quot;Present On Admission Or Clinically Undetermined&quot; )\n\ndefine &quot;Encounter With Tracheostomy Prior To Or On The Same Day Of First OR Procedure&quot;:\n  &quot;Encounter With Tracheostomy Before Day Of First OR Procedure&quot;\n    union &quot;Encounter With Tracheostomy Same Day Of First OR Procedure&quot;\n\ndefine &quot;Encounter With Intubation Outside Of Procedural Area Within 30 Days Of End Of First OR Procedure&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    with [&quot;Procedure&quot;: &quot;Intubation&quot;] EndotrachealTubeIn\n      such that EndotrachealTubeIn.status = 'completed'\n        and EndotrachealTubeIn.starts30DaysOrLessAfterFirstAnesthesia ( EncounterWithSurgery )\n        and EndotrachealTubeIn.startsDuringHospitalization ( EncounterWithSurgery )\n        and EndotrachealTubeIn.performed.toInterval ( ) starts after end of EndotrachealTubeIn.latestGeneralAnesthesiaOrMAC ( ).performed.toInterval ( )\n        and EncounterWithSurgery.isNotAtProceduralHospitalLocationDuring ( EndotrachealTubeIn.performed.toInterval ( ) )\n        and not ( &quot;Intubation During General Anesthesia And MAC&quot;.id contains EndotrachealTubeIn.id )\n\ndefine &quot;Encounter With Mechanical Ventilation Outside Of Procedural Area Within 30 Days Of End Of First OR Procedure And Preceded By Non Invasive Oxygen Therapy&quot;:\n  from\n    &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery,\n    [&quot;Procedure&quot;: &quot;Mechanical Ventilation&quot;] Ventilation,\n    &quot;Noninvasive Oxygen Therapy&quot; OxygenSupport\n    let VentilationInterval: Ventilation.performed.toInterval ( ),\n    LatestAnesthesiaInterval: Ventilation.latestGeneralAnesthesiaOrMAC ( ).performed.toInterval ( )\n    where Ventilation.status = 'completed'\n      and Ventilation.starts30DaysOrLessAfterFirstAnesthesia ( EncounterWithSurgery )\n      and Ventilation.startsDuringHospitalization ( EncounterWithSurgery )\n      and VentilationInterval starts after end of LatestAnesthesiaInterval\n      and OxygenSupport.interval ( ) starts during Interval[end of LatestAnesthesiaInterval, start of VentilationInterval]\n      and EncounterWithSurgery.isNotAtProceduralHospitalLocationDuring ( VentilationInterval )\n    return EncounterWithSurgery\n\ndefine &quot;Encounter With Extubation Outside Of Procedural Area Within 30 Days Of End Of First OR Procedure More Than 48 Hours After End Of Anesthesia&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    with [&quot;Procedure&quot;: &quot;Removal of endotracheal tube (procedure)&quot;] Extubation\n      such that Extubation.status = 'completed'\n        and Extubation.isDuringHospitalization ( EncounterWithSurgery )\n        and Extubation.starts30DaysOrLessAfterFirstAnesthesia ( EncounterWithSurgery )\n        and Extubation.performed.toInterval ( ) starts more than 48 hours after end of Extubation.latestGeneralAnesthesiaOrMAC ( ).performed.toInterval ( )\n        and not ( ( &quot;Extubation With Preceding Noninvasive Oxygen&quot;.id contains Extubation.id )\n            and not ( &quot;Extubation During General Anesthesia&quot;.id contains Extubation.id )\n        )\n        and EncounterWithSurgery.isNotAtProceduralHospitalLocation ( )\n\ndefine &quot;Encounter With Mechanical Ventilation Within 30 Days Of End Of First OR Procedure And Between 48 And 72 Hours After End Of OR Procedure And Not Preceded By Non Invasive Oxygen Therapy Or Anesthesia&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    with [&quot;Procedure&quot;: &quot;Mechanical Ventilation&quot;] Ventilation\n      such that Ventilation.status = 'completed'\n        and Ventilation.performed.toInterval ( ) starts 48 hours or more after end of Ventilation.latestGeneralAnesthesiaOrMAC ( ).performed.toInterval ( )\n        and Ventilation.performed.toInterval ( ) starts 72 hours or less after end of Ventilation.latestGeneralAnesthesiaOrMAC ( ).performed.toInterval ( )\n        and Ventilation.starts30DaysOrLessAfterFirstAnesthesia ( EncounterWithSurgery )\n        and Ventilation.startsDuringHospitalization ( EncounterWithSurgery )\n        and not ( &quot;Encounter With Mechanical Ventilation Outside Of Procedural Area Within 30 Days Of End Of First OR Procedure And Preceded By Non Invasive Oxygen Therapy&quot;.id contains EncounterWithSurgery.id )\n        and EncounterWithSurgery.isNotAtProceduralHospitalLocation ( )\n\ndefine &quot;Elective Inpatient Encounter With Age 18 And Older Without ED Visit&quot;:\n  [&quot;Encounter&quot;: &quot;Elective Inpatient Encounter&quot;] ElectiveEncounter\n    where ElectiveEncounter.status = 'finished'\n      and ElectiveEncounter.period ends during day of &quot;Measurement Period&quot;\n      and ElectiveEncounter.priority is not null implies ElectiveEncounter.priority ~ &quot;Elective (qualifier value)&quot;\n      and AgeInYearsAt(date from start of ElectiveEncounter.period) &gt;= 18\n      and not exists ( [&quot;Encounter&quot;: &quot;Emergency Department Visit&quot;] EDVisit\n          where EDVisit.status = 'finished'\n            and EDVisit.period ends 1 hour or less before or on start of ElectiveEncounter.period\n      )\n\ndefine &quot;Elective Inpatient Encounter With Age And Without Obstetrical Condition&quot;:\n  &quot;Elective Inpatient Encounter With Age 18 And Older Without ED Visit&quot; ElectiveEncounter\n    where not ( ElectiveEncounter.reasonCode in &quot;Obstetrical Or Pregnancy Related Conditions&quot;\n        or ElectiveEncounter.encounterReason ( ).code in &quot;Obstetrical Or Pregnancy Related Conditions&quot;\n    )\n\ndefine &quot;Encounter With Tracheostomy Before Day Of First OR Procedure&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    let FirstProcedure: EncounterWithSurgery.firstAnesthesiaDuringHospitalization ( )\n    with [&quot;Procedure&quot;: &quot;Tracheostomy Procedures&quot;] TracheostomySurgery\n      such that TracheostomySurgery.status = 'completed'\n        and TracheostomySurgery.startsDuringHospitalization ( EncounterWithSurgery )\n        and TracheostomySurgery.performed.toInterval ( ) starts before day of FirstProcedure.performed.toInterval ( )\n\ndefine &quot;Encounter With Tracheostomy Same Day Of First OR Procedure&quot;:\n  &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery\n    let FirstProcedure: EncounterWithSurgery.firstAnesthesiaDuringHospitalization ( )\n    with [&quot;Procedure&quot;: &quot;Tracheostomy Procedures&quot;] TracheostomySurgery\n      such that TracheostomySurgery.status = 'completed'\n        and TracheostomySurgery.startsDuringHospitalization ( EncounterWithSurgery )\n        and TracheostomySurgery.performed.toInterval ( ) starts during day of FirstProcedure.performed.toInterval ( )\n\ndefine &quot;General Anesthesia And MAC&quot;:\n  [&quot;Procedure&quot;: &quot;Anesthesia Requiring Monitored Care&quot;] MAC\n    union [&quot;Procedure&quot;: &quot;General And Neuraxial Anesthesia&quot;]\n\ndefine &quot;Noninvasive Oxygen Therapy&quot;:\n  ( [&quot;Procedure&quot;: &quot;Non Invasive Oxygen Therapy By Nasal Cannula Or Mask&quot;] P\n      where P.status = 'completed'\n  )\n    union ( [&quot;LaboratoryResultObservation&quot;: &quot;Non Invasive Oxygen Therapy&quot;] O\n        where O.status in { 'final', 'amended', 'corrected' }\n    )\n\ndefine &quot;Intubation During General Anesthesia And MAC&quot;:\n  from\n    &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery,\n    [&quot;Procedure&quot;: &quot;Intubation&quot;] ProceduralIntubation,\n    &quot;General Anesthesia And MAC&quot; Anesthesia\n    where ProceduralIntubation.status = 'completed'\n      and ProceduralIntubation.startsDuringHospitalization ( EncounterWithSurgery )\n      and ProceduralIntubation.performed.toInterval ( ) starts during Anesthesia.performed.toInterval ( )\n    return ProceduralIntubation\n\ndefine &quot;Extubation During General Anesthesia&quot;:\n  from\n    &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery,\n    [&quot;Procedure&quot;: &quot;Removal of endotracheal tube (procedure)&quot;] Extubation,\n    &quot;General Anesthesia And MAC&quot; Anesthesia\n    where Extubation.status = 'completed'\n      and Extubation.startsDuringHospitalization ( EncounterWithSurgery )\n      and Extubation.performed.toInterval ( ) starts during Anesthesia.performed.toInterval ( )\n    return Extubation\n\ndefine &quot;Extubation With Preceding Noninvasive Oxygen&quot;:\n  from\n    &quot;Elective Inpatient Encounter With OR Procedure Within 3 Days&quot; EncounterWithSurgery,\n    [&quot;Procedure&quot;: &quot;Removal of endotracheal tube (procedure)&quot;] Extubation,\n    &quot;Noninvasive Oxygen Therapy&quot; OxygenSupport\n    let LatestAnesthesia: Extubation.latestGeneralAnesthesiaOrMAC ( )\n    where Extubation.status = 'completed'\n      and Extubation.startsDuringHospitalization ( EncounterWithSurgery )\n      and Extubation.performed.toInterval ( ) starts after LatestAnesthesia.performed.toInterval ( )\n      and OxygenSupport.interval ( ) starts during Interval[end of LatestAnesthesia.performed.toInterval ( ), start of Extubation.performed.toInterval ( )]\n    return Extubation\n\ndefine &quot;Risk Variable All Encounter Diagnoses With POA Indication&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      diagnoses: QualifyingEncounter.claimDiagnosesWithPOA ( )\n    }\n\ndefine &quot;Risk Variable ASA Physical Status Class&quot;:\n  [&quot;ObservationScreeningAssessment&quot;: &quot;American society of anesthesiologists morbidity state&quot;] ASAclass\n    with &quot;Initial Population&quot; QualifyingEncounter\n      such that ASAclass.status in { 'final', 'amended', 'corrected' }\n        and ASAclass.startsDuringHospitalization ( QualifyingEncounter )\n        and ASAclass.value as CodeableConcept in &quot;ASA Physical Status Class&quot;\n    return ASAclass.value as CodeableConcept\n\ndefine &quot;Risk Variable Body Mass Index (BMI)&quot;:\n  [&quot;USCore.BMIProfile&quot;] BMI\n    with &quot;Initial Population&quot; InpatientEncounter\n      such that BMI.effective.toInterval ( ) starts during InpatientEncounter.hospitalizationWithObservation ( )\n        and BMI.value is not null\n        and BMI.status in { 'final', 'amended', 'corrected' }\n    return BMI.value as Quantity\n\ndefine &quot;Risk Variable Encounter Procedures&quot;:\n  from\n    [&quot;Procedure&quot;] TheProcedure,\n    &quot;Initial Population&quot; QualifyingEncounter\n    where TheProcedure.status = 'completed'\n      and TheProcedure.startsDuringHospitalization ( QualifyingEncounter )\n    return {\n      encounterId: QualifyingEncounter.id,\n      procedureId: TheProcedure.id,\n      procedureCode: TheProcedure.code,\n      procedureRank: TheProcedure.rank ( QualifyingEncounter ),\n      procedureTime: TheProcedure.performed.toInterval ( )\n    }\n\ndefine &quot;Risk Variable First Albumin In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstAlbumin: QualifyingEncounter.firstAlbumin ( )\n    }\n\ndefine &quot;Risk Variable First Arterial pH In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstArterialpH: QualifyingEncounter.firstArterialpH ( )\n    }\n\ndefine &quot;Risk Variable First AST In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstAST: QualifyingEncounter.firstAST ( )\n    }\n\ndefine &quot;Risk Variable First Bicarbonate In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstBicarbonate: QualifyingEncounter.firstBicarbonate ( )\n    }\n\ndefine &quot;Risk Variable First Bilirubin In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstBilirubin: QualifyingEncounter.firstBilirubin ( )\n    }\n\ndefine &quot;Risk Variable First Blood Urea Nitrogen In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstBUN: QualifyingEncounter.firstBloodUreaNitrogen ( )\n    }\n\ndefine &quot;Risk Variable First BMI&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstBMI: QualifyingEncounter.firstBMI ( )\n    }\n\ndefine &quot;Risk Variable First Body Temperature In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstBodyTemp: QualifyingEncounter.firstBodyTemperature ( )\n    }\n\ndefine &quot;Risk Variable First Carbon Dioxide In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstCarbonDioxide: QualifyingEncounter.firstCarbonDioxide ( )\n    }\n\ndefine &quot;Risk Variable First Creatinine In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstCreatinine: QualifyingEncounter.firstCreatinine ( )\n    }\n\ndefine &quot;Risk Variable First Heart Rate In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstHeartRate: QualifyingEncounter.firstHeartRate ( )\n    }\n\ndefine &quot;Risk Variable First Hematocrit In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstHematocrit: QualifyingEncounter.firstHematocrit ( )\n    }\n\ndefine &quot;Risk Variable First Hemoglobin In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstHemoglobin: QualifyingEncounter.firstHemoglobin ( )\n    }\n\ndefine &quot;Risk Variable First Leukocyte Count In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstLeukocyte: QualifyingEncounter.firstLeukocyte ( )\n    }\n\ndefine &quot;Risk Variable First Oxygen In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstOxygen: QualifyingEncounter.firstOxygen ( )\n    }\n\ndefine &quot;Risk Variable First Platelet Count In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstPlatelet: QualifyingEncounter.firstPlatelet ( )\n    }\n\ndefine &quot;Risk Variable First Respiratory Rate In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstRespiratoryRate: QualifyingEncounter.firstRespiratoryRate ( )\n    }\n\ndefine &quot;Risk Variable First Sodium In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstSodium: QualifyingEncounter.firstSodium ( )\n    }\n\ndefine &quot;Risk Variable First Systolic Blood Pressure In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstSystolic: QualifyingEncounter.firstSystolicBloodPressure ( )\n    }\n\ndefine &quot;Risk Variable First White Blood Cell Count In Encounter&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstWBCcount: QualifyingEncounter.firstWhiteBloodCellCount ( )\n    }\n\ndefine &quot;Risk Variable Principal Procedure&quot;:\n  from\n    [&quot;Procedure&quot;] TheProcedure,\n    &quot;Initial Population&quot; QualifyingEncounter\n    where TheProcedure.status = 'completed'\n      and TheProcedure.rank ( QualifyingEncounter ) is not null\n      and TheProcedure.startsDuringHospitalization ( QualifyingEncounter )\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      procedureId: TheProcedure.id,\n      procedureCode: TheProcedure.code,\n      procedureRank: TheProcedure.rank ( QualifyingEncounter ),\n      procedureTime: TheProcedure.performed.toInterval ( )\n    }\n\ndefine &quot;Risk Variable Latest Smoking Status&quot;:\n  &quot;Initial Population&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      latestSmokingStatus: QualifyingEncounter.latestSmokingStatus ( )\n    }\n\ndefine &quot;SDE Ethnicity&quot;:\n  SDE.&quot;SDE Ethnicity&quot;\n\ndefine &quot;SDE Payer&quot;:\n  SDE.&quot;SDE Payer&quot;\n\ndefine &quot;SDE Race&quot;:\n  SDE.&quot;SDE Race&quot;\n\ndefine &quot;SDE Sex&quot;:\n  SDE.&quot;SDE Sex&quot;\n\ndefine fluent function firstAlbumin(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Albumin Lab Test&quot;] FirstAlbuminTest\n      where FirstAlbuminTest.status in { 'final', 'amended', 'corrected' }\n        and FirstAlbuminTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstArterialpH(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Arterial Blood pH&quot;] FirstArterialpHTest\n      where FirstArterialpHTest.status in { 'final', 'amended', 'corrected' }\n        and FirstArterialpHTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstAST(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Aspartate transaminase Lab Test&quot;] FirstASTTest\n      where FirstASTTest.status in { 'final', 'amended', 'corrected' }\n        and FirstASTTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstBicarbonate(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Bicarbonate Lab Test&quot;] FirstBicarbonateTest\n      where FirstBicarbonateTest.status in { 'final', 'amended', 'corrected' }\n        and FirstBicarbonateTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstBilirubin(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Bilirubin Lab Test&quot;] FirstBilirubinTest\n      where FirstBilirubinTest.status in { 'final', 'amended', 'corrected' }\n        and FirstBilirubinTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstBMI(QualifyingEncounter Encounter):\n  First([USCore.BMIProfile] FirstBodyMass\n      where FirstBodyMass.status in { 'final', 'amended', 'corrected' }\n        and FirstBodyMass.effective.toInterval() starts during QualifyingEncounter.hospitalizationWithObservation()\n        and FirstBodyMass.value is not null\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstBodyTemperature(QualifyingEncounter Encounter):\n  First([&quot;USCore.BodyTemperatureProfile&quot;: &quot;Body temperature&quot;] FirstTemperature\n      where FirstTemperature.status in { 'final', 'amended', 'corrected' }\n        and FirstTemperature.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\n        and FirstTemperature.value is not null\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstCarbonDioxide(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Carbon Dioxide Partial Pressure In Arterial Blood&quot;] FirstCarbonDioxideTest\n      where FirstCarbonDioxideTest.status in { 'final', 'amended', 'corrected' }\n        and FirstCarbonDioxideTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstCreatinine(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Creatinine Lab Test&quot;] FirstCreatinineTest\n      where FirstCreatinineTest.status in { 'final', 'amended', 'corrected' }\n        and FirstCreatinineTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstHeartRate(QualifyingEncounter Encounter):\n  First([&quot;USCore.HeartRateProfile&quot;: &quot;Heart rate&quot;] FirstHeartBeats\n      where FirstHeartBeats.status in { 'final', 'amended', 'corrected' }\n        and FirstHeartBeats.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\n        and FirstHeartBeats.value is not null\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstHematocrit(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Hematocrit Lab Test&quot;] FirstHematocritTest\n      where FirstHematocritTest.status in { 'final', 'amended', 'corrected' }\n        and FirstHematocritTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstHemoglobin(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Hemoglobin Lab Test&quot;] FirstHemoglobinTest\n      where FirstHemoglobinTest.status in { 'final', 'amended', 'corrected' }\n        and FirstHemoglobinTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstLeukocyte(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Leukocyte Count Lab Test&quot;] FirstLeukocyteCount\n      where FirstLeukocyteCount.status in { 'final', 'amended', 'corrected' }\n        and FirstLeukocyteCount.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstOxygen(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Oxygen Partial Pressure In Arterial Blood&quot;] FirstOxygenTest\n      where FirstOxygenTest.status in { 'final', 'amended', 'corrected' }\n        and FirstOxygenTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstPlatelet(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Platelet Count Lab Test&quot;] FirstPlateletCount\n      where FirstPlateletCount.status in { 'final', 'amended', 'corrected' }\n        and FirstPlateletCount.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstRespiratoryRate(QualifyingEncounter Encounter):\n  First([USCore.RespiratoryRateProfile: &quot;Respiratory rate&quot;] FirstRespiration\n      where FirstRespiration.status in { 'final', 'amended', 'corrected' }\n        and FirstRespiration.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\n        and FirstRespiration.value is not null\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstSodium(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Sodium Lab Test&quot;] FirstSodiumTest\n      where FirstSodiumTest.status in { 'final', 'amended', 'corrected' }\n        and FirstSodiumTest.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine &quot;Qualifying Systolic Blood Pressure Reading&quot;:\n  [&quot;USCore.BloodPressureProfile&quot;] BloodPressure\n    where BloodPressure.effective.earliest ( ) during day of &quot;Measurement Period&quot;\n\ndefine fluent function &quot;firstSystolicBloodPressure&quot;(QualifyingEncounter Encounter):\n  First(&quot;Qualifying Systolic Blood Pressure Reading&quot; SBPReading\n      where SBPReading.status in { 'final', 'amended', 'corrected' }\n        and SBPReading.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\n      return singleton from(SBPReading.component SBPComponent\n          where SBPComponent.code ~ &quot;Systolic blood pressure&quot;\n          return SBPComponent.value as Quantity\n      )\n  )\n\ndefine fluent function firstWhiteBloodCellCount(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;White Blood Cells Count Lab Test&quot;] FirstWBCCount\n      where FirstWBCCount.status in { 'final', 'amended', 'corrected' }\n        and FirstWBCCount.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function firstBloodUreaNitrogen(QualifyingEncounter Encounter):\n  First([LaboratoryResultObservation: &quot;Blood Urea Nitrogen Lab Test&quot;] FirstBUN\n      where FirstBUN.status in { 'final', 'amended', 'corrected' }\n        and FirstBUN.isEarliestDuringHospitalization(QualifyingEncounter)\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine &quot;Anesthesia Procedure List&quot;:\n  [&quot;Procedure&quot;: &quot;General And Neuraxial Anesthesia&quot;] AnesthesiaProcedures\n    where AnesthesiaProcedures.performed.latest ( ) during day of &quot;Measurement Period&quot;\n\ndefine fluent function &quot;firstAnesthesiaDuringHospitalization&quot;(QualifyingEncounter Encounter):\n  First(&quot;Anesthesia Procedure List&quot; anesthesia\n      where anesthesia.status = 'completed'\n        and anesthesia.startsDuringHospitalization(QualifyingEncounter)\n      sort by start of performed.toInterval()\n  )\n\ndefine fluent function latestGeneralAnesthesiaOrMAC(event Procedure):\n  Last(&quot;General Anesthesia And MAC&quot; ProcedureList\n      where ProcedureList.status = 'completed'\n        and ProcedureList.performed.toInterval() ends before start of event.performed.toInterval()\n      sort by start of performed.toInterval()\n  )\n\ndefine fluent function latestSmokingStatus(QualifyingEncounter Encounter):\n  First([&quot;USCore.SmokingStatusProfile&quot;] SMStatus\n      let statusInterval: SMStatus.effective.latest()//.toInterval()\n      where SMStatus.status in { 'final', 'amended', 'corrected' }\n        and(statusInterval during QualifyingEncounter.hospitalizationWithObservationAndOutpatientSurgeryService()\n            or statusInterval before QualifyingEncounter.hospitalizationWithObservationAndOutpatientSurgeryService()\n        )\n        and SMStatus.value as CodeableConcept in &quot;Smoking Status&quot;\n  ).value as CodeableConcept\n\ndefine fluent function startsDuringHospitalization(choice Choice&lt;Procedure, LaboratoryResultObservation, ObservationScreeningAssessment&gt;, enc Encounter):\n  case\n    when choice is Procedure then ( choice as Procedure ).performed.toInterval ( ) starts during enc.hospitalizationWithObservationAndOutpatientSurgeryService ( )\n    when choice is LaboratoryResultObservation then ( choice as LaboratoryResultObservation ).effective.toInterval ( ) starts during enc.hospitalizationWithObservationAndOutpatientSurgeryService ( )\n    when choice is ObservationScreeningAssessment then ( choice as ObservationScreeningAssessment ).effective.toInterval ( ) starts during enc.hospitalizationWithObservationAndOutpatientSurgeryService ( ) \n    else false end\n\ndefine fluent function starts30DaysOrLessAfterFirstAnesthesia(procedure Procedure, encounter Encounter):\n  procedure.performed.toInterval ( ) starts 30 days or less after end of encounter.firstAnesthesiaDuringHospitalization ( ).performed.toInterval ( )\n\ndefine fluent function isNotAtProceduralHospitalLocation(encounter Encounter):\n  not exists ( encounter.location EncounterLocation\n      with [Location] Location\n        such that EncounterLocation.location.references ( Location )\n          and Location.type.includesCode ( &quot;ER&quot; )\n  )\n\ndefine fluent function isNotAtProceduralHospitalLocationDuring(encounter Encounter, intrvl Interval&lt;DateTime&gt;):\n  not exists ( encounter.location EncounterLocation\n      with [Location] Location\n        such that EncounterLocation.location.references ( Location )\n          and Location.type.includesCode ( &quot;ER&quot; )\n          and EncounterLocation.period starts during intrvl\n  )\n\ndefine fluent function isDuringHospitalization(choice Choice&lt;Procedure, LaboratoryResultObservation&gt;, enc Encounter):\n  case\n    when choice is Procedure then ( choice as Procedure ).performed.toInterval ( ) during enc.hospitalizationWithObservationAndOutpatientSurgeryService ( )\n    when choice is LaboratoryResultObservation then ( choice as LaboratoryResultObservation ).effective.toInterval ( ) during enc.hospitalizationWithObservationAndOutpatientSurgeryService ( ) \n    else false end\n\ndefine fluent function earliestOccursDuringHospitalization(observation LaboratoryResultObservation, encounter Encounter):\n  observation.effective.earliest ( ) during encounter.hospitalizationWithObservationAndOutpatientSurgeryService ( )\n    and observation.value is not null\n\ndefine fluent function earliestIsDuringHospitalization(procedure Procedure, encounter Encounter):\n  procedure.performed.earliest ( ) during encounter.hospitalizationWithObservationAndOutpatientSurgeryService ( )\n    and procedure.partOf is not null\n\ndefine fluent function isEarliestDuringHospitalization(choice Choice&lt;Procedure, LaboratoryResultObservation&gt;, encounter Encounter):\n  case\n    when choice is Procedure then ( choice as Procedure ).earliestIsDuringHospitalization ( encounter )\n    when choice is LaboratoryResultObservation then ( choice as LaboratoryResultObservation ).earliestOccursDuringHospitalization ( encounter ) \n    else false end\n\ndefine fluent function interval(choice Choice&lt;Procedure, LaboratoryResultObservation, Encounter&gt;):\n  case\n    when choice is Procedure then ( choice as Procedure ).performed.toInterval ( )\n    when choice is LaboratoryResultObservation then ( choice as LaboratoryResultObservation ).effective.toInterval ( )\n    when choice is Encounter then ( choice as Encounter ).period.toInterval ( ) \n    else null as Interval&lt;DateTime&gt;end\n\ndefine fluent function rank(targetProcedure Procedure, parentEncounter Encounter):\n  singleton from ( targetProcedure P\n      let claim: ( [Claim] C\n          where C.status = 'active'\n            and C.use = 'claim'\n            and exists ( C.item I\n                where I.encounter.references ( parentEncounter )\n            )\n      ),\n      claimProc: ( claim.procedure proc\n          where proc.procedure.references ( P )\n      )\n      return claimProc.sequence R\n  )\n\ndefine fluent function claimDiagnosesWithPOA(encounter Encounter):\n  encounter E\n    let claim: ( [Claim] C\n        where C.status = 'active'\n          and C.use = 'claim'\n          and exists ( C.item I\n              where I.encounter.references ( E )\n          )\n    ),\n    claimItem: ( claim.item I\n        where I.encounter.references ( E )\n    )\n    return claim.diagnosis D\n      where D.sequence in claimItem.diagnosisSequence\n        and D.onAdmission is not null\n\ndefine fluent function encounterReason(Encounter Encounter):\n  Encounter.reasonReference D\n    return singleton from ( ( [ConditionEncounterDiagnosis] cA\n        union [ConditionProblemsHealthConcerns] cB ) C\n        where D.references ( C.id )\n    )</code></pre>\n      </td>\n    </tr>\n    \n  \n\n\n\n<tr>\n  <th colspan=\"2\" scope=\"row\" class=\"row-header\">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>\n</tr>\n\n    </tbody>\n  </table>\n</div>"
  },
  "extension" : [{
    "url" : "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem",
    "valueReference" : {
      "reference" : "Device/cqf-tooling"
    }
  }],
  "url" : "https://madie.cms.gov/Library/CMS1218FHIRHHRF",
  "version" : "1.1.000",
  "name" : "CMS1218FHIRHHRF",
  "status" : "draft",
  "type" : {
    "coding" : [{
      "system" : "http://terminology.hl7.org/CodeSystem/library-type",
      "code" : "logic-library"
    }]
  },
  "date" : "2026-09-19T16:31:14+00:00",
  "content" : [{
    "contentType" : "text/cql",
    "data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVMxMjE4RkhJUkhIUkYgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlRWxlbWVudHMgdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlRWxlbWVudHMKCmluY2x1ZGUgQ1FNQ29tbW9uIHZlcnNpb24gJzUuMS4wMDAnIGNhbGxlZCBDUU1Db21tb24KaW5jbHVkZSBVU1F1YWxpdHlDb3JlQ29tbW9uIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnIGNhbGxlZCBVU1F1YWxpdHlDb3JlQ29tbW9uCmluY2x1ZGUgU3VwcGxlbWVudGFsRGF0YUVsZW1lbnRzIHZlcnNpb24gJzYuMS4wMDAnIGNhbGxlZCBTREUKaW5jbHVkZSBTdGF0dXMgdmVyc2lvbiAnMi4xLjAwMCcgY2FsbGVkIFN0YXR1cwoKY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycKY29kZXN5c3RlbSAiU05PTUVEQ1QiOiAnaHR0cDovL3Nub21lZC5pbmZvL3NjdCcKY29kZXN5c3RlbSAiTG9jYXRpb25Sb2xlcyI6ICdodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL3YzLVJvbGVDb2RlJwoKdmFsdWVzZXQgIkFjdXRlIFJlc3BpcmF0b3J5IEZhaWx1cmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4Ljg4Jwp2YWx1ZXNldCAiQWxidW1pbiBMYWIgVGVzdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMjIxJwp2YWx1ZXNldCAiQW5lc3RoZXNpYSBSZXF1aXJpbmcgTW9uaXRvcmVkIENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjI1NScKdmFsdWVzZXQgIkFydGVyaWFsIEJsb29kIHBIIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC45NicKdmFsdWVzZXQgIkFTQSBQaHlzaWNhbCBTdGF0dXMgQ2xhc3MiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIxNycKdmFsdWVzZXQgIkFzcGFydGF0ZSB0cmFuc2FtaW5hc2UgTGFiIFRlc3QiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIyNCcKdmFsdWVzZXQgIkJpY2FyYm9uYXRlIExhYiBUZXN0IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA0NS4xMzknCnZhbHVlc2V0ICJCaWxpcnViaW4gTGFiIFRlc3QiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIyMycKdmFsdWVzZXQgIkJsb29kIFVyZWEgTml0cm9nZW4gTGFiIFRlc3QiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIxOCcKdmFsdWVzZXQgIkNhcmJvbiBEaW94aWRlIFBhcnRpYWwgUHJlc3N1cmUgSW4gQXJ0ZXJpYWwgQmxvb2QiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4Ljk1Jwp2YWx1ZXNldCAiQ3JlYXRpbmluZSBMYWIgVGVzdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy42NjYuNS4yMzYzJwp2YWx1ZXNldCAiRGVnZW5lcmF0aXZlIE5ldXJvbG9naWNhbCBEaXNvcmRlciI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMjQxJwp2YWx1ZXNldCAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguODUnCnZhbHVlc2V0ICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjkyJwp2YWx1ZXNldCAiR2VuZXJhbCBBbmQgTmV1cmF4aWFsIEFuZXN0aGVzaWEiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIwOCcKdmFsdWVzZXQgIkhlYWQsIE5lY2ssIEFuZCBUaG9yYWNpYyBTdXJnZXJpZXMgV2l0aCBIaWdoIFJpc2sgQWlyd2F5IENvbXByb21pc2UiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjI1MScKdmFsdWVzZXQgIkhlbWF0b2NyaXQgTGFiIFRlc3QiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMDQ1LjExNCcKdmFsdWVzZXQgIkhlbW9nbG9iaW4gTGFiIFRlc3QiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIxOScKdmFsdWVzZXQgIkludHViYXRpb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjE3OScKdmFsdWVzZXQgIkxldWtvY3l0ZSBDb3VudCBMYWIgVGVzdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMjIyJwp2YWx1ZXNldCAiTWVjaGFuaWNhbCBWZW50aWxhdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTA3Jwp2YWx1ZXNldCAiTmV1cm9tdXNjdWxhciBEaXNvcmRlciI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMjM5Jwp2YWx1ZXNldCAiTm9uIEludmFzaXZlIE94eWdlbiBUaGVyYXB5IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4yMTMnCnZhbHVlc2V0ICJOb24gSW52YXNpdmUgT3h5Z2VuIFRoZXJhcHkgQnkgTmFzYWwgQ2FubnVsYSBPciBNYXNrIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4yMDknCnZhbHVlc2V0ICJPYnN0ZXRyaWNhbCBPciBQcmVnbmFuY3kgUmVsYXRlZCBDb25kaXRpb25zIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNjMnCnZhbHVlc2V0ICJPeHlnZW4gUGFydGlhbCBQcmVzc3VyZSBJbiBBcnRlcmlhbCBCbG9vZCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguOTQnCnZhbHVlc2V0ICJQbGF0ZWxldCBDb3VudCBMYWIgVGVzdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwNDUuMTI3Jwp2YWx1ZXNldCAiUHJlc2VudCBPbiBBZG1pc3Npb24gT3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTQ3LjE5NycKdmFsdWVzZXQgIlByb2NlZHVyYWwgSG9zcGl0YWwgTG9jYXRpb25zIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4yMTYnCnZhbHVlc2V0ICJTbW9raW5nIFN0YXR1cyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMjIwJwp2YWx1ZXNldCAiU29kaXVtIExhYiBUZXN0IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA0NS4xMTknCnZhbHVlc2V0ICJUcmFjaGVvc3RvbXkgRGlhZ25vc2VzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC44OScKdmFsdWVzZXQgIlRyYWNoZW9zdG9teSBQcm9jZWR1cmVzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4xODEnCnZhbHVlc2V0ICJXaGl0ZSBCbG9vZCBDZWxscyBDb3VudCBMYWIgVGVzdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwNDUuMTI5JwoKY29kZSAiQW1lcmljYW4gc29jaWV0eSBvZiBhbmVzdGhlc2lvbG9naXN0cyBtb3JiaWRpdHkgc3RhdGUiOiAnOTc4MTYtMycgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0FtZXJpY2FuIHNvY2lldHkgb2YgYW5lc3RoZXNpb2xvZ2lzdHMgbW9yYmlkaXR5IHN0YXRlJwpjb2RlICJCb2R5IHRlbXBlcmF0dXJlIjogJzgzMTAtNScgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0JvZHkgdGVtcGVyYXR1cmUnCmNvZGUgIkVsZWN0aXZlIChxdWFsaWZpZXIgdmFsdWUpIjogJzEwMzM5MDAwMCcgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ0VsZWN0aXZlIChxdWFsaWZpZXIgdmFsdWUpJwpjb2RlICJIZWFydCByYXRlIjogJzg4NjctNCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0hlYXJ0IHJhdGUnCmNvZGUgIlJlbW92YWwgb2YgZW5kb3RyYWNoZWFsIHR1YmUgKHByb2NlZHVyZSkiOiAnMjcxMjgwMDA1JyBmcm9tICJTTk9NRURDVCIgZGlzcGxheSAnUmVtb3ZhbCBvZiBlbmRvdHJhY2hlYWwgdHViZSAocHJvY2VkdXJlKScKY29kZSAiUmVzcGlyYXRvcnkgcmF0ZSI6ICc5Mjc5LTEnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdSZXNwaXJhdG9yeSByYXRlJwpjb2RlICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSI6ICc4NDgwLTYnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdTeXN0b2xpYyBibG9vZCBwcmVzc3VyZScKY29kZSAiRVIiOiAnRVInIGZyb20gIkxvY2F0aW9uUm9sZXMiIGRpc3BsYXkgJ0VtZXJnZW5jeSByb29tJwoKcGFyYW1ldGVyICJNZWFzdXJlbWVudCBQZXJpb2QiIEludGVydmFsPERhdGVUaW1lPgogIGRlZmF1bHQgSW50ZXJ2YWxbQDIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiwgQDIwMjctMDEtMDFUMDA6MDA6MDAuMDAwWikKCmNvbnRleHQgUGF0aWVudAoKZGVmaW5lICJJbml0aWFsIFBvcHVsYXRpb24iOgogICJFbGVjdGl2ZSBJbnBhdGllbnQgRW5jb3VudGVyIFdpdGggT1IgUHJvY2VkdXJlIFdpdGhpbiAzIERheXMiCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb25zIjoKICAiRW5jb3VudGVyIFdpdGggRGVnZW5lcmF0aXZlIE5ldXJvbG9naWNhbCBEaXNvcmRlciIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBIaWdoIFJpc2sgVG8gQWlyd2F5IEhlYWQgTmVjayBBbmQgVGhvcmFjaWMgU3VyZ2VyeSIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBNZWNoYW5pY2FsIFZlbnRpbGF0aW9uIFRoYXQgU3RhcnRzIE1vcmUgVGhhbiBPbmUgSG91ciBQcmlvciBUbyBTdGFydCBPZiBGaXJzdCBPUiBQcm9jZWR1cmUiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggTmV1cm9tdXNjdWxhciBEaXNvcmRlciIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBQYUNPMiBHcmVhdGVyIFRoYW4gNTAgQW5kIEFydGVyaWFsIHBIIExlc3MgVGhhbiA3LjMwIFdpdGhpbiA0OCBIb3VycyBQcmlvciBUbyBTdGFydCBPZiBGaXJzdCBPUiBQcm9jZWR1cmUiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggUGFPMiBMZXNzIFRoYW4gNTAgV2l0aGluIDQ4IEhvdXJzIFByaW9yIFRvIFN0YXJ0IE9mIEZpcnN0IE9SIFByb2NlZHVyZSIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBQcmluY2lwYWwgRGlhZ25vc2lzIE9mIEFjdXRlIFJlc3BpcmF0b3J5IEZhaWx1cmUiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggRGlhZ25vc2lzIE9mIEFjdXRlIFJlc3BpcmF0b3J5IEZhaWx1cmUgUHJlc2VudCBPbiBBZG1pc3Npb24iCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggVHJhY2hlb3N0b215IFByZXNlbnQgT24gQWRtaXNzaW9uIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIFRyYWNoZW9zdG9teSBQcmlvciBUbyBPciBPbiBUaGUgU2FtZSBEYXkgT2YgRmlyc3QgT1IgUHJvY2VkdXJlIgoKZGVmaW5lICJOdW1lcmF0b3IiOgogICJFbmNvdW50ZXIgV2l0aCBJbnR1YmF0aW9uIE91dHNpZGUgT2YgUHJvY2VkdXJhbCBBcmVhIFdpdGhpbiAzMCBEYXlzIE9mIEVuZCBPZiBGaXJzdCBPUiBQcm9jZWR1cmUiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggTWVjaGFuaWNhbCBWZW50aWxhdGlvbiBPdXRzaWRlIE9mIFByb2NlZHVyYWwgQXJlYSBXaXRoaW4gMzAgRGF5cyBPZiBFbmQgT2YgRmlyc3QgT1IgUHJvY2VkdXJlIEFuZCBQcmVjZWRlZCBCeSBOb24gSW52YXNpdmUgT3h5Z2VuIFRoZXJhcHkiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggRXh0dWJhdGlvbiBPdXRzaWRlIE9mIFByb2NlZHVyYWwgQXJlYSBXaXRoaW4gMzAgRGF5cyBPZiBFbmQgT2YgRmlyc3QgT1IgUHJvY2VkdXJlIE1vcmUgVGhhbiA0OCBIb3VycyBBZnRlciBFbmQgT2YgQW5lc3RoZXNpYSIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBNZWNoYW5pY2FsIFZlbnRpbGF0aW9uIFdpdGhpbiAzMCBEYXlzIE9mIEVuZCBPZiBGaXJzdCBPUiBQcm9jZWR1cmUgQW5kIEJldHdlZW4gNDggQW5kIDcyIEhvdXJzIEFmdGVyIEVuZCBPZiBPUiBQcm9jZWR1cmUgQW5kIE5vdCBQcmVjZWRlZCBCeSBOb24gSW52YXNpdmUgT3h5Z2VuIFRoZXJhcHkgT3IgQW5lc3RoZXNpYSIKCmRlZmluZSAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIjoKICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIEFnZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb24iIEVsZWN0aXZlRW5jb3VudGVyCiAgICB3aXRoIFsiUHJvY2VkdXJlIjogIkdlbmVyYWwgQW5kIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gU3VyZ2VyeVdpdGhBbmVzdGhlc2lhCiAgICAgIHN1Y2ggdGhhdCBTdXJnZXJ5V2l0aEFuZXN0aGVzaWEuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgICBhbmQgU3VyZ2VyeVdpdGhBbmVzdGhlc2lhLnBlcmZvcm1lZC5lYXJsaWVzdCAoICkgZHVyaW5nIEVsZWN0aXZlRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkFuZE91dHBhdGllbnRTdXJnZXJ5U2VydmljZSAoICkKICAgICAgICBhbmQgU3VyZ2VyeVdpdGhBbmVzdGhlc2lhLnBlcmZvcm1lZC5lYXJsaWVzdCAoICkgMyBkYXlzIG9yIGxlc3MgYWZ0ZXIgc3RhcnQgb2YgRWxlY3RpdmVFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uQW5kT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlICggKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBEZWdlbmVyYXRpdmUgTmV1cm9sb2dpY2FsIERpc29yZGVyIjoKICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIiBFbmNvdW50ZXJXaXRoU3VyZ2VyeQogICAgd2hlcmUgRW5jb3VudGVyV2l0aFN1cmdlcnkucmVhc29uQ29kZSBpbiAiRGVnZW5lcmF0aXZlIE5ldXJvbG9naWNhbCBEaXNvcmRlciIKICAgICAgb3IgRW5jb3VudGVyV2l0aFN1cmdlcnkuZW5jb3VudGVyUmVhc29uICggKS5jb2RlIGluICJEZWdlbmVyYXRpdmUgTmV1cm9sb2dpY2FsIERpc29yZGVyIgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBIaWdoIFJpc2sgVG8gQWlyd2F5IEhlYWQgTmVjayBBbmQgVGhvcmFjaWMgU3VyZ2VyeSI6CiAgIkVsZWN0aXZlIElucGF0aWVudCBFbmNvdW50ZXIgV2l0aCBPUiBQcm9jZWR1cmUgV2l0aGluIDMgRGF5cyIgRW5jb3VudGVyV2l0aFN1cmdlcnkKICAgIHdpdGggWyJQcm9jZWR1cmUiOiAiSGVhZCwgTmVjaywgQW5kIFRob3JhY2ljIFN1cmdlcmllcyBXaXRoIEhpZ2ggUmlzayBBaXJ3YXkgQ29tcHJvbWlzZSJdIEhlYWROZWNrUHJvY2VkdXJlcwogICAgICBzdWNoIHRoYXQgSGVhZE5lY2tQcm9jZWR1cmVzLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIEhlYWROZWNrUHJvY2VkdXJlcy5zdGFydHNEdXJpbmdIb3NwaXRhbGl6YXRpb24gKCBFbmNvdW50ZXJXaXRoU3VyZ2VyeSApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIE1lY2hhbmljYWwgVmVudGlsYXRpb24gVGhhdCBTdGFydHMgTW9yZSBUaGFuIE9uZSBIb3VyIFByaW9yIFRvIFN0YXJ0IE9mIEZpcnN0IE9SIFByb2NlZHVyZSI6CiAgIkVsZWN0aXZlIElucGF0aWVudCBFbmNvdW50ZXIgV2l0aCBPUiBQcm9jZWR1cmUgV2l0aGluIDMgRGF5cyIgRW5jb3VudGVyV2l0aFN1cmdlcnkKICAgIHdpdGggWyJQcm9jZWR1cmUiOiAiTWVjaGFuaWNhbCBWZW50aWxhdGlvbiJdIFZlbnRpbGF0aW9uCiAgICAgIHN1Y2ggdGhhdCBWZW50aWxhdGlvbi5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICAgIGFuZCBWZW50aWxhdGlvbi5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIG1vcmUgdGhhbiAxIGhvdXIgYmVmb3JlIHN0YXJ0IG9mIEVuY291bnRlcldpdGhTdXJnZXJ5LmZpcnN0QW5lc3RoZXNpYUR1cmluZ0hvc3BpdGFsaXphdGlvbiAoICkucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICAgICAgYW5kIFZlbnRpbGF0aW9uLnN0YXJ0c0R1cmluZ0hvc3BpdGFsaXphdGlvbiAoIEVuY291bnRlcldpdGhTdXJnZXJ5ICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggTmV1cm9tdXNjdWxhciBEaXNvcmRlciI6CiAgIkVsZWN0aXZlIElucGF0aWVudCBFbmNvdW50ZXIgV2l0aCBPUiBQcm9jZWR1cmUgV2l0aGluIDMgRGF5cyIgRW5jb3VudGVyV2l0aFN1cmdlcnkKICAgIHdoZXJlIEVuY291bnRlcldpdGhTdXJnZXJ5LnJlYXNvbkNvZGUgaW4gIk5ldXJvbXVzY3VsYXIgRGlzb3JkZXIiCiAgICAgIG9yIEVuY291bnRlcldpdGhTdXJnZXJ5LmVuY291bnRlclJlYXNvbiAoICkuY29kZSBpbiAiTmV1cm9tdXNjdWxhciBEaXNvcmRlciIKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggUGFDTzIgR3JlYXRlciBUaGFuIDUwIEFuZCBBcnRlcmlhbCBwSCBMZXNzIFRoYW4gNy4zMCBXaXRoaW4gNDggSG91cnMgUHJpb3IgVG8gU3RhcnQgT2YgRmlyc3QgT1IgUHJvY2VkdXJlIjoKICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIiBFbmNvdW50ZXJXaXRoU3VyZ2VyeQogICAgbGV0IEZpcnN0UHJvY2VkdXJlVGltZTogRW5jb3VudGVyV2l0aFN1cmdlcnkuZmlyc3RBbmVzdGhlc2lhRHVyaW5nSG9zcGl0YWxpemF0aW9uICggKS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgIHdpdGggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ2FyYm9uIERpb3hpZGUgUGFydGlhbCBQcmVzc3VyZSBJbiBBcnRlcmlhbCBCbG9vZCJdIENhcmJvbkRpb3hpZGUKICAgICAgc3VjaCB0aGF0IENhcmJvbkRpb3hpZGUuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIENhcmJvbkRpb3hpZGUuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyA0OCBob3VycyBvciBsZXNzIGJlZm9yZSBzdGFydCBvZiBGaXJzdFByb2NlZHVyZVRpbWUKICAgICAgICBhbmQgQ2FyYm9uRGlveGlkZS52YWx1ZSBhcyBRdWFudGl0eSA+IDUwICdtbVtIZ10nCiAgICB3aXRoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkFydGVyaWFsIEJsb29kIHBIIl0gQmxvb2RwSAogICAgICBzdWNoIHRoYXQgQmxvb2RwSC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgQmxvb2RwSC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIDQ4IGhvdXJzIG9yIGxlc3MgYmVmb3JlIHN0YXJ0IG9mIEZpcnN0UHJvY2VkdXJlVGltZQogICAgICAgIGFuZCBCbG9vZHBILnZhbHVlIGFzIFF1YW50aXR5IDwgNy4zMCAnW3BIXScKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggUGFPMiBMZXNzIFRoYW4gNTAgV2l0aGluIDQ4IEhvdXJzIFByaW9yIFRvIFN0YXJ0IE9mIEZpcnN0IE9SIFByb2NlZHVyZSI6CiAgIkVsZWN0aXZlIElucGF0aWVudCBFbmNvdW50ZXIgV2l0aCBPUiBQcm9jZWR1cmUgV2l0aGluIDMgRGF5cyIgRW5jb3VudGVyV2l0aFN1cmdlcnkKICAgIGxldCBGaXJzdFByb2NlZHVyZTogRW5jb3VudGVyV2l0aFN1cmdlcnkuZmlyc3RBbmVzdGhlc2lhRHVyaW5nSG9zcGl0YWxpemF0aW9uICggKQogICAgd2l0aCBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJPeHlnZW4gUGFydGlhbCBQcmVzc3VyZSBJbiBBcnRlcmlhbCBCbG9vZCJdIE94eWdlbgogICAgICBzdWNoIHRoYXQgT3h5Z2VuLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgIGFuZCBPeHlnZW4uZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyA0OCBob3VycyBvciBsZXNzIGJlZm9yZSBzdGFydCBvZiBGaXJzdFByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgICAgICBhbmQgT3h5Z2VuLnZhbHVlIGFzIFF1YW50aXR5IDwgNTAgJ21tW0hnXScKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggUHJpbmNpcGFsIERpYWdub3NpcyBPZiBBY3V0ZSBSZXNwaXJhdG9yeSBGYWlsdXJlIjoKICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIiBFbmNvdW50ZXJXaXRoU3VyZ2VyeQogICAgd2hlcmUgRW5jb3VudGVyV2l0aFN1cmdlcnkuaGFzUHJpbmNpcGFsRGlhZ25vc2lzT2YgKCAiQWN1dGUgUmVzcGlyYXRvcnkgRmFpbHVyZSIgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBEaWFnbm9zaXMgT2YgQWN1dGUgUmVzcGlyYXRvcnkgRmFpbHVyZSBQcmVzZW50IE9uIEFkbWlzc2lvbiI6CiAgIkVsZWN0aXZlIElucGF0aWVudCBFbmNvdW50ZXIgV2l0aCBPUiBQcm9jZWR1cmUgV2l0aGluIDMgRGF5cyIgRW5jb3VudGVyV2l0aFN1cmdlcnkKICAgIHdoZXJlIEVuY291bnRlcldpdGhTdXJnZXJ5LmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIkFjdXRlIFJlc3BpcmF0b3J5IEZhaWx1cmUiLCAiUHJlc2VudCBPbiBBZG1pc3Npb24gT3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggVHJhY2hlb3N0b215IFByZXNlbnQgT24gQWRtaXNzaW9uIjoKICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIiBFbmNvdW50ZXJXaXRoU3VyZ2VyeQogICAgd2hlcmUgRW5jb3VudGVyV2l0aFN1cmdlcnkuaXNEaWFnbm9zaXNQcmVzZW50T25BZG1pc3Npb24gKCAiVHJhY2hlb3N0b215IERpYWdub3NlcyIsICJQcmVzZW50IE9uIEFkbWlzc2lvbiBPciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCIgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBUcmFjaGVvc3RvbXkgUHJpb3IgVG8gT3IgT24gVGhlIFNhbWUgRGF5IE9mIEZpcnN0IE9SIFByb2NlZHVyZSI6CiAgIkVuY291bnRlciBXaXRoIFRyYWNoZW9zdG9teSBCZWZvcmUgRGF5IE9mIEZpcnN0IE9SIFByb2NlZHVyZSIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBUcmFjaGVvc3RvbXkgU2FtZSBEYXkgT2YgRmlyc3QgT1IgUHJvY2VkdXJlIgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBJbnR1YmF0aW9uIE91dHNpZGUgT2YgUHJvY2VkdXJhbCBBcmVhIFdpdGhpbiAzMCBEYXlzIE9mIEVuZCBPZiBGaXJzdCBPUiBQcm9jZWR1cmUiOgogICJFbGVjdGl2ZSBJbnBhdGllbnQgRW5jb3VudGVyIFdpdGggT1IgUHJvY2VkdXJlIFdpdGhpbiAzIERheXMiIEVuY291bnRlcldpdGhTdXJnZXJ5CiAgICB3aXRoIFsiUHJvY2VkdXJlIjogIkludHViYXRpb24iXSBFbmRvdHJhY2hlYWxUdWJlSW4KICAgICAgc3VjaCB0aGF0IEVuZG90cmFjaGVhbFR1YmVJbi5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICAgIGFuZCBFbmRvdHJhY2hlYWxUdWJlSW4uc3RhcnRzMzBEYXlzT3JMZXNzQWZ0ZXJGaXJzdEFuZXN0aGVzaWEgKCBFbmNvdW50ZXJXaXRoU3VyZ2VyeSApCiAgICAgICAgYW5kIEVuZG90cmFjaGVhbFR1YmVJbi5zdGFydHNEdXJpbmdIb3NwaXRhbGl6YXRpb24gKCBFbmNvdW50ZXJXaXRoU3VyZ2VyeSApCiAgICAgICAgYW5kIEVuZG90cmFjaGVhbFR1YmVJbi5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGFmdGVyIGVuZCBvZiBFbmRvdHJhY2hlYWxUdWJlSW4ubGF0ZXN0R2VuZXJhbEFuZXN0aGVzaWFPck1BQyAoICkucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICAgICAgYW5kIEVuY291bnRlcldpdGhTdXJnZXJ5LmlzTm90QXRQcm9jZWR1cmFsSG9zcGl0YWxMb2NhdGlvbkR1cmluZyAoIEVuZG90cmFjaGVhbFR1YmVJbi5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKQogICAgICAgIGFuZCBub3QgKCAiSW50dWJhdGlvbiBEdXJpbmcgR2VuZXJhbCBBbmVzdGhlc2lhIEFuZCBNQUMiLmlkIGNvbnRhaW5zIEVuZG90cmFjaGVhbFR1YmVJbi5pZCApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIE1lY2hhbmljYWwgVmVudGlsYXRpb24gT3V0c2lkZSBPZiBQcm9jZWR1cmFsIEFyZWEgV2l0aGluIDMwIERheXMgT2YgRW5kIE9mIEZpcnN0IE9SIFByb2NlZHVyZSBBbmQgUHJlY2VkZWQgQnkgTm9uIEludmFzaXZlIE94eWdlbiBUaGVyYXB5IjoKICBmcm9tCiAgICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIiBFbmNvdW50ZXJXaXRoU3VyZ2VyeSwKICAgIFsiUHJvY2VkdXJlIjogIk1lY2hhbmljYWwgVmVudGlsYXRpb24iXSBWZW50aWxhdGlvbiwKICAgICJOb25pbnZhc2l2ZSBPeHlnZW4gVGhlcmFweSIgT3h5Z2VuU3VwcG9ydAogICAgbGV0IFZlbnRpbGF0aW9uSW50ZXJ2YWw6IFZlbnRpbGF0aW9uLnBlcmZvcm1lZC50b0ludGVydmFsICggKSwKICAgIExhdGVzdEFuZXN0aGVzaWFJbnRlcnZhbDogVmVudGlsYXRpb24ubGF0ZXN0R2VuZXJhbEFuZXN0aGVzaWFPck1BQyAoICkucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICB3aGVyZSBWZW50aWxhdGlvbi5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgVmVudGlsYXRpb24uc3RhcnRzMzBEYXlzT3JMZXNzQWZ0ZXJGaXJzdEFuZXN0aGVzaWEgKCBFbmNvdW50ZXJXaXRoU3VyZ2VyeSApCiAgICAgIGFuZCBWZW50aWxhdGlvbi5zdGFydHNEdXJpbmdIb3NwaXRhbGl6YXRpb24gKCBFbmNvdW50ZXJXaXRoU3VyZ2VyeSApCiAgICAgIGFuZCBWZW50aWxhdGlvbkludGVydmFsIHN0YXJ0cyBhZnRlciBlbmQgb2YgTGF0ZXN0QW5lc3RoZXNpYUludGVydmFsCiAgICAgIGFuZCBPeHlnZW5TdXBwb3J0LmludGVydmFsICggKSBzdGFydHMgZHVyaW5nIEludGVydmFsW2VuZCBvZiBMYXRlc3RBbmVzdGhlc2lhSW50ZXJ2YWwsIHN0YXJ0IG9mIFZlbnRpbGF0aW9uSW50ZXJ2YWxdCiAgICAgIGFuZCBFbmNvdW50ZXJXaXRoU3VyZ2VyeS5pc05vdEF0UHJvY2VkdXJhbEhvc3BpdGFsTG9jYXRpb25EdXJpbmcgKCBWZW50aWxhdGlvbkludGVydmFsICkKICAgIHJldHVybiBFbmNvdW50ZXJXaXRoU3VyZ2VyeQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBFeHR1YmF0aW9uIE91dHNpZGUgT2YgUHJvY2VkdXJhbCBBcmVhIFdpdGhpbiAzMCBEYXlzIE9mIEVuZCBPZiBGaXJzdCBPUiBQcm9jZWR1cmUgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEVuZCBPZiBBbmVzdGhlc2lhIjoKICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIiBFbmNvdW50ZXJXaXRoU3VyZ2VyeQogICAgd2l0aCBbIlByb2NlZHVyZSI6ICJSZW1vdmFsIG9mIGVuZG90cmFjaGVhbCB0dWJlIChwcm9jZWR1cmUpIl0gRXh0dWJhdGlvbgogICAgICBzdWNoIHRoYXQgRXh0dWJhdGlvbi5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICAgIGFuZCBFeHR1YmF0aW9uLmlzRHVyaW5nSG9zcGl0YWxpemF0aW9uICggRW5jb3VudGVyV2l0aFN1cmdlcnkgKQogICAgICAgIGFuZCBFeHR1YmF0aW9uLnN0YXJ0czMwRGF5c09yTGVzc0FmdGVyRmlyc3RBbmVzdGhlc2lhICggRW5jb3VudGVyV2l0aFN1cmdlcnkgKQogICAgICAgIGFuZCBFeHR1YmF0aW9uLnBlcmZvcm1lZC50b0ludGVydmFsICggKSBzdGFydHMgbW9yZSB0aGFuIDQ4IGhvdXJzIGFmdGVyIGVuZCBvZiBFeHR1YmF0aW9uLmxhdGVzdEdlbmVyYWxBbmVzdGhlc2lhT3JNQUMgKCApLnBlcmZvcm1lZC50b0ludGVydmFsICggKQogICAgICAgIGFuZCBub3QgKCAoICJFeHR1YmF0aW9uIFdpdGggUHJlY2VkaW5nIE5vbmludmFzaXZlIE94eWdlbiIuaWQgY29udGFpbnMgRXh0dWJhdGlvbi5pZCApCiAgICAgICAgICAgIGFuZCBub3QgKCAiRXh0dWJhdGlvbiBEdXJpbmcgR2VuZXJhbCBBbmVzdGhlc2lhIi5pZCBjb250YWlucyBFeHR1YmF0aW9uLmlkICkKICAgICAgICApCiAgICAgICAgYW5kIEVuY291bnRlcldpdGhTdXJnZXJ5LmlzTm90QXRQcm9jZWR1cmFsSG9zcGl0YWxMb2NhdGlvbiAoICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggTWVjaGFuaWNhbCBWZW50aWxhdGlvbiBXaXRoaW4gMzAgRGF5cyBPZiBFbmQgT2YgRmlyc3QgT1IgUHJvY2VkdXJlIEFuZCBCZXR3ZWVuIDQ4IEFuZCA3MiBIb3VycyBBZnRlciBFbmQgT2YgT1IgUHJvY2VkdXJlIEFuZCBOb3QgUHJlY2VkZWQgQnkgTm9uIEludmFzaXZlIE94eWdlbiBUaGVyYXB5IE9yIEFuZXN0aGVzaWEiOgogICJFbGVjdGl2ZSBJbnBhdGllbnQgRW5jb3VudGVyIFdpdGggT1IgUHJvY2VkdXJlIFdpdGhpbiAzIERheXMiIEVuY291bnRlcldpdGhTdXJnZXJ5CiAgICB3aXRoIFsiUHJvY2VkdXJlIjogIk1lY2hhbmljYWwgVmVudGlsYXRpb24iXSBWZW50aWxhdGlvbgogICAgICBzdWNoIHRoYXQgVmVudGlsYXRpb24uc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgICBhbmQgVmVudGlsYXRpb24ucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyA0OCBob3VycyBvciBtb3JlIGFmdGVyIGVuZCBvZiBWZW50aWxhdGlvbi5sYXRlc3RHZW5lcmFsQW5lc3RoZXNpYU9yTUFDICggKS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgICAgICBhbmQgVmVudGlsYXRpb24ucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyA3MiBob3VycyBvciBsZXNzIGFmdGVyIGVuZCBvZiBWZW50aWxhdGlvbi5sYXRlc3RHZW5lcmFsQW5lc3RoZXNpYU9yTUFDICggKS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgICAgICBhbmQgVmVudGlsYXRpb24uc3RhcnRzMzBEYXlzT3JMZXNzQWZ0ZXJGaXJzdEFuZXN0aGVzaWEgKCBFbmNvdW50ZXJXaXRoU3VyZ2VyeSApCiAgICAgICAgYW5kIFZlbnRpbGF0aW9uLnN0YXJ0c0R1cmluZ0hvc3BpdGFsaXphdGlvbiAoIEVuY291bnRlcldpdGhTdXJnZXJ5ICkKICAgICAgICBhbmQgbm90ICggIkVuY291bnRlciBXaXRoIE1lY2hhbmljYWwgVmVudGlsYXRpb24gT3V0c2lkZSBPZiBQcm9jZWR1cmFsIEFyZWEgV2l0aGluIDMwIERheXMgT2YgRW5kIE9mIEZpcnN0IE9SIFByb2NlZHVyZSBBbmQgUHJlY2VkZWQgQnkgTm9uIEludmFzaXZlIE94eWdlbiBUaGVyYXB5Ii5pZCBjb250YWlucyBFbmNvdW50ZXJXaXRoU3VyZ2VyeS5pZCApCiAgICAgICAgYW5kIEVuY291bnRlcldpdGhTdXJnZXJ5LmlzTm90QXRQcm9jZWR1cmFsSG9zcGl0YWxMb2NhdGlvbiAoICkKCmRlZmluZSAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIEFnZSAxOCBBbmQgT2xkZXIgV2l0aG91dCBFRCBWaXNpdCI6CiAgWyJFbmNvdW50ZXIiOiAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciJdIEVsZWN0aXZlRW5jb3VudGVyCiAgICB3aGVyZSBFbGVjdGl2ZUVuY291bnRlci5zdGF0dXMgPSAnZmluaXNoZWQnCiAgICAgIGFuZCBFbGVjdGl2ZUVuY291bnRlci5wZXJpb2QgZW5kcyBkdXJpbmcgZGF5IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgIGFuZCBFbGVjdGl2ZUVuY291bnRlci5wcmlvcml0eSBpcyBub3QgbnVsbCBpbXBsaWVzIEVsZWN0aXZlRW5jb3VudGVyLnByaW9yaXR5IH4gIkVsZWN0aXZlIChxdWFsaWZpZXIgdmFsdWUpIgogICAgICBhbmQgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiBFbGVjdGl2ZUVuY291bnRlci5wZXJpb2QpID49IDE4CiAgICAgIGFuZCBub3QgZXhpc3RzICggWyJFbmNvdW50ZXIiOiAiRW1lcmdlbmN5IERlcGFydG1lbnQgVmlzaXQiXSBFRFZpc2l0CiAgICAgICAgICB3aGVyZSBFRFZpc2l0LnN0YXR1cyA9ICdmaW5pc2hlZCcKICAgICAgICAgICAgYW5kIEVEVmlzaXQucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3MgYmVmb3JlIG9yIG9uIHN0YXJ0IG9mIEVsZWN0aXZlRW5jb3VudGVyLnBlcmlvZAogICAgICApCgpkZWZpbmUgIkVsZWN0aXZlIElucGF0aWVudCBFbmNvdW50ZXIgV2l0aCBBZ2UgQW5kIFdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9uIjoKICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIEFnZSAxOCBBbmQgT2xkZXIgV2l0aG91dCBFRCBWaXNpdCIgRWxlY3RpdmVFbmNvdW50ZXIKICAgIHdoZXJlIG5vdCAoIEVsZWN0aXZlRW5jb3VudGVyLnJlYXNvbkNvZGUgaW4gIk9ic3RldHJpY2FsIE9yIFByZWduYW5jeSBSZWxhdGVkIENvbmRpdGlvbnMiCiAgICAgICAgb3IgRWxlY3RpdmVFbmNvdW50ZXIuZW5jb3VudGVyUmVhc29uICggKS5jb2RlIGluICJPYnN0ZXRyaWNhbCBPciBQcmVnbmFuY3kgUmVsYXRlZCBDb25kaXRpb25zIgogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBUcmFjaGVvc3RvbXkgQmVmb3JlIERheSBPZiBGaXJzdCBPUiBQcm9jZWR1cmUiOgogICJFbGVjdGl2ZSBJbnBhdGllbnQgRW5jb3VudGVyIFdpdGggT1IgUHJvY2VkdXJlIFdpdGhpbiAzIERheXMiIEVuY291bnRlcldpdGhTdXJnZXJ5CiAgICBsZXQgRmlyc3RQcm9jZWR1cmU6IEVuY291bnRlcldpdGhTdXJnZXJ5LmZpcnN0QW5lc3RoZXNpYUR1cmluZ0hvc3BpdGFsaXphdGlvbiAoICkKICAgIHdpdGggWyJQcm9jZWR1cmUiOiAiVHJhY2hlb3N0b215IFByb2NlZHVyZXMiXSBUcmFjaGVvc3RvbXlTdXJnZXJ5CiAgICAgIHN1Y2ggdGhhdCBUcmFjaGVvc3RvbXlTdXJnZXJ5LnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIFRyYWNoZW9zdG9teVN1cmdlcnkuc3RhcnRzRHVyaW5nSG9zcGl0YWxpemF0aW9uICggRW5jb3VudGVyV2l0aFN1cmdlcnkgKQogICAgICAgIGFuZCBUcmFjaGVvc3RvbXlTdXJnZXJ5LnBlcmZvcm1lZC50b0ludGVydmFsICggKSBzdGFydHMgYmVmb3JlIGRheSBvZiBGaXJzdFByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggVHJhY2hlb3N0b215IFNhbWUgRGF5IE9mIEZpcnN0IE9SIFByb2NlZHVyZSI6CiAgIkVsZWN0aXZlIElucGF0aWVudCBFbmNvdW50ZXIgV2l0aCBPUiBQcm9jZWR1cmUgV2l0aGluIDMgRGF5cyIgRW5jb3VudGVyV2l0aFN1cmdlcnkKICAgIGxldCBGaXJzdFByb2NlZHVyZTogRW5jb3VudGVyV2l0aFN1cmdlcnkuZmlyc3RBbmVzdGhlc2lhRHVyaW5nSG9zcGl0YWxpemF0aW9uICggKQogICAgd2l0aCBbIlByb2NlZHVyZSI6ICJUcmFjaGVvc3RvbXkgUHJvY2VkdXJlcyJdIFRyYWNoZW9zdG9teVN1cmdlcnkKICAgICAgc3VjaCB0aGF0IFRyYWNoZW9zdG9teVN1cmdlcnkuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgICBhbmQgVHJhY2hlb3N0b215U3VyZ2VyeS5zdGFydHNEdXJpbmdIb3NwaXRhbGl6YXRpb24gKCBFbmNvdW50ZXJXaXRoU3VyZ2VyeSApCiAgICAgICAgYW5kIFRyYWNoZW9zdG9teVN1cmdlcnkucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgZGF5IG9mIEZpcnN0UHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKQoKZGVmaW5lICJHZW5lcmFsIEFuZXN0aGVzaWEgQW5kIE1BQyI6CiAgWyJQcm9jZWR1cmUiOiAiQW5lc3RoZXNpYSBSZXF1aXJpbmcgTW9uaXRvcmVkIENhcmUiXSBNQUMKICAgIHVuaW9uIFsiUHJvY2VkdXJlIjogIkdlbmVyYWwgQW5kIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0KCmRlZmluZSAiTm9uaW52YXNpdmUgT3h5Z2VuIFRoZXJhcHkiOgogICggWyJQcm9jZWR1cmUiOiAiTm9uIEludmFzaXZlIE94eWdlbiBUaGVyYXB5IEJ5IE5hc2FsIENhbm51bGEgT3IgTWFzayJdIFAKICAgICAgd2hlcmUgUC5zdGF0dXMgPSAnY29tcGxldGVkJwogICkKICAgIHVuaW9uICggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiTm9uIEludmFzaXZlIE94eWdlbiBUaGVyYXB5Il0gTwogICAgICAgIHdoZXJlIE8uc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICApCgpkZWZpbmUgIkludHViYXRpb24gRHVyaW5nIEdlbmVyYWwgQW5lc3RoZXNpYSBBbmQgTUFDIjoKICBmcm9tCiAgICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIiBFbmNvdW50ZXJXaXRoU3VyZ2VyeSwKICAgIFsiUHJvY2VkdXJlIjogIkludHViYXRpb24iXSBQcm9jZWR1cmFsSW50dWJhdGlvbiwKICAgICJHZW5lcmFsIEFuZXN0aGVzaWEgQW5kIE1BQyIgQW5lc3RoZXNpYQogICAgd2hlcmUgUHJvY2VkdXJhbEludHViYXRpb24uc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIFByb2NlZHVyYWxJbnR1YmF0aW9uLnN0YXJ0c0R1cmluZ0hvc3BpdGFsaXphdGlvbiAoIEVuY291bnRlcldpdGhTdXJnZXJ5ICkKICAgICAgYW5kIFByb2NlZHVyYWxJbnR1YmF0aW9uLnBlcmZvcm1lZC50b0ludGVydmFsICggKSBzdGFydHMgZHVyaW5nIEFuZXN0aGVzaWEucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICByZXR1cm4gUHJvY2VkdXJhbEludHViYXRpb24KCmRlZmluZSAiRXh0dWJhdGlvbiBEdXJpbmcgR2VuZXJhbCBBbmVzdGhlc2lhIjoKICBmcm9tCiAgICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIiBFbmNvdW50ZXJXaXRoU3VyZ2VyeSwKICAgIFsiUHJvY2VkdXJlIjogIlJlbW92YWwgb2YgZW5kb3RyYWNoZWFsIHR1YmUgKHByb2NlZHVyZSkiXSBFeHR1YmF0aW9uLAogICAgIkdlbmVyYWwgQW5lc3RoZXNpYSBBbmQgTUFDIiBBbmVzdGhlc2lhCiAgICB3aGVyZSBFeHR1YmF0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgIGFuZCBFeHR1YmF0aW9uLnN0YXJ0c0R1cmluZ0hvc3BpdGFsaXphdGlvbiAoIEVuY291bnRlcldpdGhTdXJnZXJ5ICkKICAgICAgYW5kIEV4dHViYXRpb24ucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgQW5lc3RoZXNpYS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgIHJldHVybiBFeHR1YmF0aW9uCgpkZWZpbmUgIkV4dHViYXRpb24gV2l0aCBQcmVjZWRpbmcgTm9uaW52YXNpdmUgT3h5Z2VuIjoKICBmcm9tCiAgICAiRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciBXaXRoIE9SIFByb2NlZHVyZSBXaXRoaW4gMyBEYXlzIiBFbmNvdW50ZXJXaXRoU3VyZ2VyeSwKICAgIFsiUHJvY2VkdXJlIjogIlJlbW92YWwgb2YgZW5kb3RyYWNoZWFsIHR1YmUgKHByb2NlZHVyZSkiXSBFeHR1YmF0aW9uLAogICAgIk5vbmludmFzaXZlIE94eWdlbiBUaGVyYXB5IiBPeHlnZW5TdXBwb3J0CiAgICBsZXQgTGF0ZXN0QW5lc3RoZXNpYTogRXh0dWJhdGlvbi5sYXRlc3RHZW5lcmFsQW5lc3RoZXNpYU9yTUFDICggKQogICAgd2hlcmUgRXh0dWJhdGlvbi5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgRXh0dWJhdGlvbi5zdGFydHNEdXJpbmdIb3NwaXRhbGl6YXRpb24gKCBFbmNvdW50ZXJXaXRoU3VyZ2VyeSApCiAgICAgIGFuZCBFeHR1YmF0aW9uLnBlcmZvcm1lZC50b0ludGVydmFsICggKSBzdGFydHMgYWZ0ZXIgTGF0ZXN0QW5lc3RoZXNpYS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgICAgYW5kIE94eWdlblN1cHBvcnQuaW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSW50ZXJ2YWxbZW5kIG9mIExhdGVzdEFuZXN0aGVzaWEucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApLCBzdGFydCBvZiBFeHR1YmF0aW9uLnBlcmZvcm1lZC50b0ludGVydmFsICggKV0KICAgIHJldHVybiBFeHR1YmF0aW9uCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgQWxsIEVuY291bnRlciBEaWFnbm9zZXMgV2l0aCBQT0EgSW5kaWNhdGlvbiI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsCiAgICAgIGRpYWdub3NlczogUXVhbGlmeWluZ0VuY291bnRlci5jbGFpbURpYWdub3Nlc1dpdGhQT0EgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgQVNBIFBoeXNpY2FsIFN0YXR1cyBDbGFzcyI6CiAgWyJPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQiOiAiQW1lcmljYW4gc29jaWV0eSBvZiBhbmVzdGhlc2lvbG9naXN0cyBtb3JiaWRpdHkgc3RhdGUiXSBBU0FjbGFzcwogICAgd2l0aCAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHN1Y2ggdGhhdCBBU0FjbGFzcy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgQVNBY2xhc3Muc3RhcnRzRHVyaW5nSG9zcGl0YWxpemF0aW9uICggUXVhbGlmeWluZ0VuY291bnRlciApCiAgICAgICAgYW5kIEFTQWNsYXNzLnZhbHVlIGFzIENvZGVhYmxlQ29uY2VwdCBpbiAiQVNBIFBoeXNpY2FsIFN0YXR1cyBDbGFzcyIKICAgIHJldHVybiBBU0FjbGFzcy52YWx1ZSBhcyBDb2RlYWJsZUNvbmNlcHQKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBCb2R5IE1hc3MgSW5kZXggKEJNSSkiOgogIFsiVVNDb3JlLkJNSVByb2ZpbGUiXSBCTUkKICAgIHdpdGggIkluaXRpYWwgUG9wdWxhdGlvbiIgSW5wYXRpZW50RW5jb3VudGVyCiAgICAgIHN1Y2ggdGhhdCBCTUkuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSW5wYXRpZW50RW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKICAgICAgICBhbmQgQk1JLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgICAgYW5kIEJNSS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgIHJldHVybiBCTUkudmFsdWUgYXMgUXVhbnRpdHkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgUHJvY2VkdXJlcyI6CiAgZnJvbQogICAgWyJQcm9jZWR1cmUiXSBUaGVQcm9jZWR1cmUsCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBUaGVQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIFRoZVByb2NlZHVyZS5zdGFydHNEdXJpbmdIb3NwaXRhbGl6YXRpb24gKCBRdWFsaWZ5aW5nRW5jb3VudGVyICkKICAgIHJldHVybiB7CiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLAogICAgICBwcm9jZWR1cmVJZDogVGhlUHJvY2VkdXJlLmlkLAogICAgICBwcm9jZWR1cmVDb2RlOiBUaGVQcm9jZWR1cmUuY29kZSwKICAgICAgcHJvY2VkdXJlUmFuazogVGhlUHJvY2VkdXJlLnJhbmsgKCBRdWFsaWZ5aW5nRW5jb3VudGVyICksCiAgICAgIHByb2NlZHVyZVRpbWU6IFRoZVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBBbGJ1bWluIEluIEVuY291bnRlciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsCiAgICAgIGZpcnN0QWxidW1pbjogUXVhbGlmeWluZ0VuY291bnRlci5maXJzdEFsYnVtaW4gKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgQXJ0ZXJpYWwgcEggSW4gRW5jb3VudGVyIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RBcnRlcmlhbHBIOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZpcnN0QXJ0ZXJpYWxwSCAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBBU1QgSW4gRW5jb3VudGVyIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RBU1Q6IFF1YWxpZnlpbmdFbmNvdW50ZXIuZmlyc3RBU1QgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgQmljYXJib25hdGUgSW4gRW5jb3VudGVyIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RCaWNhcmJvbmF0ZTogUXVhbGlmeWluZ0VuY291bnRlci5maXJzdEJpY2FyYm9uYXRlICggKQogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IEJpbGlydWJpbiBJbiBFbmNvdW50ZXIiOgogICJJbml0aWFsIFBvcHVsYXRpb24iIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLAogICAgICBmaXJzdEJpbGlydWJpbjogUXVhbGlmeWluZ0VuY291bnRlci5maXJzdEJpbGlydWJpbiAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBCbG9vZCBVcmVhIE5pdHJvZ2VuIEluIEVuY291bnRlciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsCiAgICAgIGZpcnN0QlVOOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZpcnN0Qmxvb2RVcmVhTml0cm9nZW4gKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgQk1JIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RCTUk6IFF1YWxpZnlpbmdFbmNvdW50ZXIuZmlyc3RCTUkgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgQm9keSBUZW1wZXJhdHVyZSBJbiBFbmNvdW50ZXIiOgogICJJbml0aWFsIFBvcHVsYXRpb24iIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLAogICAgICBmaXJzdEJvZHlUZW1wOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZpcnN0Qm9keVRlbXBlcmF0dXJlICggKQogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IENhcmJvbiBEaW94aWRlIEluIEVuY291bnRlciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsCiAgICAgIGZpcnN0Q2FyYm9uRGlveGlkZTogUXVhbGlmeWluZ0VuY291bnRlci5maXJzdENhcmJvbkRpb3hpZGUgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgQ3JlYXRpbmluZSBJbiBFbmNvdW50ZXIiOgogICJJbml0aWFsIFBvcHVsYXRpb24iIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLAogICAgICBmaXJzdENyZWF0aW5pbmU6IFF1YWxpZnlpbmdFbmNvdW50ZXIuZmlyc3RDcmVhdGluaW5lICggKQogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IEhlYXJ0IFJhdGUgSW4gRW5jb3VudGVyIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RIZWFydFJhdGU6IFF1YWxpZnlpbmdFbmNvdW50ZXIuZmlyc3RIZWFydFJhdGUgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgSGVtYXRvY3JpdCBJbiBFbmNvdW50ZXIiOgogICJJbml0aWFsIFBvcHVsYXRpb24iIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLAogICAgICBmaXJzdEhlbWF0b2NyaXQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuZmlyc3RIZW1hdG9jcml0ICggKQogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IEhlbW9nbG9iaW4gSW4gRW5jb3VudGVyIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RIZW1vZ2xvYmluOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZpcnN0SGVtb2dsb2JpbiAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBMZXVrb2N5dGUgQ291bnQgSW4gRW5jb3VudGVyIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RMZXVrb2N5dGU6IFF1YWxpZnlpbmdFbmNvdW50ZXIuZmlyc3RMZXVrb2N5dGUgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgT3h5Z2VuIEluIEVuY291bnRlciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsCiAgICAgIGZpcnN0T3h5Z2VuOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZpcnN0T3h5Z2VuICggKQogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IFBsYXRlbGV0IENvdW50IEluIEVuY291bnRlciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsCiAgICAgIGZpcnN0UGxhdGVsZXQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuZmlyc3RQbGF0ZWxldCAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBSZXNwaXJhdG9yeSBSYXRlIEluIEVuY291bnRlciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsCiAgICAgIGZpcnN0UmVzcGlyYXRvcnlSYXRlOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZpcnN0UmVzcGlyYXRvcnlSYXRlICggKQogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IFNvZGl1bSBJbiBFbmNvdW50ZXIiOgogICJJbml0aWFsIFBvcHVsYXRpb24iIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLAogICAgICBmaXJzdFNvZGl1bTogUXVhbGlmeWluZ0VuY291bnRlci5maXJzdFNvZGl1bSAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBTeXN0b2xpYyBCbG9vZCBQcmVzc3VyZSBJbiBFbmNvdW50ZXIiOgogICJJbml0aWFsIFBvcHVsYXRpb24iIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLAogICAgICBmaXJzdFN5c3RvbGljOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZpcnN0U3lzdG9saWNCbG9vZFByZXNzdXJlICggKQogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IFdoaXRlIEJsb29kIENlbGwgQ291bnQgSW4gRW5jb3VudGVyIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RXQkNjb3VudDogUXVhbGlmeWluZ0VuY291bnRlci5maXJzdFdoaXRlQmxvb2RDZWxsQ291bnQgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgUHJpbmNpcGFsIFByb2NlZHVyZSI6CiAgZnJvbQogICAgWyJQcm9jZWR1cmUiXSBUaGVQcm9jZWR1cmUsCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBUaGVQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIFRoZVByb2NlZHVyZS5yYW5rICggUXVhbGlmeWluZ0VuY291bnRlciApIGlzIG5vdCBudWxsCiAgICAgIGFuZCBUaGVQcm9jZWR1cmUuc3RhcnRzRHVyaW5nSG9zcGl0YWxpemF0aW9uICggUXVhbGlmeWluZ0VuY291bnRlciApCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgcHJvY2VkdXJlSWQ6IFRoZVByb2NlZHVyZS5pZCwKICAgICAgcHJvY2VkdXJlQ29kZTogVGhlUHJvY2VkdXJlLmNvZGUsCiAgICAgIHByb2NlZHVyZVJhbms6IFRoZVByb2NlZHVyZS5yYW5rICggUXVhbGlmeWluZ0VuY291bnRlciApLAogICAgICBwcm9jZWR1cmVUaW1lOiBUaGVQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgTGF0ZXN0IFNtb2tpbmcgU3RhdHVzIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgbGF0ZXN0U21va2luZ1N0YXR1czogUXVhbGlmeWluZ0VuY291bnRlci5sYXRlc3RTbW9raW5nU3RhdHVzICggKQogICAgfQoKZGVmaW5lICJTREUgRXRobmljaXR5IjoKICBTREUuIlNERSBFdGhuaWNpdHkiCgpkZWZpbmUgIlNERSBQYXllciI6CiAgU0RFLiJTREUgUGF5ZXIiCgpkZWZpbmUgIlNERSBSYWNlIjoKICBTREUuIlNERSBSYWNlIgoKZGVmaW5lICJTREUgU2V4IjoKICBTREUuIlNERSBTZXgiCgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGZpcnN0QWxidW1pbihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgRmlyc3QoW0xhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbjogIkFsYnVtaW4gTGFiIFRlc3QiXSBGaXJzdEFsYnVtaW5UZXN0CiAgICAgIHdoZXJlIEZpcnN0QWxidW1pblRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEZpcnN0QWxidW1pblRlc3QuaXNFYXJsaWVzdER1cmluZ0hvc3BpdGFsaXphdGlvbihRdWFsaWZ5aW5nRW5jb3VudGVyKQogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpCiAgKS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBmaXJzdEFydGVyaWFscEgoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KFtMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb246ICJBcnRlcmlhbCBCbG9vZCBwSCJdIEZpcnN0QXJ0ZXJpYWxwSFRlc3QKICAgICAgd2hlcmUgRmlyc3RBcnRlcmlhbHBIVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgRmlyc3RBcnRlcmlhbHBIVGVzdC5pc0VhcmxpZXN0RHVyaW5nSG9zcGl0YWxpemF0aW9uKFF1YWxpZnlpbmdFbmNvdW50ZXIpCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGZpcnN0QVNUKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uOiAiQXNwYXJ0YXRlIHRyYW5zYW1pbmFzZSBMYWIgVGVzdCJdIEZpcnN0QVNUVGVzdAogICAgICB3aGVyZSBGaXJzdEFTVFRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEZpcnN0QVNUVGVzdC5pc0VhcmxpZXN0RHVyaW5nSG9zcGl0YWxpemF0aW9uKFF1YWxpZnlpbmdFbmNvdW50ZXIpCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGZpcnN0QmljYXJib25hdGUoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KFtMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb246ICJCaWNhcmJvbmF0ZSBMYWIgVGVzdCJdIEZpcnN0QmljYXJib25hdGVUZXN0CiAgICAgIHdoZXJlIEZpcnN0QmljYXJib25hdGVUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgIGFuZCBGaXJzdEJpY2FyYm9uYXRlVGVzdC5pc0VhcmxpZXN0RHVyaW5nSG9zcGl0YWxpemF0aW9uKFF1YWxpZnlpbmdFbmNvdW50ZXIpCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGZpcnN0QmlsaXJ1YmluKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uOiAiQmlsaXJ1YmluIExhYiBUZXN0Il0gRmlyc3RCaWxpcnViaW5UZXN0CiAgICAgIHdoZXJlIEZpcnN0QmlsaXJ1YmluVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgRmlyc3RCaWxpcnViaW5UZXN0LmlzRWFybGllc3REdXJpbmdIb3NwaXRhbGl6YXRpb24oUXVhbGlmeWluZ0VuY291bnRlcikKICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQogICkudmFsdWUgYXMgUXVhbnRpdHkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZmlyc3RCTUkoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KFtVU0NvcmUuQk1JUHJvZmlsZV0gRmlyc3RCb2R5TWFzcwogICAgICB3aGVyZSBGaXJzdEJvZHlNYXNzLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgIGFuZCBGaXJzdEJvZHlNYXNzLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpCiAgICAgICAgYW5kIEZpcnN0Qm9keU1hc3MudmFsdWUgaXMgbm90IG51bGwKICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQogICkudmFsdWUgYXMgUXVhbnRpdHkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZmlyc3RCb2R5VGVtcGVyYXR1cmUoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KFsiVVNDb3JlLkJvZHlUZW1wZXJhdHVyZVByb2ZpbGUiOiAiQm9keSB0ZW1wZXJhdHVyZSJdIEZpcnN0VGVtcGVyYXR1cmUKICAgICAgd2hlcmUgRmlyc3RUZW1wZXJhdHVyZS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgRmlyc3RUZW1wZXJhdHVyZS5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQogICAgICAgIGFuZCBGaXJzdFRlbXBlcmF0dXJlLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGZpcnN0Q2FyYm9uRGlveGlkZShRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgRmlyc3QoW0xhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbjogIkNhcmJvbiBEaW94aWRlIFBhcnRpYWwgUHJlc3N1cmUgSW4gQXJ0ZXJpYWwgQmxvb2QiXSBGaXJzdENhcmJvbkRpb3hpZGVUZXN0CiAgICAgIHdoZXJlIEZpcnN0Q2FyYm9uRGlveGlkZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEZpcnN0Q2FyYm9uRGlveGlkZVRlc3QuaXNFYXJsaWVzdER1cmluZ0hvc3BpdGFsaXphdGlvbihRdWFsaWZ5aW5nRW5jb3VudGVyKQogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpCiAgKS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBmaXJzdENyZWF0aW5pbmUoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KFtMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb246ICJDcmVhdGluaW5lIExhYiBUZXN0Il0gRmlyc3RDcmVhdGluaW5lVGVzdAogICAgICB3aGVyZSBGaXJzdENyZWF0aW5pbmVUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgIGFuZCBGaXJzdENyZWF0aW5pbmVUZXN0LmlzRWFybGllc3REdXJpbmdIb3NwaXRhbGl6YXRpb24oUXVhbGlmeWluZ0VuY291bnRlcikKICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQogICkudmFsdWUgYXMgUXVhbnRpdHkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZmlyc3RIZWFydFJhdGUoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KFsiVVNDb3JlLkhlYXJ0UmF0ZVByb2ZpbGUiOiAiSGVhcnQgcmF0ZSJdIEZpcnN0SGVhcnRCZWF0cwogICAgICB3aGVyZSBGaXJzdEhlYXJ0QmVhdHMuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEZpcnN0SGVhcnRCZWF0cy5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQogICAgICAgIGFuZCBGaXJzdEhlYXJ0QmVhdHMudmFsdWUgaXMgbm90IG51bGwKICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQogICkudmFsdWUgYXMgUXVhbnRpdHkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZmlyc3RIZW1hdG9jcml0KFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uOiAiSGVtYXRvY3JpdCBMYWIgVGVzdCJdIEZpcnN0SGVtYXRvY3JpdFRlc3QKICAgICAgd2hlcmUgRmlyc3RIZW1hdG9jcml0VGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgRmlyc3RIZW1hdG9jcml0VGVzdC5pc0VhcmxpZXN0RHVyaW5nSG9zcGl0YWxpemF0aW9uKFF1YWxpZnlpbmdFbmNvdW50ZXIpCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGZpcnN0SGVtb2dsb2JpbihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgRmlyc3QoW0xhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbjogIkhlbW9nbG9iaW4gTGFiIFRlc3QiXSBGaXJzdEhlbW9nbG9iaW5UZXN0CiAgICAgIHdoZXJlIEZpcnN0SGVtb2dsb2JpblRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEZpcnN0SGVtb2dsb2JpblRlc3QuaXNFYXJsaWVzdER1cmluZ0hvc3BpdGFsaXphdGlvbihRdWFsaWZ5aW5nRW5jb3VudGVyKQogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpCiAgKS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBmaXJzdExldWtvY3l0ZShRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgRmlyc3QoW0xhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbjogIkxldWtvY3l0ZSBDb3VudCBMYWIgVGVzdCJdIEZpcnN0TGV1a29jeXRlQ291bnQKICAgICAgd2hlcmUgRmlyc3RMZXVrb2N5dGVDb3VudC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgRmlyc3RMZXVrb2N5dGVDb3VudC5pc0VhcmxpZXN0RHVyaW5nSG9zcGl0YWxpemF0aW9uKFF1YWxpZnlpbmdFbmNvdW50ZXIpCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGZpcnN0T3h5Z2VuKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uOiAiT3h5Z2VuIFBhcnRpYWwgUHJlc3N1cmUgSW4gQXJ0ZXJpYWwgQmxvb2QiXSBGaXJzdE94eWdlblRlc3QKICAgICAgd2hlcmUgRmlyc3RPeHlnZW5UZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgIGFuZCBGaXJzdE94eWdlblRlc3QuaXNFYXJsaWVzdER1cmluZ0hvc3BpdGFsaXphdGlvbihRdWFsaWZ5aW5nRW5jb3VudGVyKQogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpCiAgKS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBmaXJzdFBsYXRlbGV0KFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uOiAiUGxhdGVsZXQgQ291bnQgTGFiIFRlc3QiXSBGaXJzdFBsYXRlbGV0Q291bnQKICAgICAgd2hlcmUgRmlyc3RQbGF0ZWxldENvdW50LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgIGFuZCBGaXJzdFBsYXRlbGV0Q291bnQuaXNFYXJsaWVzdER1cmluZ0hvc3BpdGFsaXphdGlvbihRdWFsaWZ5aW5nRW5jb3VudGVyKQogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpCiAgKS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBmaXJzdFJlc3BpcmF0b3J5UmF0ZShRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgRmlyc3QoW1VTQ29yZS5SZXNwaXJhdG9yeVJhdGVQcm9maWxlOiAiUmVzcGlyYXRvcnkgcmF0ZSJdIEZpcnN0UmVzcGlyYXRpb24KICAgICAgd2hlcmUgRmlyc3RSZXNwaXJhdGlvbi5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgRmlyc3RSZXNwaXJhdGlvbi5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQogICAgICAgIGFuZCBGaXJzdFJlc3BpcmF0aW9uLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGZpcnN0U29kaXVtKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uOiAiU29kaXVtIExhYiBUZXN0Il0gRmlyc3RTb2RpdW1UZXN0CiAgICAgIHdoZXJlIEZpcnN0U29kaXVtVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgRmlyc3RTb2RpdW1UZXN0LmlzRWFybGllc3REdXJpbmdIb3NwaXRhbGl6YXRpb24oUXVhbGlmeWluZ0VuY291bnRlcikKICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQogICkudmFsdWUgYXMgUXVhbnRpdHkKCmRlZmluZSAiUXVhbGlmeWluZyBTeXN0b2xpYyBCbG9vZCBQcmVzc3VyZSBSZWFkaW5nIjoKICBbIlVTQ29yZS5CbG9vZFByZXNzdXJlUHJvZmlsZSJdIEJsb29kUHJlc3N1cmUKICAgIHdoZXJlIEJsb29kUHJlc3N1cmUuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgZGF5IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uICJmaXJzdFN5c3RvbGljQmxvb2RQcmVzc3VyZSIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KCJRdWFsaWZ5aW5nIFN5c3RvbGljIEJsb29kIFByZXNzdXJlIFJlYWRpbmciIFNCUFJlYWRpbmcKICAgICAgd2hlcmUgU0JQUmVhZGluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgU0JQUmVhZGluZy5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQogICAgICByZXR1cm4gc2luZ2xldG9uIGZyb20oU0JQUmVhZGluZy5jb21wb25lbnQgU0JQQ29tcG9uZW50CiAgICAgICAgICB3aGVyZSBTQlBDb21wb25lbnQuY29kZSB+ICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSIKICAgICAgICAgIHJldHVybiBTQlBDb21wb25lbnQudmFsdWUgYXMgUXVhbnRpdHkKICAgICAgKQogICkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZmlyc3RXaGl0ZUJsb29kQ2VsbENvdW50KFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uOiAiV2hpdGUgQmxvb2QgQ2VsbHMgQ291bnQgTGFiIFRlc3QiXSBGaXJzdFdCQ0NvdW50CiAgICAgIHdoZXJlIEZpcnN0V0JDQ291bnQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEZpcnN0V0JDQ291bnQuaXNFYXJsaWVzdER1cmluZ0hvc3BpdGFsaXphdGlvbihRdWFsaWZ5aW5nRW5jb3VudGVyKQogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpCiAgKS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBmaXJzdEJsb29kVXJlYU5pdHJvZ2VuKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uOiAiQmxvb2QgVXJlYSBOaXRyb2dlbiBMYWIgVGVzdCJdIEZpcnN0QlVOCiAgICAgIHdoZXJlIEZpcnN0QlVOLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgIGFuZCBGaXJzdEJVTi5pc0VhcmxpZXN0RHVyaW5nSG9zcGl0YWxpemF0aW9uKFF1YWxpZnlpbmdFbmNvdW50ZXIpCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgIkFuZXN0aGVzaWEgUHJvY2VkdXJlIExpc3QiOgogIFsiUHJvY2VkdXJlIjogIkdlbmVyYWwgQW5kIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZXMKICAgIHdoZXJlIEFuZXN0aGVzaWFQcm9jZWR1cmVzLnBlcmZvcm1lZC5sYXRlc3QgKCApIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImZpcnN0QW5lc3RoZXNpYUR1cmluZ0hvc3BpdGFsaXphdGlvbiIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KCJBbmVzdGhlc2lhIFByb2NlZHVyZSBMaXN0IiBhbmVzdGhlc2lhCiAgICAgIHdoZXJlIGFuZXN0aGVzaWEuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgICBhbmQgYW5lc3RoZXNpYS5zdGFydHNEdXJpbmdIb3NwaXRhbGl6YXRpb24oUXVhbGlmeWluZ0VuY291bnRlcikKICAgICAgc29ydCBieSBzdGFydCBvZiBwZXJmb3JtZWQudG9JbnRlcnZhbCgpCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBsYXRlc3RHZW5lcmFsQW5lc3RoZXNpYU9yTUFDKGV2ZW50IFByb2NlZHVyZSk6CiAgTGFzdCgiR2VuZXJhbCBBbmVzdGhlc2lhIEFuZCBNQUMiIFByb2NlZHVyZUxpc3QKICAgICAgd2hlcmUgUHJvY2VkdXJlTGlzdC5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICAgIGFuZCBQcm9jZWR1cmVMaXN0LnBlcmZvcm1lZC50b0ludGVydmFsKCkgZW5kcyBiZWZvcmUgc3RhcnQgb2YgZXZlbnQucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKQogICAgICBzb3J0IGJ5IHN0YXJ0IG9mIHBlcmZvcm1lZC50b0ludGVydmFsKCkKICApCgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGxhdGVzdFNtb2tpbmdTdGF0dXMoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KFsiVVNDb3JlLlNtb2tpbmdTdGF0dXNQcm9maWxlIl0gU01TdGF0dXMKICAgICAgbGV0IHN0YXR1c0ludGVydmFsOiBTTVN0YXR1cy5lZmZlY3RpdmUubGF0ZXN0KCkvLy50b0ludGVydmFsKCkKICAgICAgd2hlcmUgU01TdGF0dXMuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kKHN0YXR1c0ludGVydmFsIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkFuZE91dHBhdGllbnRTdXJnZXJ5U2VydmljZSgpCiAgICAgICAgICAgIG9yIHN0YXR1c0ludGVydmFsIGJlZm9yZSBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkFuZE91dHBhdGllbnRTdXJnZXJ5U2VydmljZSgpCiAgICAgICAgKQogICAgICAgIGFuZCBTTVN0YXR1cy52YWx1ZSBhcyBDb2RlYWJsZUNvbmNlcHQgaW4gIlNtb2tpbmcgU3RhdHVzIgogICkudmFsdWUgYXMgQ29kZWFibGVDb25jZXB0CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIHN0YXJ0c0R1cmluZ0hvc3BpdGFsaXphdGlvbihjaG9pY2UgQ2hvaWNlPFByb2NlZHVyZSwgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uLCBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ+LCBlbmMgRW5jb3VudGVyKToKICBjYXNlCiAgICB3aGVuIGNob2ljZSBpcyBQcm9jZWR1cmUgdGhlbiAoIGNob2ljZSBhcyBQcm9jZWR1cmUgKS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBlbmMuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uQW5kT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlICggKQogICAgd2hlbiBjaG9pY2UgaXMgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIHRoZW4gKCBjaG9pY2UgYXMgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uICkuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgZW5jLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkFuZE91dHBhdGllbnRTdXJnZXJ5U2VydmljZSAoICkKICAgIHdoZW4gY2hvaWNlIGlzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCB0aGVuICggY2hvaWNlIGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBzdGFydHMgZHVyaW5nIGVuYy5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb25BbmRPdXRwYXRpZW50U3VyZ2VyeVNlcnZpY2UgKCApIAogICAgZWxzZSBmYWxzZSBlbmQKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gc3RhcnRzMzBEYXlzT3JMZXNzQWZ0ZXJGaXJzdEFuZXN0aGVzaWEocHJvY2VkdXJlIFByb2NlZHVyZSwgZW5jb3VudGVyIEVuY291bnRlcik6CiAgcHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSBzdGFydHMgMzAgZGF5cyBvciBsZXNzIGFmdGVyIGVuZCBvZiBlbmNvdW50ZXIuZmlyc3RBbmVzdGhlc2lhRHVyaW5nSG9zcGl0YWxpemF0aW9uICggKS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaXNOb3RBdFByb2NlZHVyYWxIb3NwaXRhbExvY2F0aW9uKGVuY291bnRlciBFbmNvdW50ZXIpOgogIG5vdCBleGlzdHMgKCBlbmNvdW50ZXIubG9jYXRpb24gRW5jb3VudGVyTG9jYXRpb24KICAgICAgd2l0aCBbTG9jYXRpb25dIExvY2F0aW9uCiAgICAgICAgc3VjaCB0aGF0IEVuY291bnRlckxvY2F0aW9uLmxvY2F0aW9uLnJlZmVyZW5jZXMgKCBMb2NhdGlvbiApCiAgICAgICAgICBhbmQgTG9jYXRpb24udHlwZS5pbmNsdWRlc0NvZGUgKCAiRVIiICkKICApCgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGlzTm90QXRQcm9jZWR1cmFsSG9zcGl0YWxMb2NhdGlvbkR1cmluZyhlbmNvdW50ZXIgRW5jb3VudGVyLCBpbnRydmwgSW50ZXJ2YWw8RGF0ZVRpbWU+KToKICBub3QgZXhpc3RzICggZW5jb3VudGVyLmxvY2F0aW9uIEVuY291bnRlckxvY2F0aW9uCiAgICAgIHdpdGggW0xvY2F0aW9uXSBMb2NhdGlvbgogICAgICAgIHN1Y2ggdGhhdCBFbmNvdW50ZXJMb2NhdGlvbi5sb2NhdGlvbi5yZWZlcmVuY2VzICggTG9jYXRpb24gKQogICAgICAgICAgYW5kIExvY2F0aW9uLnR5cGUuaW5jbHVkZXNDb2RlICggIkVSIiApCiAgICAgICAgICBhbmQgRW5jb3VudGVyTG9jYXRpb24ucGVyaW9kIHN0YXJ0cyBkdXJpbmcgaW50cnZsCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBpc0R1cmluZ0hvc3BpdGFsaXphdGlvbihjaG9pY2UgQ2hvaWNlPFByb2NlZHVyZSwgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uPiwgZW5jIEVuY291bnRlcik6CiAgY2FzZQogICAgd2hlbiBjaG9pY2UgaXMgUHJvY2VkdXJlIHRoZW4gKCBjaG9pY2UgYXMgUHJvY2VkdXJlICkucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBlbmMuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uQW5kT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlICggKQogICAgd2hlbiBjaG9pY2UgaXMgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIHRoZW4gKCBjaG9pY2UgYXMgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uICkuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBlbmMuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uQW5kT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlICggKSAKICAgIGVsc2UgZmFsc2UgZW5kCgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGVhcmxpZXN0T2NjdXJzRHVyaW5nSG9zcGl0YWxpemF0aW9uKG9ic2VydmF0aW9uIExhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiwgZW5jb3VudGVyIEVuY291bnRlcik6CiAgb2JzZXJ2YXRpb24uZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgZW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkFuZE91dHBhdGllbnRTdXJnZXJ5U2VydmljZSAoICkKICAgIGFuZCBvYnNlcnZhdGlvbi52YWx1ZSBpcyBub3QgbnVsbAoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBlYXJsaWVzdElzRHVyaW5nSG9zcGl0YWxpemF0aW9uKHByb2NlZHVyZSBQcm9jZWR1cmUsIGVuY291bnRlciBFbmNvdW50ZXIpOgogIHByb2NlZHVyZS5wZXJmb3JtZWQuZWFybGllc3QgKCApIGR1cmluZyBlbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uQW5kT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlICggKQogICAgYW5kIHByb2NlZHVyZS5wYXJ0T2YgaXMgbm90IG51bGwKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaXNFYXJsaWVzdER1cmluZ0hvc3BpdGFsaXphdGlvbihjaG9pY2UgQ2hvaWNlPFByb2NlZHVyZSwgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uPiwgZW5jb3VudGVyIEVuY291bnRlcik6CiAgY2FzZQogICAgd2hlbiBjaG9pY2UgaXMgUHJvY2VkdXJlIHRoZW4gKCBjaG9pY2UgYXMgUHJvY2VkdXJlICkuZWFybGllc3RJc0R1cmluZ0hvc3BpdGFsaXphdGlvbiAoIGVuY291bnRlciApCiAgICB3aGVuIGNob2ljZSBpcyBMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24gdGhlbiAoIGNob2ljZSBhcyBMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24gKS5lYXJsaWVzdE9jY3Vyc0R1cmluZ0hvc3BpdGFsaXphdGlvbiAoIGVuY291bnRlciApIAogICAgZWxzZSBmYWxzZSBlbmQKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaW50ZXJ2YWwoY2hvaWNlIENob2ljZTxQcm9jZWR1cmUsIExhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiwgRW5jb3VudGVyPik6CiAgY2FzZQogICAgd2hlbiBjaG9pY2UgaXMgUHJvY2VkdXJlIHRoZW4gKCBjaG9pY2UgYXMgUHJvY2VkdXJlICkucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICB3aGVuIGNob2ljZSBpcyBMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24gdGhlbiAoIGNob2ljZSBhcyBMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24gKS5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKICAgIHdoZW4gY2hvaWNlIGlzIEVuY291bnRlciB0aGVuICggY2hvaWNlIGFzIEVuY291bnRlciApLnBlcmlvZC50b0ludGVydmFsICggKSAKICAgIGVsc2UgbnVsbCBhcyBJbnRlcnZhbDxEYXRlVGltZT5lbmQKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gcmFuayh0YXJnZXRQcm9jZWR1cmUgUHJvY2VkdXJlLCBwYXJlbnRFbmNvdW50ZXIgRW5jb3VudGVyKToKICBzaW5nbGV0b24gZnJvbSAoIHRhcmdldFByb2NlZHVyZSBQCiAgICAgIGxldCBjbGFpbTogKCBbQ2xhaW1dIEMKICAgICAgICAgIHdoZXJlIEMuc3RhdHVzID0gJ2FjdGl2ZScKICAgICAgICAgICAgYW5kIEMudXNlID0gJ2NsYWltJwogICAgICAgICAgICBhbmQgZXhpc3RzICggQy5pdGVtIEkKICAgICAgICAgICAgICAgIHdoZXJlIEkuZW5jb3VudGVyLnJlZmVyZW5jZXMgKCBwYXJlbnRFbmNvdW50ZXIgKQogICAgICAgICAgICApCiAgICAgICksCiAgICAgIGNsYWltUHJvYzogKCBjbGFpbS5wcm9jZWR1cmUgcHJvYwogICAgICAgICAgd2hlcmUgcHJvYy5wcm9jZWR1cmUucmVmZXJlbmNlcyAoIFAgKQogICAgICApCiAgICAgIHJldHVybiBjbGFpbVByb2Muc2VxdWVuY2UgUgogICkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gY2xhaW1EaWFnbm9zZXNXaXRoUE9BKGVuY291bnRlciBFbmNvdW50ZXIpOgogIGVuY291bnRlciBFCiAgICBsZXQgY2xhaW06ICggW0NsYWltXSBDCiAgICAgICAgd2hlcmUgQy5zdGF0dXMgPSAnYWN0aXZlJwogICAgICAgICAgYW5kIEMudXNlID0gJ2NsYWltJwogICAgICAgICAgYW5kIGV4aXN0cyAoIEMuaXRlbSBJCiAgICAgICAgICAgICAgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyAoIEUgKQogICAgICAgICAgKQogICAgKSwKICAgIGNsYWltSXRlbTogKCBjbGFpbS5pdGVtIEkKICAgICAgICB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzICggRSApCiAgICApCiAgICByZXR1cm4gY2xhaW0uZGlhZ25vc2lzIEQKICAgICAgd2hlcmUgRC5zZXF1ZW5jZSBpbiBjbGFpbUl0ZW0uZGlhZ25vc2lzU2VxdWVuY2UKICAgICAgICBhbmQgRC5vbkFkbWlzc2lvbiBpcyBub3QgbnVsbAoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBlbmNvdW50ZXJSZWFzb24oRW5jb3VudGVyIEVuY291bnRlcik6CiAgRW5jb3VudGVyLnJlYXNvblJlZmVyZW5jZSBECiAgICByZXR1cm4gc2luZ2xldG9uIGZyb20gKCAoIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXNdIGNBCiAgICAgICAgdW5pb24gW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnNdIGNCICkgQwogICAgICAgIHdoZXJlIEQucmVmZXJlbmNlcyAoIEMuaWQgKQogICAgKQ==",
    "url" : "https://madie.cms.gov/Library-CMS1218FHIRHHRF.cql"
  }]
}