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
| Draft as of 2026-09-19 |
{
"resourceType" : "Library",
"id" : "CMS145FHIRCADBBlockerTPMIorLVSD",
"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.0.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\">library CMS145FHIRCADBBlockerTPMIorLVSD version '1.0.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 SupplementalDataElements version '6.1.000' called SDE\ninclude AHAOverall version '5.1.000' called AHA\n\ncodesystem "SNOMEDCT": 'http://snomed.info/sct'\n\nvalueset "Allergy to Beta Blocker Therapy": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1177'\nvalueset "Arrhythmia": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.366'\nvalueset "Asthma": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.362'\nvalueset "Atrioventricular Block": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.367'\nvalueset "Beta Blocker Therapy": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1174'\nvalueset "Beta Blocker Therapy for LVSD": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1184'\nvalueset "Beta Blocker Therapy Ingredient": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1493'\nvalueset "Bradycardia": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.412'\nvalueset "Cardiac Pacer": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1178.53'\nvalueset "Cardiac Pacer in Situ": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.368'\nvalueset "Cardiac Surgery": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.371'\nvalueset "Care Services in Long Term Residential Facility": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1014'\nvalueset "Coronary Artery Disease No MI": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.369'\nvalueset "Ejection Fraction": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1134'\nvalueset "Face-to-Face Interaction": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1048'\nvalueset "Home Healthcare Services": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1016'\nvalueset "Hypotension": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.370'\nvalueset "Intolerance to Beta Blocker Therapy": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1178'\nvalueset "Medical Reason": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1007'\nvalueset "Moderate or Severe": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1092'\nvalueset "Moderate or Severe LVSD": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1090'\nvalueset "Myocardial Infarction": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.403'\nvalueset "Nursing Facility Visit": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1012'\nvalueset "Office Visit": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001'\nvalueset "Outpatient Consultation": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1008'\nvalueset "Patient Provider Interaction": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1012'\nvalueset "Patient Reason": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1008'\n// TODO: Remove this value set reference since it is not referenced in the logic\nvalueset "System Reason": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1009'\n\ncode "Substance with beta adrenergic receptor antagonist mechanism of action (substance)": '373254001' from "SNOMEDCT" display 'Substance with beta adrenergic receptor antagonist mechanism of action (substance)'\n\nparameter "Measurement Period" Interval<DateTime>\n default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine "Denominator 2":\n "Initial Population"\n and exists "Qualifying CAD Encounter and Prior MI"\n\ndefine "Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI without Cardiac Pacer":\n "Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI"\n and not "Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and Prior MI"\n and not "Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and Prior MI"\n\n/*\n* @code: Heart rate - 8867-4\n* @profile: http://hl7.org/fhir/us/core/StructureDefinition/us-core-heart-rate \n*/\n\n\ndefine "Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and Prior MI":\n exists ( from\n // TODO: Consider best practice of always qualifying type names\n ["HeartRateProfile"] HeartRateExam,\n "Qualifying CAD Encounter and Prior MI" CADEncounterMI\n let PriorHeartRateExam: Last(["HeartRateProfile"] MostRecentPriorHeartRateExam\n where MostRecentPriorHeartRateExam.effective.toInterval() during CADEncounterMI.period\n and MostRecentPriorHeartRateExam.status in { 'final', 'amended', 'corrected' }\n and MostRecentPriorHeartRateExam.effective.toInterval() before HeartRateExam.effective.toInterval()\n sort by start of effective.toInterval()\n )\n where HeartRateExam.effective.toInterval ( ) during CADEncounterMI.period\n and HeartRateExam.status in { 'final', 'amended', 'corrected' }\n and HeartRateExam.value < 50 '/min'\n and PriorHeartRateExam.value < 50 '/min'\n )\n\ndefine "Numerator 1":\n "Has Beta Blocker Therapy for LVSD Ordered"\n or "Is Currently Taking Beta Blocker Therapy for LVSD"\n\ndefine "Numerator 2":\n "Has Beta Blocker Therapy Ordered"\n or "Is Currently Taking Beta Blocker Therapy"\n\ndefine "SDE Ethnicity":\n SDE."SDE Ethnicity"\n\ndefine "SDE Payer":\n SDE."SDE Payer"\n\ndefine "SDE Race":\n SDE."SDE Race"\n\ndefine "SDE Sex":\n SDE."SDE Sex"\n\ndefine "Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and Prior MI":\n exists ( [Procedure: "Cardiac Pacer"] ImplantedCardiacPacer\n with "Qualifying CAD Encounter and Prior MI" CADEncounterMI\n such that ImplantedCardiacPacer.performed.toInterval ( ) starts before end of CADEncounterMI.period\n and ImplantedCardiacPacer.status = 'completed'\n )\n\ndefine "Qualifying CAD Encounter and Prior MI":\n "Qualifying CAD Encounter" EncounterWithCADProxy\n with ( [FHIR.Condition: "Myocardial Infarction"] ) MyocardialInfarction\n such that MyocardialInfarction.prevalenceInterval ( ) starts 3 years or less before day of start of EncounterWithCADProxy.period\n and not exists AHA."Moderate or Severe LVSD Findings"\n and MyocardialInfarction.isVerified ( )\n\ndefine "Denominator 1":\n "Initial Population"\n and exists "Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n\ndefine "Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD without Cardiac Pacer":\n "Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n and not "Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n and not "Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n\n/*\n* @code: Heart rate - 8867-4\n* @profile: http://hl7.org/fhir/us/core/StructureDefinition/us-core-heart-rate\n*/\n\n\ndefine "Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( from\n ["HeartRateProfile"] HeartRateExam,\n "Qualifying CAD Encounter and History of Moderate or Severe LVSD" CADEncounterModerateOrSevereLVSD\n let PriorHeartRateExam: Last(["HeartRateProfile"] MostRecentPriorHeartRateExam\n where MostRecentPriorHeartRateExam.effective.toInterval() during CADEncounterModerateOrSevereLVSD.period\n and MostRecentPriorHeartRateExam.status in { 'final', 'amended', 'corrected' }\n and MostRecentPriorHeartRateExam.effective.toInterval() before HeartRateExam.effective.toInterval()\n sort by start of effective.toInterval()\n )\n where HeartRateExam.effective.toInterval ( ) during CADEncounterModerateOrSevereLVSD.period\n and HeartRateExam.status in { 'final', 'amended', 'corrected' }\n and HeartRateExam.value < 50 '/min'\n and PriorHeartRateExam.value < 50 '/min'\n )\n\ndefine "Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( [Procedure: "Cardiac Pacer"] ImplantedCardiacPacer\n with "Qualifying CAD Encounter and History of Moderate or Severe LVSD" CADEncounterModerateOrSevereLVSD\n such that ImplantedCardiacPacer.performed.toInterval ( ) starts before end of CADEncounterModerateOrSevereLVSD.period\n )\n\ndefine "Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( [ConditionProblemsHealthConcerns: "Cardiac Pacer in Situ"] CardiacPacerDiagnosis\n where CardiacPacerDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and History of Moderate or Severe LVSD" )\n )\n\ndefine "Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and Prior MI":\n exists ( [ConditionProblemsHealthConcerns: "Cardiac Pacer in Situ"] CardiacPacerDiagnosis\n where CardiacPacerDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and Prior MI" )\n )\n\ndefine "Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and Prior MI":\n exists ( ( [AllergyIntolerance: "Beta Blocker Therapy Ingredient"]\n union [AllergyIntolerance: "Substance with beta adrenergic receptor antagonist mechanism of action (substance)"] ) BetaBlockerAllergyIntolerance\n where BetaBlockerAllergyIntolerance.overlapsAfterDayOfEncounter ( "Qualifying CAD Encounter and Prior MI" )\n )\n\ndefine "Has Beta Blocker Therapy for LVSD Ordered":\n exists ( [MedicationRequest: medication in "Beta Blocker Therapy for LVSD"] BetaBlockerForLVSDOrdered\n where BetaBlockerForLVSDOrdered.authoredDuringDayOfEncounter ( "Qualifying CAD Encounter and History of Moderate or Severe LVSD" )\n )\n\ndefine "Has Beta Blocker Therapy Ordered":\n exists ( [MedicationRequest: medication in "Beta Blocker Therapy"] BetaBlockerOrdered\n where BetaBlockerOrdered.authoredDuringDayOfEncounter ( "Qualifying CAD Encounter and Prior MI" )\n )\n\ndefine "Is Currently Taking Beta Blocker Therapy":\n exists ( [MedicationRequest: medication in "Beta Blocker Therapy"] ActiveBetaBlocker\n with "Qualifying CAD Encounter and Prior MI" CADEncounterMI\n such that First((collapse(ActiveBetaBlocker.dosageInstruction.timing.repeat.bounds DoseTime\n return DoseTime.toInterval()\n )) DrugPeriod\n sort by start of $this\n ) overlaps after day of CADEncounterMI.period\n where ActiveBetaBlocker.status in { 'active', 'completed' }\n and ActiveBetaBlocker.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n )\n\ndefine "Is Currently Taking Beta Blocker Therapy for LVSD":\n exists ( [MedicationRequest: medication in "Beta Blocker Therapy for LVSD"] ActiveBetaBlockerForLVSD\n with "Qualifying CAD Encounter and History of Moderate or Severe LVSD" CADEncounterModerateOrSevereLVSD\n such that First((collapse(ActiveBetaBlockerForLVSD.dosageInstruction.timing.repeat.bounds DoseTime\n return DoseTime.toInterval()\n )) DrugPeriod\n sort by start of $this\n ) overlaps after day of CADEncounterModerateOrSevereLVSD.period\n where ActiveBetaBlockerForLVSD.status in { 'active', 'completed' }\n and ActiveBetaBlockerForLVSD.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n )\n\ndefine "Outpatient Encounter During Measurement Period":\n ( [Encounter: "Office Visit"]\n union [Encounter: "Outpatient Consultation"]\n union [Encounter: "Care Services in Long Term Residential Facility"]\n union [Encounter: "Home Healthcare Services"]\n union [Encounter: "Nursing Facility Visit"] ) QualifyingEncounter\n where QualifyingEncounter.period during day of "Measurement Period"\n and QualifyingEncounter.status = 'finished'\n\ndefine "Qualifying Encounter During Measurement Period":\n ( [Encounter: "Office Visit"]\n union [Encounter: "Outpatient Consultation"]\n union [Encounter: "Nursing Facility Visit"]\n union [Encounter: "Care Services in Long Term Residential Facility"]\n union [Encounter: "Home Healthcare Services"]\n union [Encounter: "Patient Provider Interaction"] ) ValidEncounter\n where ValidEncounter.period during day of "Measurement Period"\n and ValidEncounter.status = 'finished'\n\ndefine "Coronary Artery Disease Encounter":\n "Outpatient Encounter During Measurement Period" ValidQualifyingEncounter\n with ( [ConditionProblemsHealthConcerns: "Coronary Artery Disease No MI"]\n union [ConditionEncounterDiagnosis: "Coronary Artery Disease No MI"] ) CoronaryArteryDisease\n such that CoronaryArteryDisease.overlapsDayOfEncounter ( ValidQualifyingEncounter )\n\ndefine "Has Arrhythmia with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( [ConditionProblemsHealthConcerns: "Arrhythmia"] ArrhythmiaDiagnosis\n where ArrhythmiaDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and History of Moderate or Severe LVSD" )\n )\n\ndefine "Has Arrhythmia with Qualifying CAD Encounter and Prior MI":\n exists ( [ConditionProblemsHealthConcerns: "Arrhythmia"] ArrhythmiaDiagnosis\n where ArrhythmiaDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and Prior MI" )\n )\n\ndefine "Has Asthma with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( [ConditionProblemsHealthConcerns: "Asthma"] AsthmaDiagnosis\n where AsthmaDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and History of Moderate or Severe LVSD" )\n )\n\ndefine "Has Asthma with Qualifying CAD Encounter and Prior MI":\n exists ( [ConditionProblemsHealthConcerns: "Asthma"] AsthmaDiagnosis\n where AsthmaDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and Prior MI" )\n )\n\ndefine "Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( [ConditionProblemsHealthConcerns: "Atrioventricular Block"] AtrioventricularBlock\n where AtrioventricularBlock.overlapsDayOfEncounter ( "Qualifying CAD Encounter and History of Moderate or Severe LVSD" )\n )\n\ndefine "Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI":\n exists ( [ConditionProblemsHealthConcerns: "Atrioventricular Block"] AtrioventricularBlockDiagnosis\n where AtrioventricularBlockDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and Prior MI" )\n )\n\ndefine "Has Bradycardia with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( [ConditionProblemsHealthConcerns: "Bradycardia"] BradycardiaDiagnosis\n where BradycardiaDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and History of Moderate or Severe LVSD" )\n )\n\ndefine "Has Bradycardia with Qualifying CAD Encounter and Prior MI":\n exists ( [ConditionProblemsHealthConcerns: "Bradycardia"] BradycardiaDiagnosis\n where BradycardiaDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and Prior MI" )\n )\n\ndefine "Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( ( [ConditionProblemsHealthConcerns: "Allergy to Beta Blocker Therapy"]\n union [ConditionProblemsHealthConcerns: "Intolerance to Beta Blocker Therapy"] ) BetaBlockerAllergyOrIntoleranceDiagnosis\n where BetaBlockerAllergyOrIntoleranceDiagnosis.overlapsAfterDayOfEncounter ( "Qualifying CAD Encounter and History of Moderate or Severe LVSD" )\n )\n\ndefine "Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and Prior MI":\n exists ( ( [ConditionProblemsHealthConcerns: "Allergy to Beta Blocker Therapy"]\n union [ConditionProblemsHealthConcerns: "Intolerance to Beta Blocker Therapy"] ) BetaBlockerAllergyOrIntoleranceDiagnosis\n where BetaBlockerAllergyOrIntoleranceDiagnosis.overlapsAfterDayOfEncounter ( "Qualifying CAD Encounter and Prior MI" )\n )\n\ndefine "Has Hypotension with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( [ConditionProblemsHealthConcerns: "Hypotension"] HypotensionDiagnosis\n where HypotensionDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and History of Moderate or Severe LVSD" )\n )\n\ndefine "Has Hypotension with Qualifying CAD Encounter and Prior MI":\n exists ( ( [ConditionProblemsHealthConcerns: "Hypotension"]\n union [ConditionEncounterDiagnosis: "Hypotension"] ) HypotensionDiagnosis\n where HypotensionDiagnosis.overlapsDayOfEncounter ( "Qualifying CAD Encounter and Prior MI" )\n )\n\ndefine "Denominator Exceptions 1":\n "Has Arrhythmia with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n or "Has Asthma with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n or "Has Bradycardia with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n or "Has Hypotension with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n or "Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n or "Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n or "Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and History of Moderate or Severe LVSD"\n or "Has Medical or Patient Reason for Not Ordering Beta Blocker for LVSD"\n or "Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD without Cardiac Pacer"\n\ndefine "Denominator Exceptions 2":\n "Has Arrhythmia with Qualifying CAD Encounter and Prior MI"\n or "Has Asthma with Qualifying CAD Encounter and Prior MI"\n or "Has Bradycardia with Qualifying CAD Encounter and Prior MI"\n or "Has Hypotension with Qualifying CAD Encounter and Prior MI"\n or "Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and Prior MI"\n or "Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and Prior MI"\n or "Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and Prior MI"\n or "Has Medical or Patient Reason for Not Ordering Beta Blocker Therapy"\n or "Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI without Cardiac Pacer"\n\ndefine "Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n exists ( ( [AllergyIntolerance: "Beta Blocker Therapy Ingredient"]\n union [AllergyIntolerance: "Substance with beta adrenergic receptor antagonist mechanism of action (substance)"] ) BetaBlockerAllergyIntolerance\n where BetaBlockerAllergyIntolerance.overlapsAfterDayOfEncounter ( "Qualifying CAD Encounter and History of Moderate or Severe LVSD" )\n )\n\ndefine "Has Medical or Patient Reason for Not Ordering Beta Blocker for LVSD":\n exists ( [MedicationNotRequested: medication in "Beta Blocker Therapy for LVSD"] NoBetaBlockerForLVSDOrdered\n with "Qualifying CAD Encounter and History of Moderate or Severe LVSD" LVSDVisit\n such that NoBetaBlockerForLVSDOrdered.authoredOn during day of LVSDVisit.period\n where NoBetaBlockerForLVSDOrdered.status in { 'active', 'completed' }\n and NoBetaBlockerForLVSDOrdered.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n and ( NoBetaBlockerForLVSDOrdered.reasonCode in "Medical Reason"\n or NoBetaBlockerForLVSDOrdered.reasonCode in "Patient Reason"\n )\n )\n\ndefine "Has Medical or Patient Reason for Not Ordering Beta Blocker Therapy":\n exists ( [MedicationNotRequested: medication in "Beta Blocker Therapy for LVSD"] NoBetaBlockerForLVSDOrdered\n with "Qualifying CAD Encounter and Prior MI" PriorMIVisit\n such that NoBetaBlockerForLVSDOrdered.authoredOn during day of PriorMIVisit.period\n where NoBetaBlockerForLVSDOrdered.status in { 'active', 'completed' }\n and NoBetaBlockerForLVSDOrdered.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n and ( NoBetaBlockerForLVSDOrdered.reasonCode in "Medical Reason"\n or NoBetaBlockerForLVSDOrdered.reasonCode in "Patient Reason"\n )\n )\n\ndefine "Initial Population":\n AgeInYearsAt(date from start of "Measurement Period") >= 18\n and exists ( "Qualifying Encounter During Measurement Period" Encounter1\n with "Qualifying Encounter During Measurement Period" Encounter2\n such that Encounter2.id !~ Encounter1.id\n )\n and exists "Qualifying CAD Encounter"\n\ndefine "Qualifying CAD Encounter and History of Moderate or Severe LVSD":\n "Qualifying CAD Encounter" EncounterWithCADProxy\n with AHA."Moderate or Severe LVSD Findings" LVSDFindings\n such that Coalesce(LVSDFindings.prevalenceInterval(), LVSDFindings.effective.toInterval()) starts before end of EncounterWithCADProxy.period\n\ndefine "History of Cardiac Surgery Prior to Encounter":\n "Outpatient Encounter During Measurement Period" ValidQualifyingEncounter\n with [Procedure: "Cardiac Surgery"] CardiacSurgeryProcedure\n such that CardiacSurgeryProcedure.performed.toInterval ( ) starts before end of ValidQualifyingEncounter.period\n and CardiacSurgeryProcedure.status = 'completed'\n\ndefine "Qualifying CAD Encounter":\n "Coronary Artery Disease Encounter"\n union "History of Cardiac Surgery Prior to Encounter"\n\ndefine fluent function overlapsDayOfEncounter(Diagnosis ConditionProblemsHealthConcerns, EncounterList List<Encounter>):\n AnyTrue(EncounterList Visit\n return Diagnosis.overlapsDayOfEncounter(Visit)\n )\n\ndefine fluent function overlapsDayOfEncounter(Diagnosis ConditionProblemsHealthConcerns, TheEncounter Encounter):\n TheEncounter Visit\n where Diagnosis.isVerified ( )\n return Diagnosis.prevalenceInterval ( ) overlaps day of Visit.period\n\ndefine fluent function overlapsAfterDayOfEncounter(Event Choice<AllergyIntolerance, ConditionProblemsHealthConcerns>, EncounterList List<Encounter>):\n AnyTrue(EncounterList Visit\n return\n case\n when Event is AllergyIntolerance then Interval[start of Event.onset.toInterval(), Event.lastOccurrence]overlaps after day of Visit.period\n and(Event.clinicalStatus is null\n or Event.clinicalStatus ~ FHIRCommon."allergy-active"\n )\n and(Event.verificationStatus is null\n or Event.verificationStatus ~ FHIRCommon."allergy-confirmed"\n )\n when Event is ConditionProblemsHealthConcerns then Event.isVerified()\n and Event.prevalenceInterval() overlaps after day of Visit.period \n else false \n end\n )\n\ndefine fluent function authoredDuringDayOfEncounter(Order Choice<MedicationRequest, MedicationNotRequested>, EncounterList List<Encounter>):\n AnyTrue(EncounterList Visit\n return\n case\n when Order is MedicationRequest then Order.authoredOn during day of Visit.period\n and Order.status in { 'active', 'completed' }\n and Order.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n and Order.doNotPerform is not true\n when Order is MedicationNotRequested then Order.authoredOn during day of Visit.period\n and Order.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' } \n else false \n end\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/CMS145FHIRCADBBlockerTPMIorLVSD",
"version" : "1.0.000",
"name" : "CMS145FHIRCADBBlockerTPMIorLVSD",
"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" : "bGlicmFyeSBDTVMxNDVGSElSQ0FEQkJsb2NrZXJUUE1Jb3JMVlNEIHZlcnNpb24gJzEuMC4wMDAnCgp1c2luZyBVU1F1YWxpdHlDb3JlIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnCnVzaW5nIFVTQ29yZSB2ZXJzaW9uICc2LjEuMC1kZXJpdmVkJwp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnIGNhbGxlZCBGSElSSGVscGVycwppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSQ29tbW9uIHZlcnNpb24gJzIuMC4wJyBjYWxsZWQgRkhJUkNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVDb21tb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUVsZW1lbnRzIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUVsZW1lbnRzCgppbmNsdWRlIFN1cHBsZW1lbnRhbERhdGFFbGVtZW50cyB2ZXJzaW9uICc2LjEuMDAwJyBjYWxsZWQgU0RFCmluY2x1ZGUgQUhBT3ZlcmFsbCB2ZXJzaW9uICc1LjEuMDAwJyBjYWxsZWQgQUhBCgpjb2Rlc3lzdGVtICJTTk9NRURDVCI6ICdodHRwOi8vc25vbWVkLmluZm8vc2N0JwoKdmFsdWVzZXQgIkFsbGVyZ3kgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTE3NycKdmFsdWVzZXQgIkFycmh5dGhtaWEiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzY2Jwp2YWx1ZXNldCAiQXN0aG1hIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjM2MicKdmFsdWVzZXQgIkF0cmlvdmVudHJpY3VsYXIgQmxvY2siOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzY3Jwp2YWx1ZXNldCAiQmV0YSBCbG9ja2VyIFRoZXJhcHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTE3NCcKdmFsdWVzZXQgIkJldGEgQmxvY2tlciBUaGVyYXB5IGZvciBMVlNEIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjExODQnCnZhbHVlc2V0ICJCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjE0OTMnCnZhbHVlc2V0ICJCcmFkeWNhcmRpYSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy40MTInCnZhbHVlc2V0ICJDYXJkaWFjIFBhY2VyIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE3OC41MycKdmFsdWVzZXQgIkNhcmRpYWMgUGFjZXIgaW4gU2l0dSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4zNjgnCnZhbHVlc2V0ICJDYXJkaWFjIFN1cmdlcnkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzcxJwp2YWx1ZXNldCAiQ2FyZSBTZXJ2aWNlcyBpbiBMb25nIFRlcm0gUmVzaWRlbnRpYWwgRmFjaWxpdHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMTQnCnZhbHVlc2V0ICJDb3JvbmFyeSBBcnRlcnkgRGlzZWFzZSBObyBNSSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4zNjknCnZhbHVlc2V0ICJFamVjdGlvbiBGcmFjdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMTM0Jwp2YWx1ZXNldCAiRmFjZS10by1GYWNlIEludGVyYWN0aW9uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDQ4Jwp2YWx1ZXNldCAiSG9tZSBIZWFsdGhjYXJlIFNlcnZpY2VzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDE2Jwp2YWx1ZXNldCAiSHlwb3RlbnNpb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzcwJwp2YWx1ZXNldCAiSW50b2xlcmFuY2UgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTE3OCcKdmFsdWVzZXQgIk1lZGljYWwgUmVhc29uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjEwMDcnCnZhbHVlc2V0ICJNb2RlcmF0ZSBvciBTZXZlcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTA5MicKdmFsdWVzZXQgIk1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjEwOTAnCnZhbHVlc2V0ICJNeW9jYXJkaWFsIEluZmFyY3Rpb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuNDAzJwp2YWx1ZXNldCAiTnVyc2luZyBGYWNpbGl0eSBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAxMicKdmFsdWVzZXQgIk9mZmljZSBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAwMScKdmFsdWVzZXQgIk91dHBhdGllbnQgQ29uc3VsdGF0aW9uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDA4Jwp2YWx1ZXNldCAiUGF0aWVudCBQcm92aWRlciBJbnRlcmFjdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMDEyJwp2YWx1ZXNldCAiUGF0aWVudCBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAwOCcKLy8gVE9ETzogUmVtb3ZlIHRoaXMgdmFsdWUgc2V0IHJlZmVyZW5jZSBzaW5jZSBpdCBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgbG9naWMKdmFsdWVzZXQgIlN5c3RlbSBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAwOScKCmNvZGUgIlN1YnN0YW5jZSB3aXRoIGJldGEgYWRyZW5lcmdpYyByZWNlcHRvciBhbnRhZ29uaXN0IG1lY2hhbmlzbSBvZiBhY3Rpb24gKHN1YnN0YW5jZSkiOiAnMzczMjU0MDAxJyBmcm9tICJTTk9NRURDVCIgZGlzcGxheSAnU3Vic3RhbmNlIHdpdGggYmV0YSBhZHJlbmVyZ2ljIHJlY2VwdG9yIGFudGFnb25pc3QgbWVjaGFuaXNtIG9mIGFjdGlvbiAoc3Vic3RhbmNlKScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiRGVub21pbmF0b3IgMiI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIKICAgIGFuZCBleGlzdHMgIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCgpkZWZpbmUgIkhhcyBBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSB3aXRob3V0IENhcmRpYWMgUGFjZXIiOgogICJIYXMgQXRyaW92ZW50cmljdWxhciBCbG9jayB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBhbmQgbm90ICJIYXMgRGlhZ25vc2lzIG9mIENhcmRpYWMgUGFjZXIgaW4gU2l0dSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBhbmQgbm90ICJIYXMgQ2FyZGlhYyBQYWNlciBEZXZpY2UgSW1wbGFudGVkIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIKCi8qCiogQGNvZGU6IEhlYXJ0IHJhdGUgLSA4ODY3LTQKKiBAcHJvZmlsZTogaHR0cDovL2hsNy5vcmcvZmhpci91cy9jb3JlL1N0cnVjdHVyZURlZmluaXRpb24vdXMtY29yZS1oZWFydC1yYXRlIAoqLwoKCmRlZmluZSAiSGFzIENvbnNlY3V0aXZlIEhlYXJ0IFJhdGVzIExlc3MgdGhhbiA1MCB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiOgogIGV4aXN0cyAoIGZyb20KICAgICAgLy8gVE9ETzogQ29uc2lkZXIgYmVzdCBwcmFjdGljZSBvZiBhbHdheXMgcXVhbGlmeWluZyB0eXBlIG5hbWVzCiAgICAgIFsiSGVhcnRSYXRlUHJvZmlsZSJdIEhlYXJ0UmF0ZUV4YW0sCiAgICAgICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiBDQURFbmNvdW50ZXJNSQogICAgICBsZXQgUHJpb3JIZWFydFJhdGVFeGFtOiBMYXN0KFsiSGVhcnRSYXRlUHJvZmlsZSJdIE1vc3RSZWNlbnRQcmlvckhlYXJ0UmF0ZUV4YW0KICAgICAgICAgIHdoZXJlIE1vc3RSZWNlbnRQcmlvckhlYXJ0UmF0ZUV4YW0uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBkdXJpbmcgQ0FERW5jb3VudGVyTUkucGVyaW9kCiAgICAgICAgICAgIGFuZCBNb3N0UmVjZW50UHJpb3JIZWFydFJhdGVFeGFtLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgICAgICBhbmQgTW9zdFJlY2VudFByaW9ySGVhcnRSYXRlRXhhbS5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIGJlZm9yZSBIZWFydFJhdGVFeGFtLmVmZmVjdGl2ZS50b0ludGVydmFsKCkKICAgICAgICAgIHNvcnQgYnkgc3RhcnQgb2YgZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKQogICAgICApCiAgICAgIHdoZXJlIEhlYXJ0UmF0ZUV4YW0uZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBDQURFbmNvdW50ZXJNSS5wZXJpb2QKICAgICAgICBhbmQgSGVhcnRSYXRlRXhhbS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgSGVhcnRSYXRlRXhhbS52YWx1ZSA8IDUwICcvbWluJwogICAgICAgIGFuZCBQcmlvckhlYXJ0UmF0ZUV4YW0udmFsdWUgPCA1MCAnL21pbicKICApCgpkZWZpbmUgIk51bWVyYXRvciAxIjoKICAiSGFzIEJldGEgQmxvY2tlciBUaGVyYXB5IGZvciBMVlNEIE9yZGVyZWQiCiAgICBvciAiSXMgQ3VycmVudGx5IFRha2luZyBCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCIKCmRlZmluZSAiTnVtZXJhdG9yIDIiOgogICJIYXMgQmV0YSBCbG9ja2VyIFRoZXJhcHkgT3JkZXJlZCIKICAgIG9yICJJcyBDdXJyZW50bHkgVGFraW5nIEJldGEgQmxvY2tlciBUaGVyYXB5IgoKZGVmaW5lICJTREUgRXRobmljaXR5IjoKICBTREUuIlNERSBFdGhuaWNpdHkiCgpkZWZpbmUgIlNERSBQYXllciI6CiAgU0RFLiJTREUgUGF5ZXIiCgpkZWZpbmUgIlNERSBSYWNlIjoKICBTREUuIlNERSBSYWNlIgoKZGVmaW5lICJTREUgU2V4IjoKICBTREUuIlNERSBTZXgiCgpkZWZpbmUgIkhhcyBDYXJkaWFjIFBhY2VyIERldmljZSBJbXBsYW50ZWQgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbUHJvY2VkdXJlOiAiQ2FyZGlhYyBQYWNlciJdIEltcGxhbnRlZENhcmRpYWNQYWNlcgogICAgICB3aXRoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiBDQURFbmNvdW50ZXJNSQogICAgICAgIHN1Y2ggdGhhdCBJbXBsYW50ZWRDYXJkaWFjUGFjZXIucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIENBREVuY291bnRlck1JLnBlcmlvZAogICAgICAgICAgYW5kIEltcGxhbnRlZENhcmRpYWNQYWNlci5zdGF0dXMgPSAnY29tcGxldGVkJwogICkKCmRlZmluZSAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSI6CiAgIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciIgRW5jb3VudGVyV2l0aENBRFByb3h5CiAgICB3aXRoICggW0ZISVIuQ29uZGl0aW9uOiAiTXlvY2FyZGlhbCBJbmZhcmN0aW9uIl0gKSBNeW9jYXJkaWFsSW5mYXJjdGlvbgogICAgICBzdWNoIHRoYXQgTXlvY2FyZGlhbEluZmFyY3Rpb24ucHJldmFsZW5jZUludGVydmFsICggKSBzdGFydHMgMyB5ZWFycyBvciBsZXNzIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgRW5jb3VudGVyV2l0aENBRFByb3h5LnBlcmlvZAogICAgICAgIGFuZCBub3QgZXhpc3RzIEFIQS4iTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QgRmluZGluZ3MiCiAgICAgICAgYW5kIE15b2NhcmRpYWxJbmZhcmN0aW9uLmlzVmVyaWZpZWQgKCApCgpkZWZpbmUgIkRlbm9taW5hdG9yIDEiOgogICJJbml0aWFsIFBvcHVsYXRpb24iCiAgICBhbmQgZXhpc3RzICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCgpkZWZpbmUgIkhhcyBBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIHdpdGhvdXQgQ2FyZGlhYyBQYWNlciI6CiAgIkhhcyBBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIgogICAgYW5kIG5vdCAiSGFzIERpYWdub3NpcyBvZiBDYXJkaWFjIFBhY2VyIGluIFNpdHUgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBhbmQgbm90ICJIYXMgQ2FyZGlhYyBQYWNlciBEZXZpY2UgSW1wbGFudGVkIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIgoKLyoKKiBAY29kZTogSGVhcnQgcmF0ZSAtIDg4NjctNAoqIEBwcm9maWxlOiBodHRwOi8vaGw3Lm9yZy9maGlyL3VzL2NvcmUvU3RydWN0dXJlRGVmaW5pdGlvbi91cy1jb3JlLWhlYXJ0LXJhdGUKKi8KCgpkZWZpbmUgIkhhcyBDb25zZWN1dGl2ZSBIZWFydCBSYXRlcyBMZXNzIHRoYW4gNTAgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOgogIGV4aXN0cyAoIGZyb20KICAgICAgWyJIZWFydFJhdGVQcm9maWxlIl0gSGVhcnRSYXRlRXhhbSwKICAgICAgIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgQ0FERW5jb3VudGVyTW9kZXJhdGVPclNldmVyZUxWU0QKICAgICAgbGV0IFByaW9ySGVhcnRSYXRlRXhhbTogTGFzdChbIkhlYXJ0UmF0ZVByb2ZpbGUiXSBNb3N0UmVjZW50UHJpb3JIZWFydFJhdGVFeGFtCiAgICAgICAgICB3aGVyZSBNb3N0UmVjZW50UHJpb3JIZWFydFJhdGVFeGFtLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgZHVyaW5nIENBREVuY291bnRlck1vZGVyYXRlT3JTZXZlcmVMVlNELnBlcmlvZAogICAgICAgICAgICBhbmQgTW9zdFJlY2VudFByaW9ySGVhcnRSYXRlRXhhbS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICAgICAgYW5kIE1vc3RSZWNlbnRQcmlvckhlYXJ0UmF0ZUV4YW0uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBiZWZvcmUgSGVhcnRSYXRlRXhhbS5lZmZlY3RpdmUudG9JbnRlcnZhbCgpCiAgICAgICAgICBzb3J0IGJ5IHN0YXJ0IG9mIGVmZmVjdGl2ZS50b0ludGVydmFsKCkKICAgICAgKQogICAgICB3aGVyZSBIZWFydFJhdGVFeGFtLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBkdXJpbmcgQ0FERW5jb3VudGVyTW9kZXJhdGVPclNldmVyZUxWU0QucGVyaW9kCiAgICAgICAgYW5kIEhlYXJ0UmF0ZUV4YW0uc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEhlYXJ0UmF0ZUV4YW0udmFsdWUgPCA1MCAnL21pbicKICAgICAgICBhbmQgUHJpb3JIZWFydFJhdGVFeGFtLnZhbHVlIDwgNTAgJy9taW4nCiAgKQoKZGVmaW5lICJIYXMgQ2FyZGlhYyBQYWNlciBEZXZpY2UgSW1wbGFudGVkIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCBbUHJvY2VkdXJlOiAiQ2FyZGlhYyBQYWNlciJdIEltcGxhbnRlZENhcmRpYWNQYWNlcgogICAgICB3aXRoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiIENBREVuY291bnRlck1vZGVyYXRlT3JTZXZlcmVMVlNECiAgICAgICAgc3VjaCB0aGF0IEltcGxhbnRlZENhcmRpYWNQYWNlci5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgQ0FERW5jb3VudGVyTW9kZXJhdGVPclNldmVyZUxWU0QucGVyaW9kCiAgKQoKZGVmaW5lICJIYXMgRGlhZ25vc2lzIG9mIENhcmRpYWMgUGFjZXIgaW4gU2l0dSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJDYXJkaWFjIFBhY2VyIGluIFNpdHUiXSBDYXJkaWFjUGFjZXJEaWFnbm9zaXMKICAgICAgd2hlcmUgQ2FyZGlhY1BhY2VyRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiApCiAgKQoKZGVmaW5lICJIYXMgRGlhZ25vc2lzIG9mIENhcmRpYWMgUGFjZXIgaW4gU2l0dSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiOgogIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQ2FyZGlhYyBQYWNlciBpbiBTaXR1Il0gQ2FyZGlhY1BhY2VyRGlhZ25vc2lzCiAgICAgIHdoZXJlIENhcmRpYWNQYWNlckRpYWdub3Npcy5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiICkKICApCgpkZWZpbmUgIkhhcyBBbGxlcmd5IG9yIEludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5IEluZ3JlZGllbnQgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCAoIFtBbGxlcmd5SW50b2xlcmFuY2U6ICJCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50Il0KICAgICAgdW5pb24gW0FsbGVyZ3lJbnRvbGVyYW5jZTogIlN1YnN0YW5jZSB3aXRoIGJldGEgYWRyZW5lcmdpYyByZWNlcHRvciBhbnRhZ29uaXN0IG1lY2hhbmlzbSBvZiBhY3Rpb24gKHN1YnN0YW5jZSkiXSApIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlLm92ZXJsYXBzQWZ0ZXJEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiApCiAgKQoKZGVmaW5lICJIYXMgQmV0YSBCbG9ja2VyIFRoZXJhcHkgZm9yIExWU0QgT3JkZXJlZCI6CiAgZXhpc3RzICggW01lZGljYXRpb25SZXF1ZXN0OiBtZWRpY2F0aW9uIGluICJCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCJdIEJldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQKICAgICAgd2hlcmUgQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5hdXRob3JlZER1cmluZ0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIEJldGEgQmxvY2tlciBUaGVyYXB5IE9yZGVyZWQiOgogIGV4aXN0cyAoIFtNZWRpY2F0aW9uUmVxdWVzdDogbWVkaWNhdGlvbiBpbiAiQmV0YSBCbG9ja2VyIFRoZXJhcHkiXSBCZXRhQmxvY2tlck9yZGVyZWQKICAgICAgd2hlcmUgQmV0YUJsb2NrZXJPcmRlcmVkLmF1dGhvcmVkRHVyaW5nRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgKQogICkKCmRlZmluZSAiSXMgQ3VycmVudGx5IFRha2luZyBCZXRhIEJsb2NrZXIgVGhlcmFweSI6CiAgZXhpc3RzICggW01lZGljYXRpb25SZXF1ZXN0OiBtZWRpY2F0aW9uIGluICJCZXRhIEJsb2NrZXIgVGhlcmFweSJdIEFjdGl2ZUJldGFCbG9ja2VyCiAgICAgIHdpdGggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiIENBREVuY291bnRlck1JCiAgICAgICAgc3VjaCB0aGF0IEZpcnN0KChjb2xsYXBzZShBY3RpdmVCZXRhQmxvY2tlci5kb3NhZ2VJbnN0cnVjdGlvbi50aW1pbmcucmVwZWF0LmJvdW5kcyBEb3NlVGltZQogICAgICAgICAgICAgIHJldHVybiBEb3NlVGltZS50b0ludGVydmFsKCkKICAgICAgICAgICkpIERydWdQZXJpb2QKICAgICAgICAgICAgc29ydCBieSBzdGFydCBvZiAkdGhpcwogICAgICAgICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIENBREVuY291bnRlck1JLnBlcmlvZAogICAgICB3aGVyZSBBY3RpdmVCZXRhQmxvY2tlci5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIGFuZCBBY3RpdmVCZXRhQmxvY2tlci5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICkKCmRlZmluZSAiSXMgQ3VycmVudGx5IFRha2luZyBCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCI6CiAgZXhpc3RzICggW01lZGljYXRpb25SZXF1ZXN0OiBtZWRpY2F0aW9uIGluICJCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCJdIEFjdGl2ZUJldGFCbG9ja2VyRm9yTFZTRAogICAgICB3aXRoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiIENBREVuY291bnRlck1vZGVyYXRlT3JTZXZlcmVMVlNECiAgICAgICAgc3VjaCB0aGF0IEZpcnN0KChjb2xsYXBzZShBY3RpdmVCZXRhQmxvY2tlckZvckxWU0QuZG9zYWdlSW5zdHJ1Y3Rpb24udGltaW5nLnJlcGVhdC5ib3VuZHMgRG9zZVRpbWUKICAgICAgICAgICAgICByZXR1cm4gRG9zZVRpbWUudG9JbnRlcnZhbCgpCiAgICAgICAgICApKSBEcnVnUGVyaW9kCiAgICAgICAgICAgIHNvcnQgYnkgc3RhcnQgb2YgJHRoaXMKICAgICAgICApIG92ZXJsYXBzIGFmdGVyIGRheSBvZiBDQURFbmNvdW50ZXJNb2RlcmF0ZU9yU2V2ZXJlTFZTRC5wZXJpb2QKICAgICAgd2hlcmUgQWN0aXZlQmV0YUJsb2NrZXJGb3JMVlNELnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgYW5kIEFjdGl2ZUJldGFCbG9ja2VyRm9yTFZTRC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICkKCmRlZmluZSAiT3V0cGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgKCBbRW5jb3VudGVyOiAiT2ZmaWNlIFZpc2l0Il0KICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJPdXRwYXRpZW50IENvbnN1bHRhdGlvbiJdCiAgICB1bmlvbiBbRW5jb3VudGVyOiAiQ2FyZSBTZXJ2aWNlcyBpbiBMb25nIFRlcm0gUmVzaWRlbnRpYWwgRmFjaWxpdHkiXQogICAgdW5pb24gW0VuY291bnRlcjogIkhvbWUgSGVhbHRoY2FyZSBTZXJ2aWNlcyJdCiAgICB1bmlvbiBbRW5jb3VudGVyOiAiTnVyc2luZyBGYWNpbGl0eSBWaXNpdCJdICkgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2hlcmUgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgUXVhbGlmeWluZ0VuY291bnRlci5zdGF0dXMgPSAnZmluaXNoZWQnCgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICggW0VuY291bnRlcjogIk9mZmljZSBWaXNpdCJdCiAgICB1bmlvbiBbRW5jb3VudGVyOiAiT3V0cGF0aWVudCBDb25zdWx0YXRpb24iXQogICAgdW5pb24gW0VuY291bnRlcjogIk51cnNpbmcgRmFjaWxpdHkgVmlzaXQiXQogICAgdW5pb24gW0VuY291bnRlcjogIkNhcmUgU2VydmljZXMgaW4gTG9uZyBUZXJtIFJlc2lkZW50aWFsIEZhY2lsaXR5Il0KICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJIb21lIEhlYWx0aGNhcmUgU2VydmljZXMiXQogICAgdW5pb24gW0VuY291bnRlcjogIlBhdGllbnQgUHJvdmlkZXIgSW50ZXJhY3Rpb24iXSApIFZhbGlkRW5jb3VudGVyCiAgICB3aGVyZSBWYWxpZEVuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgVmFsaWRFbmNvdW50ZXIuc3RhdHVzID0gJ2ZpbmlzaGVkJwoKZGVmaW5lICJDb3JvbmFyeSBBcnRlcnkgRGlzZWFzZSBFbmNvdW50ZXIiOgogICJPdXRwYXRpZW50IEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBWYWxpZFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkNvcm9uYXJ5IEFydGVyeSBEaXNlYXNlIE5vIE1JIl0KICAgICAgdW5pb24gW0NvbmRpdGlvbkVuY291bnRlckRpYWdub3NpczogIkNvcm9uYXJ5IEFydGVyeSBEaXNlYXNlIE5vIE1JIl0gKSBDb3JvbmFyeUFydGVyeURpc2Vhc2UKICAgICAgc3VjaCB0aGF0IENvcm9uYXJ5QXJ0ZXJ5RGlzZWFzZS5vdmVybGFwc0RheU9mRW5jb3VudGVyICggVmFsaWRRdWFsaWZ5aW5nRW5jb3VudGVyICkKCmRlZmluZSAiSGFzIEFycmh5dGhtaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOgogIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQXJyaHl0aG1pYSJdIEFycmh5dGhtaWFEaWFnbm9zaXMKICAgICAgd2hlcmUgQXJyaHl0aG1pYURpYWdub3Npcy5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIEFycmh5dGhtaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFycmh5dGhtaWEiXSBBcnJoeXRobWlhRGlhZ25vc2lzCiAgICAgIHdoZXJlIEFycmh5dGhtaWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiApCiAgKQoKZGVmaW5lICJIYXMgQXN0aG1hIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFzdGhtYSJdIEFzdGhtYURpYWdub3NpcwogICAgICB3aGVyZSBBc3RobWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiICkKICApCgpkZWZpbmUgIkhhcyBBc3RobWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFzdGhtYSJdIEFzdGhtYURpYWdub3NpcwogICAgICB3aGVyZSBBc3RobWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiApCiAgKQoKZGVmaW5lICJIYXMgQXRyaW92ZW50cmljdWxhciBCbG9jayB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIl0gQXRyaW92ZW50cmljdWxhckJsb2NrCiAgICAgIHdoZXJlIEF0cmlvdmVudHJpY3VsYXJCbG9jay5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIEF0cmlvdmVudHJpY3VsYXIgQmxvY2sgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkF0cmlvdmVudHJpY3VsYXIgQmxvY2siXSBBdHJpb3ZlbnRyaWN1bGFyQmxvY2tEaWFnbm9zaXMKICAgICAgd2hlcmUgQXRyaW92ZW50cmljdWxhckJsb2NrRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgKQogICkKCmRlZmluZSAiSGFzIEJyYWR5Y2FyZGlhIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkJyYWR5Y2FyZGlhIl0gQnJhZHljYXJkaWFEaWFnbm9zaXMKICAgICAgd2hlcmUgQnJhZHljYXJkaWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiICkKICApCgpkZWZpbmUgIkhhcyBCcmFkeWNhcmRpYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiOgogIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQnJhZHljYXJkaWEiXSBCcmFkeWNhcmRpYURpYWdub3NpcwogICAgICB3aGVyZSBCcmFkeWNhcmRpYURpYWdub3Npcy5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiICkKICApCgpkZWZpbmUgIkhhcyBEaWFnbm9zaXMgb2YgQWxsZXJneSBvciBJbnRvbGVyYW5jZSB0byBCZXRhIEJsb2NrZXIgVGhlcmFweSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFsbGVyZ3kgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiXQogICAgICB1bmlvbiBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5Il0gKSBCZXRhQmxvY2tlckFsbGVyZ3lPckludG9sZXJhbmNlRGlhZ25vc2lzCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneU9ySW50b2xlcmFuY2VEaWFnbm9zaXMub3ZlcmxhcHNBZnRlckRheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIERpYWdub3NpcyBvZiBBbGxlcmd5IG9yIEludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5IHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSI6CiAgZXhpc3RzICggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFsbGVyZ3kgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiXQogICAgICB1bmlvbiBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5Il0gKSBCZXRhQmxvY2tlckFsbGVyZ3lPckludG9sZXJhbmNlRGlhZ25vc2lzCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneU9ySW50b2xlcmFuY2VEaWFnbm9zaXMub3ZlcmxhcHNBZnRlckRheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiICkKICApCgpkZWZpbmUgIkhhcyBIeXBvdGVuc2lvbiB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJIeXBvdGVuc2lvbiJdIEh5cG90ZW5zaW9uRGlhZ25vc2lzCiAgICAgIHdoZXJlIEh5cG90ZW5zaW9uRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiApCiAgKQoKZGVmaW5lICJIYXMgSHlwb3RlbnNpb24gd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiSHlwb3RlbnNpb24iXQogICAgICB1bmlvbiBbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzOiAiSHlwb3RlbnNpb24iXSApIEh5cG90ZW5zaW9uRGlhZ25vc2lzCiAgICAgIHdoZXJlIEh5cG90ZW5zaW9uRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgKQogICkKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjZXB0aW9ucyAxIjoKICAiSGFzIEFycmh5dGhtaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIEFzdGhtYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIKICAgIG9yICJIYXMgQnJhZHljYXJkaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIEh5cG90ZW5zaW9uIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIgogICAgb3IgIkhhcyBDb25zZWN1dGl2ZSBIZWFydCBSYXRlcyBMZXNzIHRoYW4gNTAgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIEFsbGVyZ3kgb3IgSW50b2xlcmFuY2UgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkgSW5ncmVkaWVudCB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIKICAgIG9yICJIYXMgRGlhZ25vc2lzIG9mIEFsbGVyZ3kgb3IgSW50b2xlcmFuY2UgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIE1lZGljYWwgb3IgUGF0aWVudCBSZWFzb24gZm9yIE5vdCBPcmRlcmluZyBCZXRhIEJsb2NrZXIgZm9yIExWU0QiCiAgICBvciAiSGFzIEF0cmlvdmVudHJpY3VsYXIgQmxvY2sgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0Qgd2l0aG91dCBDYXJkaWFjIFBhY2VyIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNlcHRpb25zIDIiOgogICJIYXMgQXJyaHl0aG1pYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBvciAiSGFzIEFzdGhtYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBvciAiSGFzIEJyYWR5Y2FyZGlhIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIKICAgIG9yICJIYXMgSHlwb3RlbnNpb24gd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIgogICAgb3IgIkhhcyBDb25zZWN1dGl2ZSBIZWFydCBSYXRlcyBMZXNzIHRoYW4gNTAgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIgogICAgb3IgIkhhcyBBbGxlcmd5IG9yIEludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5IEluZ3JlZGllbnQgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIgogICAgb3IgIkhhcyBEaWFnbm9zaXMgb2YgQWxsZXJneSBvciBJbnRvbGVyYW5jZSB0byBCZXRhIEJsb2NrZXIgVGhlcmFweSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBvciAiSGFzIE1lZGljYWwgb3IgUGF0aWVudCBSZWFzb24gZm9yIE5vdCBPcmRlcmluZyBCZXRhIEJsb2NrZXIgVGhlcmFweSIKICAgIG9yICJIYXMgQXRyaW92ZW50cmljdWxhciBCbG9jayB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkgd2l0aG91dCBDYXJkaWFjIFBhY2VyIgoKZGVmaW5lICJIYXMgQWxsZXJneSBvciBJbnRvbGVyYW5jZSB0byBCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50IHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCAoIFtBbGxlcmd5SW50b2xlcmFuY2U6ICJCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50Il0KICAgICAgdW5pb24gW0FsbGVyZ3lJbnRvbGVyYW5jZTogIlN1YnN0YW5jZSB3aXRoIGJldGEgYWRyZW5lcmdpYyByZWNlcHRvciBhbnRhZ29uaXN0IG1lY2hhbmlzbSBvZiBhY3Rpb24gKHN1YnN0YW5jZSkiXSApIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlLm92ZXJsYXBzQWZ0ZXJEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiICkKICApCgpkZWZpbmUgIkhhcyBNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgT3JkZXJpbmcgQmV0YSBCbG9ja2VyIGZvciBMVlNEIjoKICBleGlzdHMgKCBbTWVkaWNhdGlvbk5vdFJlcXVlc3RlZDogbWVkaWNhdGlvbiBpbiAiQmV0YSBCbG9ja2VyIFRoZXJhcHkgZm9yIExWU0QiXSBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQKICAgICAgd2l0aCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiBMVlNEVmlzaXQKICAgICAgICBzdWNoIHRoYXQgTm9CZXRhQmxvY2tlckZvckxWU0RPcmRlcmVkLmF1dGhvcmVkT24gZHVyaW5nIGRheSBvZiBMVlNEVmlzaXQucGVyaW9kCiAgICAgIHdoZXJlIE5vQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIGFuZCBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICBhbmQgKCBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQucmVhc29uQ29kZSBpbiAiTWVkaWNhbCBSZWFzb24iCiAgICAgICAgICAgIG9yIE5vQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5yZWFzb25Db2RlIGluICJQYXRpZW50IFJlYXNvbiIKICAgICAgICApCiAgKQoKZGVmaW5lICJIYXMgTWVkaWNhbCBvciBQYXRpZW50IFJlYXNvbiBmb3IgTm90IE9yZGVyaW5nIEJldGEgQmxvY2tlciBUaGVyYXB5IjoKICBleGlzdHMgKCBbTWVkaWNhdGlvbk5vdFJlcXVlc3RlZDogbWVkaWNhdGlvbiBpbiAiQmV0YSBCbG9ja2VyIFRoZXJhcHkgZm9yIExWU0QiXSBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQKICAgICAgd2l0aCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgUHJpb3JNSVZpc2l0CiAgICAgICAgc3VjaCB0aGF0IE5vQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgUHJpb3JNSVZpc2l0LnBlcmlvZAogICAgICB3aGVyZSBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgTm9CZXRhQmxvY2tlckZvckxWU0RPcmRlcmVkLmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgICAgICAgYW5kICggTm9CZXRhQmxvY2tlckZvckxWU0RPcmRlcmVkLnJlYXNvbkNvZGUgaW4gIk1lZGljYWwgUmVhc29uIgogICAgICAgICAgICBvciBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQucmVhc29uQ29kZSBpbiAiUGF0aWVudCBSZWFzb24iCiAgICAgICAgKQogICkKCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoKICBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxOAogICAgYW5kIGV4aXN0cyAoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBFbmNvdW50ZXIxCiAgICAgICAgd2l0aCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgRW5jb3VudGVyMgogICAgICAgICAgc3VjaCB0aGF0IEVuY291bnRlcjIuaWQgIX4gRW5jb3VudGVyMS5pZAogICAgKQogICAgYW5kIGV4aXN0cyAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIgoKZGVmaW5lICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOgogICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIiIEVuY291bnRlcldpdGhDQURQcm94eQogICAgd2l0aCBBSEEuIk1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIEZpbmRpbmdzIiBMVlNERmluZGluZ3MKICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKExWU0RGaW5kaW5ncy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSwgTFZTREZpbmRpbmdzLmVmZmVjdGl2ZS50b0ludGVydmFsKCkpIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIEVuY291bnRlcldpdGhDQURQcm94eS5wZXJpb2QKCmRlZmluZSAiSGlzdG9yeSBvZiBDYXJkaWFjIFN1cmdlcnkgUHJpb3IgdG8gRW5jb3VudGVyIjoKICAiT3V0cGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgVmFsaWRRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoIFtQcm9jZWR1cmU6ICJDYXJkaWFjIFN1cmdlcnkiXSBDYXJkaWFjU3VyZ2VyeVByb2NlZHVyZQogICAgICBzdWNoIHRoYXQgQ2FyZGlhY1N1cmdlcnlQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIFZhbGlkUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICBhbmQgQ2FyZGlhY1N1cmdlcnlQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKCmRlZmluZSAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIjoKICAiQ29yb25hcnkgQXJ0ZXJ5IERpc2Vhc2UgRW5jb3VudGVyIgogICAgdW5pb24gIkhpc3Rvcnkgb2YgQ2FyZGlhYyBTdXJnZXJ5IFByaW9yIHRvIEVuY291bnRlciIKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gb3ZlcmxhcHNEYXlPZkVuY291bnRlcihEaWFnbm9zaXMgQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJucywgRW5jb3VudGVyTGlzdCBMaXN0PEVuY291bnRlcj4pOgogIEFueVRydWUoRW5jb3VudGVyTGlzdCBWaXNpdAogICAgICByZXR1cm4gRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIoVmlzaXQpCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBvdmVybGFwc0RheU9mRW5jb3VudGVyKERpYWdub3NpcyBDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zLCBUaGVFbmNvdW50ZXIgRW5jb3VudGVyKToKICBUaGVFbmNvdW50ZXIgVmlzaXQKICAgIHdoZXJlIERpYWdub3Npcy5pc1ZlcmlmaWVkICggKQogICAgcmV0dXJuIERpYWdub3Npcy5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIG92ZXJsYXBzIGRheSBvZiBWaXNpdC5wZXJpb2QKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gb3ZlcmxhcHNBZnRlckRheU9mRW5jb3VudGVyKEV2ZW50IENob2ljZTxBbGxlcmd5SW50b2xlcmFuY2UsIENvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM+LCBFbmNvdW50ZXJMaXN0IExpc3Q8RW5jb3VudGVyPik6CiAgQW55VHJ1ZShFbmNvdW50ZXJMaXN0IFZpc2l0CiAgICAgIHJldHVybgogICAgICBjYXNlCiAgICAgICAgd2hlbiBFdmVudCBpcyBBbGxlcmd5SW50b2xlcmFuY2UgdGhlbiBJbnRlcnZhbFtzdGFydCBvZiBFdmVudC5vbnNldC50b0ludGVydmFsKCksIEV2ZW50Lmxhc3RPY2N1cnJlbmNlXW92ZXJsYXBzIGFmdGVyIGRheSBvZiBWaXNpdC5wZXJpb2QKICAgICAgICAgIGFuZChFdmVudC5jbGluaWNhbFN0YXR1cyBpcyBudWxsCiAgICAgICAgICAgICAgb3IgRXZlbnQuY2xpbmljYWxTdGF0dXMgfiBGSElSQ29tbW9uLiJhbGxlcmd5LWFjdGl2ZSIKICAgICAgICAgICkKICAgICAgICAgIGFuZChFdmVudC52ZXJpZmljYXRpb25TdGF0dXMgaXMgbnVsbAogICAgICAgICAgICAgIG9yIEV2ZW50LnZlcmlmaWNhdGlvblN0YXR1cyB+IEZISVJDb21tb24uImFsbGVyZ3ktY29uZmlybWVkIgogICAgICAgICAgKQogICAgICAgIHdoZW4gRXZlbnQgaXMgQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJucyB0aGVuIEV2ZW50LmlzVmVyaWZpZWQoKQogICAgICAgICAgYW5kIEV2ZW50LnByZXZhbGVuY2VJbnRlcnZhbCgpIG92ZXJsYXBzIGFmdGVyIGRheSBvZiBWaXNpdC5wZXJpb2QgCiAgICAgICAgZWxzZSBmYWxzZSAKICAgICAgZW5kCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBhdXRob3JlZER1cmluZ0RheU9mRW5jb3VudGVyKE9yZGVyIENob2ljZTxNZWRpY2F0aW9uUmVxdWVzdCwgTWVkaWNhdGlvbk5vdFJlcXVlc3RlZD4sIEVuY291bnRlckxpc3QgTGlzdDxFbmNvdW50ZXI+KToKICBBbnlUcnVlKEVuY291bnRlckxpc3QgVmlzaXQKICAgICAgcmV0dXJuCiAgICAgIGNhc2UKICAgICAgICB3aGVuIE9yZGVyIGlzIE1lZGljYXRpb25SZXF1ZXN0IHRoZW4gT3JkZXIuYXV0aG9yZWRPbiBkdXJpbmcgZGF5IG9mIFZpc2l0LnBlcmlvZAogICAgICAgICAgYW5kIE9yZGVyLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgICBhbmQgT3JkZXIuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICAgIGFuZCBPcmRlci5kb05vdFBlcmZvcm0gaXMgbm90IHRydWUKICAgICAgICB3aGVuIE9yZGVyIGlzIE1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQgdGhlbiBPcmRlci5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgVmlzaXQucGVyaW9kCiAgICAgICAgICBhbmQgT3JkZXIuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0gCiAgICAgICAgZWxzZSBmYWxzZSAKICAgICAgZW5kCiAgKQ==",
"url" : "https://madie.cms.gov/Library-CMS145FHIRCADBBlockerTPMIorLVSD.cql"
}
]
}