Draft dQM CMS Content Implementation Guide
2025.1.0 - CI Build

Draft dQM CMS Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2025.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/dqm-content-cms-2025/ and changes regularly. See the Directory of published versions

: CMS1017FHIRHHFI - XML Representation

Draft as of 2026-09-19

Raw xml | Download


<Library xmlns="http://hl7.org/fhir">
  <id value="CMS1017FHIRHHFI"/>
  <text>
    <status value="extensions"/>
    <div xmlns="http://www.w3.org/1999/xhtml">
  <table class="narrative-table">
    <tbody>
<tr>


<th colspan="2" scope="row" class="row-header"><a name="metadata"> </a>Metadata</th>


</tr>







<tr>


<th scope="row" class="row-header">Version</th>



<td class="content-container">1.1.000</td>


</tr>
















<tr>


<th scope="row" class="row-header">Status</th>



<td class="content-container">Draft</td>


</tr>







































<tr>


<th scope="row" class="row-header">Type</th>



<td class="content-container">
    <a href="http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library


</td>


</tr>













<tr>


<th colspan="2" scope="row" class="row-header"><a name="parameters"> </a>Parameters</th>


</tr>


<tr>


<th scope="row" class="row-header">Parameter</th>



<td class="content-container">None</td>


</tr>








  <tr>


<th colspan="2" scope="row" class="row-header">Library Content</th>


</tr>
  
    
    <tr>
      <th scope="row" class="row-header">CQL Content</th>
      <td>
        <a name="cql-content"> </a>
        <pre style="border: none;" class="content-container highlight language-cql"><code class="language-cql">/*
NOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.
*/
library CMS1017FHIRHHFI version '1.1.000'

using USQualityCore version '0.1.0-cibuild'
using USCore version '6.1.0-derived'
using FHIR version '4.0.1'

include hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers
include hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon
include hl7.fhir.us.cql.CumulativeMedicationDuration version '2.0.0-ballot' called CMD
include hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon
include hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements

include CQMCommon version '5.1.000' called CQMCommon
include USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon
include SupplementalDataElements version '6.1.000' called SDE
include Status version '2.1.000' called Status

codesystem &quot;LOINC&quot;: 'http://loinc.org'

valueset &quot;Abnormal Weight Loss&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1258.2'
valueset &quot;Anticoagulants for All Indications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.22'
valueset &quot;Antidepressants&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.163'
valueset &quot;Antihypertensives&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.164'
valueset &quot;Central Nervous System Depressants&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.134'
valueset &quot;Coagulation Disorders&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.23'
valueset &quot;Delirium, Dementia, and Other Psychoses&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.168'
valueset &quot;Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.169'
valueset &quot;Diuretics&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.170'
valueset &quot;Epilepsy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.171'
valueset &quot;Inpatient Falls&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.171'
valueset &quot;Leukemia or Lymphoma&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.136'
valueset &quot;Liver Disease Moderate to Severe&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.137'
valueset &quot;Major Injuries&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.120'
valueset &quot;Malignant Bone Disease&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.24'
valueset &quot;Malnutrition&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1272.1'
valueset &quot;Moderate Injuries&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.205'
valueset &quot;Neurologic Movement and Related Disorders&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.174'
valueset &quot;Not Present On Admission or Documentation Insufficient to Determine&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.198'
valueset &quot;Obesity&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.162'
valueset &quot;Opioids&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.120'
valueset &quot;Osteoporosis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1200.147'
valueset &quot;Peripheral Neuropathy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.175'
valueset &quot;Present on Admission or Clinically Undetermined&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197'
valueset &quot;Stroke&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.176'
valueset &quot;Suicide Attempt&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.130'
valueset &quot;Emergency Department Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.292'
valueset &quot;Encounter Inpatient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'

parameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;
  default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)

context Patient

define &quot;Qualifying Encounter&quot;:
  CQMCommon.&quot;Inpatient Encounter&quot; InpatientEncounter
    where InpatientEncounter.hospitalizationWithObservation ( ).lengthInDays ( ) &lt;= 120
      and AgeInYearsAt(date from start of InpatientEncounter.period) &gt;= 18

define &quot;Initial Population&quot;:
  &quot;Qualifying Encounter&quot;

define &quot;Denominator&quot;:
  &quot;Initial Population&quot;

define &quot;Numerator&quot;:
  &quot;Encounter Where A Fall And Major Injury Occurred Not POA&quot;
    union &quot;Encounter Where A Fall And Moderate Injury Occurred Not POA&quot;

define &quot;Encounter Where A Fall And Moderate Injury Occurred Not POA&quot;:
  &quot;Encounter With A Fall Not Present On Admission&quot; FallOccurred
    where exists ( ( FallOccurred.claimDiagnosis ( ) ) ModerateFallOccurred
        where ( ModerateFallOccurred.onAdmission is null
            or ModerateFallOccurred.onAdmission in &quot;Not Present On Admission or Documentation Insufficient to Determine&quot;
        )
          and ( ModerateFallOccurred.diagnosis in &quot;Moderate Injuries&quot;
              or ModerateFallOccurred.diagnosis.getCondition ( ).code in &quot;Moderate Injuries&quot;
          )
    )

define &quot;Encounter Where A Fall And Major Injury Occurred Not POA&quot;:
  &quot;Encounter With A Fall Not Present On Admission&quot; FallOccurred
    where exists ( ( FallOccurred.claimDiagnosis ( ) ) MajorFallOccurred
        where ( MajorFallOccurred.onAdmission is null
            or MajorFallOccurred.onAdmission in &quot;Not Present On Admission or Documentation Insufficient to Determine&quot;
        )
          and ( MajorFallOccurred.diagnosis in &quot;Major Injuries&quot;
              or MajorFallOccurred.diagnosis.getCondition ( ).code in &quot;Major Injuries&quot;
          )
    )

define &quot;Encounter Where A Fall Occurred&quot;:
  &quot;Encounter With A Fall Diagnosis&quot; EncounterFallDiagnosis
    union &quot;Encounter With A Fall Event&quot; EncounterFallEvent

define &quot;Encounter With A Fall Not Present On Admission&quot;:
  &quot;Encounter Where A Fall Occurred&quot; EncounterFallDiagnosis
    where EncounterFallDiagnosis.hasDiagnosisNotPresentOnAdmissionOrNull ( &quot;Inpatient Falls&quot; )

define &quot;Encounter With A Fall Diagnosis&quot;:
  &quot;Qualifying Encounter&quot; QualifyingFall
    where QualifyingFall.reasonCode in &quot;Inpatient Falls&quot;
      or QualifyingFall.encountersDiagnosis ( ).code in &quot;Inpatient Falls&quot;

define &quot;Encounter With A Fall Event&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    with [AdverseEvent: &quot;Inpatient Falls&quot;] FallsDocumentation
      such that Coalesce(FallsDocumentation.date, FallsDocumentation.recordedDate) during InpatientEncounter.hospitalizationWithObservation ( )

define &quot;Denominator Exclusions&quot;:
  &quot;Encounter With A Fall Present On Admission&quot;

define &quot;Numerator Exclusions&quot;:
  &quot;Encounter With A Fall Present On Admission&quot;

define &quot;Encounter With A Fall Present On Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Inpatient Falls&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Body Mass Index (BMI)&quot;:
  from
    [&quot;USCore.BMIProfile&quot;] BMI
    with &quot;Qualifying Encounter&quot; InpatientEncounter
      such that BMI.effective.toInterval ( ) starts during InpatientEncounter.hospitalizationWithObservation ( )
        and BMI.value is not null
        and BMI.status in { 'final', 'amended', 'corrected' }
    return BMI.value as Quantity

define &quot;Risk Variable All Encounter Diagnoses with Rank and POA Indication&quot;:
  from
    &quot;Qualifying Encounter&quot; InpatientEncounter
    let claim: ( [Claim] C
        where C.status = 'active'
          and C.use = 'claim'
          and exists ( C.item ClaimItem
              where ClaimItem.encounter.references ( InpatientEncounter )
          )
    ),
    claimItem: ( claim.item ClaimItem
        where ClaimItem.encounter.references ( InpatientEncounter )
    )
    return Tuple {
      encounterId: InpatientEncounter.id,
      diagnosis: claim.diagnosis,
      rank: claim.diagnosis.sequence,
      POA: claim.diagnosis Diag
        where Diag.onAdmission in &quot;Present on Admission or Clinically Undetermined&quot;
          or Diag.onAdmission in &quot;Not Present On Admission or Documentation Insufficient to Determine&quot;
    }

define &quot;Risk Variable Encounter with Abnormal Weight Loss or Malnutrition Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Abnormal Weight Loss&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )
      or InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Malnutrition&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Anticoagulant Active at Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    with [&quot;MedicationRequest&quot;: &quot;Anticoagulants for All Indications&quot;] Anticoagulants
      such that Anticoagulants.status in { 'active', 'completed' }
        and ( Anticoagulants.intent = 'order'
            or ( Anticoagulants.intent = 'plan'
                and Anticoagulants.subject.reference.getId ( ) = Patient.id
            )
        )
        and Anticoagulants.isCommunity ( )
        and Anticoagulants.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period

define &quot;Risk Variable Encounter with Anticoagulant Administration During Encounter&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    with [&quot;MedicationAdministration&quot;: &quot;Anticoagulants for All Indications&quot;] Anticoagulants
      such that Anticoagulants.effective.toInterval ( ) starts during InpatientEncounter.hospitalizationWithObservation ( )
        and Anticoagulants.status in { 'in-progress', 'completed' }

define &quot;Risk Variable Encounter with Antidepressant Active at Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    with [&quot;MedicationRequest&quot;: &quot;Antidepressants&quot;] AntidepressantMed
      such that AntidepressantMed.status in { 'active', 'completed' }
        and ( AntidepressantMed.intent = 'order'
            or ( AntidepressantMed.intent = 'plan'
                and AntidepressantMed.subject.reference.getId ( ) = Patient.id
            )
        )
        and AntidepressantMed.isCommunity ( )
        and AntidepressantMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period

define &quot;Risk Variable Encounter with Antihypertensive Active at Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    with [&quot;MedicationRequest&quot;: &quot;Antihypertensives&quot;] BPMed
      such that BPMed.status in { 'active', 'completed' }
        and ( BPMed.intent = 'order'
            or ( BPMed.intent = 'plan'
                and BPMed.subject.reference.getId ( ) = Patient.id
            )
        )
        and BPMed.isCommunity ( )
        and BPMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period

define &quot;Risk Variable Encounter with CNS Depressant Active at Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    with [&quot;MedicationRequest&quot;: &quot;Central Nervous System Depressants&quot;] CNSMed
      such that CNSMed.status in { 'active', 'completed' }
        and ( CNSMed.intent = 'order'
            or ( CNSMed.intent = 'plan'
                and CNSMed.subject.reference.getId ( ) = Patient.id
            )
        )
        and CNSMed.isCommunity ( )
        and CNSMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period

define &quot;Risk Variable Encounter with Diuretic Active at Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    with [&quot;MedicationRequest&quot;: &quot;Diuretics&quot;] DiureticMed
      such that DiureticMed.status in { 'active', 'completed' }
        and ( DiureticMed.intent = 'order'
            or ( DiureticMed.intent = 'plan'
                and DiureticMed.subject.reference.getId ( ) = Patient.id
            )
        )
        and DiureticMed.isCommunity ( )
        and DiureticMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period

define &quot;Risk Variable Encounter with Opioid Medication Active at Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    with [&quot;MedicationRequest&quot;: &quot;Opioids&quot;] OpioidMed
      such that OpioidMed.status in { 'active', 'completed' }
        and ( OpioidMed.intent = 'order'
            or ( OpioidMed.intent = 'plan'
                and OpioidMed.subject.reference.getId ( ) = Patient.id
            )
        )
        and OpioidMed.isCommunity ( )
        and OpioidMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period

define &quot;Risk Variable Encounter with Coagulation Disorder Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Coagulation Disorders&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Delirium or Dementia or Other Psychosis Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Delirium, Dementia, and Other Psychoses&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Depression Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Depression&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Epilepsy Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Epilepsy&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Leukemia or Lymphoma Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Leukemia or Lymphoma&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Liver Disease Moderate to Severe Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Liver Disease Moderate to Severe&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Malignant Bone Disease Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Malignant Bone Disease&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Neurologic Disorder Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Neurologic Movement and Related Disorders&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Obesity Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Obesity&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Osteoporosis Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Osteoporosis&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Peripheral Neuropathy Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Peripheral Neuropathy&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Stroke Present on Admission&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.isDiagnosisPresentOnAdmission ( &quot;Stroke&quot;, &quot;Present on Admission or Clinically Undetermined&quot; )

define &quot;Risk Variable Encounter with Suicide Attempt&quot;:
  &quot;Qualifying Encounter&quot; InpatientEncounter
    where InpatientEncounter.encountersDiagnosis ( ).code in &quot;Suicide Attempt&quot;

define &quot;SDE Ethnicity&quot;:
  SDE.&quot;SDE Ethnicity&quot;

define &quot;SDE Payer&quot;:
  SDE.&quot;SDE Payer&quot;

define &quot;SDE Race&quot;:
  SDE.&quot;SDE Race&quot;

define &quot;SDE Sex&quot;:
  SDE.&quot;SDE Sex&quot;

define function &quot;Denominator Observation&quot;(QualifyingEncounter Encounter):
  duration in days of QualifyingEncounter.hospitalizationWithObservation ( )

define function &quot;Numerator Observation&quot;(QualifyingEncounter Encounter):
  Count(&quot;Numerator&quot; FallsEncounter
      where FallsEncounter.period ends during QualifyingEncounter.hospitalizationWithObservation()
  )

define fluent function hasDiagnosisNotPresentOnAdmissionOrNull(encounter Encounter, diagnosisValueSet System.ValueSet):
  exists ( [Claim] C
      where C.status = 'active'
        and C.use = 'claim'
        and exists ( C.item I
            where I.encounter.references ( encounter )
        )
      return C.diagnosis D
        where exists ( C.item I
            where I.encounter.references ( encounter )
              and D.sequence in I.diagnosisSequence
        )
          and ( D.onAdmission is null
              or D.onAdmission in &quot;Not Present On Admission or Documentation Insufficient to Determine&quot;
          )
          and D.diagnosis as FHIR.CodeableConcept in diagnosisValueSet
  )

define fluent function encountersDiagnosis(Encounter Encounter):
  Encounter.reasonReference EncDiag
    return singleton from ( ( [ConditionEncounterDiagnosis] ConditionED
        union [ConditionProblemsHealthConcerns] ConditionPHC ) Cond
        where EncDiag.references ( Cond.id )
    )</code></pre>
      </td>
    </tr>
    
  



<tr>
  <th colspan="2" scope="row" class="row-header">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>
</tr>

    </tbody>
  </table>
</div>
  </text>
  <extension
             url="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem">
    <valueReference>
      <reference value="Device/cqf-tooling"/>
    </valueReference>
  </extension>
  <url value="https://madie.cms.gov/Library/CMS1017FHIRHHFI"/>
  <version value="1.1.000"/>
  <name value="CMS1017FHIRHHFI"/>
  <status value="draft"/>
  <type>
    <coding>
      <system value="http://terminology.hl7.org/CodeSystem/library-type"/>
      <code value="logic-library"/>
    </coding>
  </type>
  <date value="2026-09-19T16:31:14+00:00"/>
  <content>
    <contentType value="text/cql"/>
    <data
          value="LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVMxMDE3RkhJUkhIRkkgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLkN1bXVsYXRpdmVNZWRpY2F0aW9uRHVyYXRpb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgQ01ECmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlRWxlbWVudHMgdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlRWxlbWVudHMKCmluY2x1ZGUgQ1FNQ29tbW9uIHZlcnNpb24gJzUuMS4wMDAnIGNhbGxlZCBDUU1Db21tb24KaW5jbHVkZSBVU1F1YWxpdHlDb3JlQ29tbW9uIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnIGNhbGxlZCBVU1F1YWxpdHlDb3JlQ29tbW9uCmluY2x1ZGUgU3VwcGxlbWVudGFsRGF0YUVsZW1lbnRzIHZlcnNpb24gJzYuMS4wMDAnIGNhbGxlZCBTREUKaW5jbHVkZSBTdGF0dXMgdmVyc2lvbiAnMi4xLjAwMCcgY2FsbGVkIFN0YXR1cwoKY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycKCnZhbHVlc2V0ICJBYm5vcm1hbCBXZWlnaHQgTG9zcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNTguMicKdmFsdWVzZXQgIkFudGljb2FndWxhbnRzIGZvciBBbGwgSW5kaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIyJwp2YWx1ZXNldCAiQW50aWRlcHJlc3NhbnRzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4xNjMnCnZhbHVlc2V0ICJBbnRpaHlwZXJ0ZW5zaXZlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTY0Jwp2YWx1ZXNldCAiQ2VudHJhbCBOZXJ2b3VzIFN5c3RlbSBEZXByZXNzYW50cyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTM0Jwp2YWx1ZXNldCAiQ29hZ3VsYXRpb24gRGlzb3JkZXJzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4yMycKdmFsdWVzZXQgIkRlbGlyaXVtLCBEZW1lbnRpYSwgYW5kIE90aGVyIFBzeWNob3NlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTY4Jwp2YWx1ZXNldCAiRGVwcmVzc2lvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTY5Jwp2YWx1ZXNldCAiRGl1cmV0aWNzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4xNzAnCnZhbHVlc2V0ICJFcGlsZXBzeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTcxJwp2YWx1ZXNldCAiSW5wYXRpZW50IEZhbGxzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE0Ny4xNzEnCnZhbHVlc2V0ICJMZXVrZW1pYSBvciBMeW1waG9tYSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTM2Jwp2YWx1ZXNldCAiTGl2ZXIgRGlzZWFzZSBNb2RlcmF0ZSB0byBTZXZlcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjEzNycKdmFsdWVzZXQgIk1ham9yIEluanVyaWVzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE0Ny4xMjAnCnZhbHVlc2V0ICJNYWxpZ25hbnQgQm9uZSBEaXNlYXNlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4yNCcKdmFsdWVzZXQgIk1hbG51dHJpdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNzIuMScKdmFsdWVzZXQgIk1vZGVyYXRlIEluanVyaWVzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4yMDUnCnZhbHVlc2V0ICJOZXVyb2xvZ2ljIE1vdmVtZW50IGFuZCBSZWxhdGVkIERpc29yZGVycyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTc0Jwp2YWx1ZXNldCAiTm90IFByZXNlbnQgT24gQWRtaXNzaW9uIG9yIERvY3VtZW50YXRpb24gSW5zdWZmaWNpZW50IHRvIERldGVybWluZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExNDcuMTk4Jwp2YWx1ZXNldCAiT2Jlc2l0eSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTYyJwp2YWx1ZXNldCAiT3Bpb2lkcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTIwJwp2YWx1ZXNldCAiT3N0ZW9wb3Jvc2lzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTIwMC4xNDcnCnZhbHVlc2V0ICJQZXJpcGhlcmFsIE5ldXJvcGF0aHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjE3NScKdmFsdWVzZXQgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE0Ny4xOTcnCnZhbHVlc2V0ICJTdHJva2UiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjE3NicKdmFsdWVzZXQgIlN1aWNpZGUgQXR0ZW1wdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTMwJwp2YWx1ZXNldCAiRW1lcmdlbmN5IERlcGFydG1lbnQgVmlzaXQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI5MicKdmFsdWVzZXQgIkVuY291bnRlciBJbnBhdGllbnQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjY2LjUuMzA3JwoKcGFyYW1ldGVyICJNZWFzdXJlbWVudCBQZXJpb2QiIEludGVydmFsPERhdGVUaW1lPgogIGRlZmF1bHQgSW50ZXJ2YWxbQDIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiwgQDIwMjctMDEtMDFUMDA6MDA6MDAuMDAwWikKCmNvbnRleHQgUGF0aWVudAoKZGVmaW5lICJRdWFsaWZ5aW5nIEVuY291bnRlciI6CiAgQ1FNQ29tbW9uLiJJbnBhdGllbnQgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLmxlbmd0aEluRGF5cyAoICkgPD0gMTIwCiAgICAgIGFuZCBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIElucGF0aWVudEVuY291bnRlci5wZXJpb2QpID49IDE4CgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIgoKZGVmaW5lICJEZW5vbWluYXRvciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIKCmRlZmluZSAiTnVtZXJhdG9yIjoKICAiRW5jb3VudGVyIFdoZXJlIEEgRmFsbCBBbmQgTWFqb3IgSW5qdXJ5IE9jY3VycmVkIE5vdCBQT0EiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdoZXJlIEEgRmFsbCBBbmQgTW9kZXJhdGUgSW5qdXJ5IE9jY3VycmVkIE5vdCBQT0EiCgpkZWZpbmUgIkVuY291bnRlciBXaGVyZSBBIEZhbGwgQW5kIE1vZGVyYXRlIEluanVyeSBPY2N1cnJlZCBOb3QgUE9BIjoKICAiRW5jb3VudGVyIFdpdGggQSBGYWxsIE5vdCBQcmVzZW50IE9uIEFkbWlzc2lvbiIgRmFsbE9jY3VycmVkCiAgICB3aGVyZSBleGlzdHMgKCAoIEZhbGxPY2N1cnJlZC5jbGFpbURpYWdub3NpcyAoICkgKSBNb2RlcmF0ZUZhbGxPY2N1cnJlZAogICAgICAgIHdoZXJlICggTW9kZXJhdGVGYWxsT2NjdXJyZWQub25BZG1pc3Npb24gaXMgbnVsbAogICAgICAgICAgICBvciBNb2RlcmF0ZUZhbGxPY2N1cnJlZC5vbkFkbWlzc2lvbiBpbiAiTm90IFByZXNlbnQgT24gQWRtaXNzaW9uIG9yIERvY3VtZW50YXRpb24gSW5zdWZmaWNpZW50IHRvIERldGVybWluZSIKICAgICAgICApCiAgICAgICAgICBhbmQgKCBNb2RlcmF0ZUZhbGxPY2N1cnJlZC5kaWFnbm9zaXMgaW4gIk1vZGVyYXRlIEluanVyaWVzIgogICAgICAgICAgICAgIG9yIE1vZGVyYXRlRmFsbE9jY3VycmVkLmRpYWdub3Npcy5nZXRDb25kaXRpb24gKCApLmNvZGUgaW4gIk1vZGVyYXRlIEluanVyaWVzIgogICAgICAgICAgKQogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2hlcmUgQSBGYWxsIEFuZCBNYWpvciBJbmp1cnkgT2NjdXJyZWQgTm90IFBPQSI6CiAgIkVuY291bnRlciBXaXRoIEEgRmFsbCBOb3QgUHJlc2VudCBPbiBBZG1pc3Npb24iIEZhbGxPY2N1cnJlZAogICAgd2hlcmUgZXhpc3RzICggKCBGYWxsT2NjdXJyZWQuY2xhaW1EaWFnbm9zaXMgKCApICkgTWFqb3JGYWxsT2NjdXJyZWQKICAgICAgICB3aGVyZSAoIE1ham9yRmFsbE9jY3VycmVkLm9uQWRtaXNzaW9uIGlzIG51bGwKICAgICAgICAgICAgb3IgTWFqb3JGYWxsT2NjdXJyZWQub25BZG1pc3Npb24gaW4gIk5vdCBQcmVzZW50IE9uIEFkbWlzc2lvbiBvciBEb2N1bWVudGF0aW9uIEluc3VmZmljaWVudCB0byBEZXRlcm1pbmUiCiAgICAgICAgKQogICAgICAgICAgYW5kICggTWFqb3JGYWxsT2NjdXJyZWQuZGlhZ25vc2lzIGluICJNYWpvciBJbmp1cmllcyIKICAgICAgICAgICAgICBvciBNYWpvckZhbGxPY2N1cnJlZC5kaWFnbm9zaXMuZ2V0Q29uZGl0aW9uICggKS5jb2RlIGluICJNYWpvciBJbmp1cmllcyIKICAgICAgICAgICkKICAgICkKCmRlZmluZSAiRW5jb3VudGVyIFdoZXJlIEEgRmFsbCBPY2N1cnJlZCI6CiAgIkVuY291bnRlciBXaXRoIEEgRmFsbCBEaWFnbm9zaXMiIEVuY291bnRlckZhbGxEaWFnbm9zaXMKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBBIEZhbGwgRXZlbnQiIEVuY291bnRlckZhbGxFdmVudAoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBBIEZhbGwgTm90IFByZXNlbnQgT24gQWRtaXNzaW9uIjoKICAiRW5jb3VudGVyIFdoZXJlIEEgRmFsbCBPY2N1cnJlZCIgRW5jb3VudGVyRmFsbERpYWdub3NpcwogICAgd2hlcmUgRW5jb3VudGVyRmFsbERpYWdub3Npcy5oYXNEaWFnbm9zaXNOb3RQcmVzZW50T25BZG1pc3Npb25Pck51bGwgKCAiSW5wYXRpZW50IEZhbGxzIiApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEEgRmFsbCBEaWFnbm9zaXMiOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgUXVhbGlmeWluZ0ZhbGwKICAgIHdoZXJlIFF1YWxpZnlpbmdGYWxsLnJlYXNvbkNvZGUgaW4gIklucGF0aWVudCBGYWxscyIKICAgICAgb3IgUXVhbGlmeWluZ0ZhbGwuZW5jb3VudGVyc0RpYWdub3NpcyAoICkuY29kZSBpbiAiSW5wYXRpZW50IEZhbGxzIgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBBIEZhbGwgRXZlbnQiOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aXRoIFtBZHZlcnNlRXZlbnQ6ICJJbnBhdGllbnQgRmFsbHMiXSBGYWxsc0RvY3VtZW50YXRpb24KICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKEZhbGxzRG9jdW1lbnRhdGlvbi5kYXRlLCBGYWxsc0RvY3VtZW50YXRpb24ucmVjb3JkZWREYXRlKSBkdXJpbmcgSW5wYXRpZW50RW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjbHVzaW9ucyI6CiAgIkVuY291bnRlciBXaXRoIEEgRmFsbCBQcmVzZW50IE9uIEFkbWlzc2lvbiIKCmRlZmluZSAiTnVtZXJhdG9yIEV4Y2x1c2lvbnMiOgogICJFbmNvdW50ZXIgV2l0aCBBIEZhbGwgUHJlc2VudCBPbiBBZG1pc3Npb24iCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEEgRmFsbCBQcmVzZW50IE9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJJbnBhdGllbnQgRmFsbHMiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBCb2R5IE1hc3MgSW5kZXggKEJNSSkiOgogIGZyb20KICAgIFsiVVNDb3JlLkJNSVByb2ZpbGUiXSBCTUkKICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgICAgc3VjaCB0aGF0IEJNSS5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBJbnBhdGllbnRFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgICAgIGFuZCBCTUkudmFsdWUgaXMgbm90IG51bGwKICAgICAgICBhbmQgQk1JLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgcmV0dXJuIEJNSS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEFsbCBFbmNvdW50ZXIgRGlhZ25vc2VzIHdpdGggUmFuayBhbmQgUE9BIEluZGljYXRpb24iOgogIGZyb20KICAgICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICBsZXQgY2xhaW06ICggW0NsYWltXSBDCiAgICAgICAgd2hlcmUgQy5zdGF0dXMgPSAnYWN0aXZlJwogICAgICAgICAgYW5kIEMudXNlID0gJ2NsYWltJwogICAgICAgICAgYW5kIGV4aXN0cyAoIEMuaXRlbSBDbGFpbUl0ZW0KICAgICAgICAgICAgICB3aGVyZSBDbGFpbUl0ZW0uZW5jb3VudGVyLnJlZmVyZW5jZXMgKCBJbnBhdGllbnRFbmNvdW50ZXIgKQogICAgICAgICAgKQogICAgKSwKICAgIGNsYWltSXRlbTogKCBjbGFpbS5pdGVtIENsYWltSXRlbQogICAgICAgIHdoZXJlIENsYWltSXRlbS5lbmNvdW50ZXIucmVmZXJlbmNlcyAoIElucGF0aWVudEVuY291bnRlciApCiAgICApCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogSW5wYXRpZW50RW5jb3VudGVyLmlkLAogICAgICBkaWFnbm9zaXM6IGNsYWltLmRpYWdub3NpcywKICAgICAgcmFuazogY2xhaW0uZGlhZ25vc2lzLnNlcXVlbmNlLAogICAgICBQT0E6IGNsYWltLmRpYWdub3NpcyBEaWFnCiAgICAgICAgd2hlcmUgRGlhZy5vbkFkbWlzc2lvbiBpbiAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiCiAgICAgICAgICBvciBEaWFnLm9uQWRtaXNzaW9uIGluICJOb3QgUHJlc2VudCBPbiBBZG1pc3Npb24gb3IgRG9jdW1lbnRhdGlvbiBJbnN1ZmZpY2llbnQgdG8gRGV0ZXJtaW5lIgogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIEFibm9ybWFsIFdlaWdodCBMb3NzIG9yIE1hbG51dHJpdGlvbiBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJBYm5vcm1hbCBXZWlnaHQgTG9zcyIsICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCIgKQogICAgICBvciBJbnBhdGllbnRFbmNvdW50ZXIuaXNEaWFnbm9zaXNQcmVzZW50T25BZG1pc3Npb24gKCAiTWFsbnV0cml0aW9uIiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggQW50aWNvYWd1bGFudCBBY3RpdmUgYXQgQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2l0aCBbIk1lZGljYXRpb25SZXF1ZXN0IjogIkFudGljb2FndWxhbnRzIGZvciBBbGwgSW5kaWNhdGlvbnMiXSBBbnRpY29hZ3VsYW50cwogICAgICBzdWNoIHRoYXQgQW50aWNvYWd1bGFudHMuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgKCBBbnRpY29hZ3VsYW50cy5pbnRlbnQgPSAnb3JkZXInCiAgICAgICAgICAgIG9yICggQW50aWNvYWd1bGFudHMuaW50ZW50ID0gJ3BsYW4nCiAgICAgICAgICAgICAgICBhbmQgQW50aWNvYWd1bGFudHMuc3ViamVjdC5yZWZlcmVuY2UuZ2V0SWQgKCApID0gUGF0aWVudC5pZAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFuZCBBbnRpY29hZ3VsYW50cy5pc0NvbW11bml0eSAoICkKICAgICAgICBhbmQgQW50aWNvYWd1bGFudHMubWVkaWNhdGlvblJlcXVlc3RQZXJpb2QgKCApIG92ZXJsYXBzIGJlZm9yZSBkYXkgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZAoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIEFudGljb2FndWxhbnQgQWRtaW5pc3RyYXRpb24gRHVyaW5nIEVuY291bnRlciI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiQW50aWNvYWd1bGFudHMgZm9yIEFsbCBJbmRpY2F0aW9ucyJdIEFudGljb2FndWxhbnRzCiAgICAgIHN1Y2ggdGhhdCBBbnRpY29hZ3VsYW50cy5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBJbnBhdGllbnRFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgICAgIGFuZCBBbnRpY29hZ3VsYW50cy5zdGF0dXMgaW4geyAnaW4tcHJvZ3Jlc3MnLCAnY29tcGxldGVkJyB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggQW50aWRlcHJlc3NhbnQgQWN0aXZlIGF0IEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJBbnRpZGVwcmVzc2FudHMiXSBBbnRpZGVwcmVzc2FudE1lZAogICAgICBzdWNoIHRoYXQgQW50aWRlcHJlc3NhbnRNZWQuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgKCBBbnRpZGVwcmVzc2FudE1lZC5pbnRlbnQgPSAnb3JkZXInCiAgICAgICAgICAgIG9yICggQW50aWRlcHJlc3NhbnRNZWQuaW50ZW50ID0gJ3BsYW4nCiAgICAgICAgICAgICAgICBhbmQgQW50aWRlcHJlc3NhbnRNZWQuc3ViamVjdC5yZWZlcmVuY2UuZ2V0SWQgKCApID0gUGF0aWVudC5pZAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFuZCBBbnRpZGVwcmVzc2FudE1lZC5pc0NvbW11bml0eSAoICkKICAgICAgICBhbmQgQW50aWRlcHJlc3NhbnRNZWQubWVkaWNhdGlvblJlcXVlc3RQZXJpb2QgKCApIG92ZXJsYXBzIGJlZm9yZSBkYXkgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZAoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIEFudGloeXBlcnRlbnNpdmUgQWN0aXZlIGF0IEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJBbnRpaHlwZXJ0ZW5zaXZlcyJdIEJQTWVkCiAgICAgIHN1Y2ggdGhhdCBCUE1lZC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIGFuZCAoIEJQTWVkLmludGVudCA9ICdvcmRlcicKICAgICAgICAgICAgb3IgKCBCUE1lZC5pbnRlbnQgPSAncGxhbicKICAgICAgICAgICAgICAgIGFuZCBCUE1lZC5zdWJqZWN0LnJlZmVyZW5jZS5nZXRJZCAoICkgPSBQYXRpZW50LmlkCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgYW5kIEJQTWVkLmlzQ29tbXVuaXR5ICggKQogICAgICAgIGFuZCBCUE1lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYmVmb3JlIGRheSBvZiBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggQ05TIERlcHJlc3NhbnQgQWN0aXZlIGF0IEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJDZW50cmFsIE5lcnZvdXMgU3lzdGVtIERlcHJlc3NhbnRzIl0gQ05TTWVkCiAgICAgIHN1Y2ggdGhhdCBDTlNNZWQuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgKCBDTlNNZWQuaW50ZW50ID0gJ29yZGVyJwogICAgICAgICAgICBvciAoIENOU01lZC5pbnRlbnQgPSAncGxhbicKICAgICAgICAgICAgICAgIGFuZCBDTlNNZWQuc3ViamVjdC5yZWZlcmVuY2UuZ2V0SWQgKCApID0gUGF0aWVudC5pZAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFuZCBDTlNNZWQuaXNDb21tdW5pdHkgKCApCiAgICAgICAgYW5kIENOU01lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYmVmb3JlIGRheSBvZiBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggRGl1cmV0aWMgQWN0aXZlIGF0IEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJEaXVyZXRpY3MiXSBEaXVyZXRpY01lZAogICAgICBzdWNoIHRoYXQgRGl1cmV0aWNNZWQuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgKCBEaXVyZXRpY01lZC5pbnRlbnQgPSAnb3JkZXInCiAgICAgICAgICAgIG9yICggRGl1cmV0aWNNZWQuaW50ZW50ID0gJ3BsYW4nCiAgICAgICAgICAgICAgICBhbmQgRGl1cmV0aWNNZWQuc3ViamVjdC5yZWZlcmVuY2UuZ2V0SWQgKCApID0gUGF0aWVudC5pZAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFuZCBEaXVyZXRpY01lZC5pc0NvbW11bml0eSAoICkKICAgICAgICBhbmQgRGl1cmV0aWNNZWQubWVkaWNhdGlvblJlcXVlc3RQZXJpb2QgKCApIG92ZXJsYXBzIGJlZm9yZSBkYXkgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZAoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIE9waW9pZCBNZWRpY2F0aW9uIEFjdGl2ZSBhdCBBZG1pc3Npb24iOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aXRoIFsiTWVkaWNhdGlvblJlcXVlc3QiOiAiT3Bpb2lkcyJdIE9waW9pZE1lZAogICAgICBzdWNoIHRoYXQgT3Bpb2lkTWVkLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgYW5kICggT3Bpb2lkTWVkLmludGVudCA9ICdvcmRlcicKICAgICAgICAgICAgb3IgKCBPcGlvaWRNZWQuaW50ZW50ID0gJ3BsYW4nCiAgICAgICAgICAgICAgICBhbmQgT3Bpb2lkTWVkLnN1YmplY3QucmVmZXJlbmNlLmdldElkICggKSA9IFBhdGllbnQuaWQKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICBhbmQgT3Bpb2lkTWVkLmlzQ29tbXVuaXR5ICggKQogICAgICAgIGFuZCBPcGlvaWRNZWQubWVkaWNhdGlvblJlcXVlc3RQZXJpb2QgKCApIG92ZXJsYXBzIGJlZm9yZSBkYXkgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZAoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIENvYWd1bGF0aW9uIERpc29yZGVyIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIkNvYWd1bGF0aW9uIERpc29yZGVycyIsICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCIgKQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIERlbGlyaXVtIG9yIERlbWVudGlhIG9yIE90aGVyIFBzeWNob3NpcyBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJEZWxpcml1bSwgRGVtZW50aWEsIGFuZCBPdGhlciBQc3ljaG9zZXMiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBEZXByZXNzaW9uIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIkRlcHJlc3Npb24iLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBFcGlsZXBzeSBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJFcGlsZXBzeSIsICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCIgKQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIExldWtlbWlhIG9yIEx5bXBob21hIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIkxldWtlbWlhIG9yIEx5bXBob21hIiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggTGl2ZXIgRGlzZWFzZSBNb2RlcmF0ZSB0byBTZXZlcmUgUHJlc2VudCBvbiBBZG1pc3Npb24iOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aGVyZSBJbnBhdGllbnRFbmNvdW50ZXIuaXNEaWFnbm9zaXNQcmVzZW50T25BZG1pc3Npb24gKCAiTGl2ZXIgRGlzZWFzZSBNb2RlcmF0ZSB0byBTZXZlcmUiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBNYWxpZ25hbnQgQm9uZSBEaXNlYXNlIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIk1hbGlnbmFudCBCb25lIERpc2Vhc2UiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBOZXVyb2xvZ2ljIERpc29yZGVyIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIk5ldXJvbG9naWMgTW92ZW1lbnQgYW5kIFJlbGF0ZWQgRGlzb3JkZXJzIiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggT2Jlc2l0eSBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJPYmVzaXR5IiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggT3N0ZW9wb3Jvc2lzIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIk9zdGVvcG9yb3NpcyIsICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCIgKQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIFBlcmlwaGVyYWwgTmV1cm9wYXRoeSBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJQZXJpcGhlcmFsIE5ldXJvcGF0aHkiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBTdHJva2UgUHJlc2VudCBvbiBBZG1pc3Npb24iOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aGVyZSBJbnBhdGllbnRFbmNvdW50ZXIuaXNEaWFnbm9zaXNQcmVzZW50T25BZG1pc3Npb24gKCAiU3Ryb2tlIiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggU3VpY2lkZSBBdHRlbXB0IjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmVuY291bnRlcnNEaWFnbm9zaXMgKCApLmNvZGUgaW4gIlN1aWNpZGUgQXR0ZW1wdCIKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4IgoKZGVmaW5lIGZ1bmN0aW9uICJEZW5vbWluYXRvciBPYnNlcnZhdGlvbiIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIGR1cmF0aW9uIGluIGRheXMgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCgpkZWZpbmUgZnVuY3Rpb24gIk51bWVyYXRvciBPYnNlcnZhdGlvbiIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIENvdW50KCJOdW1lcmF0b3IiIEZhbGxzRW5jb3VudGVyCiAgICAgIHdoZXJlIEZhbGxzRW5jb3VudGVyLnBlcmlvZCBlbmRzIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBoYXNEaWFnbm9zaXNOb3RQcmVzZW50T25BZG1pc3Npb25Pck51bGwoZW5jb3VudGVyIEVuY291bnRlciwgZGlhZ25vc2lzVmFsdWVTZXQgU3lzdGVtLlZhbHVlU2V0KToKICBleGlzdHMgKCBbQ2xhaW1dIEMKICAgICAgd2hlcmUgQy5zdGF0dXMgPSAnYWN0aXZlJwogICAgICAgIGFuZCBDLnVzZSA9ICdjbGFpbScKICAgICAgICBhbmQgZXhpc3RzICggQy5pdGVtIEkKICAgICAgICAgICAgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyAoIGVuY291bnRlciApCiAgICAgICAgKQogICAgICByZXR1cm4gQy5kaWFnbm9zaXMgRAogICAgICAgIHdoZXJlIGV4aXN0cyAoIEMuaXRlbSBJCiAgICAgICAgICAgIHdoZXJlIEkuZW5jb3VudGVyLnJlZmVyZW5jZXMgKCBlbmNvdW50ZXIgKQogICAgICAgICAgICAgIGFuZCBELnNlcXVlbmNlIGluIEkuZGlhZ25vc2lzU2VxdWVuY2UKICAgICAgICApCiAgICAgICAgICBhbmQgKCBELm9uQWRtaXNzaW9uIGlzIG51bGwKICAgICAgICAgICAgICBvciBELm9uQWRtaXNzaW9uIGluICJOb3QgUHJlc2VudCBPbiBBZG1pc3Npb24gb3IgRG9jdW1lbnRhdGlvbiBJbnN1ZmZpY2llbnQgdG8gRGV0ZXJtaW5lIgogICAgICAgICAgKQogICAgICAgICAgYW5kIEQuZGlhZ25vc2lzIGFzIEZISVIuQ29kZWFibGVDb25jZXB0IGluIGRpYWdub3Npc1ZhbHVlU2V0CiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBlbmNvdW50ZXJzRGlhZ25vc2lzKEVuY291bnRlciBFbmNvdW50ZXIpOgogIEVuY291bnRlci5yZWFzb25SZWZlcmVuY2UgRW5jRGlhZwogICAgcmV0dXJuIHNpbmdsZXRvbiBmcm9tICggKCBbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzXSBDb25kaXRpb25FRAogICAgICAgIHVuaW9uIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zXSBDb25kaXRpb25QSEMgKSBDb25kCiAgICAgICAgd2hlcmUgRW5jRGlhZy5yZWZlcmVuY2VzICggQ29uZC5pZCApCiAgICAp"/>
    <url value="https://madie.cms.gov/Library-CMS1017FHIRHHFI.cql"/>
  </content>
</Library>