CDC National Healthcare Safety Network (NHSN) Digital Quality Measures (dQM) Content Package IG
1.0.0 - Release 1 United States of America flag

CDC National Healthcare Safety Network (NHSN) Digital Quality Measures (dQM) Content Package IG - Downloaded Version 1.0.0 See the Directory of published versions

: Shared Resource Creation - TTL Representation

Page standards status: Trial-use Maturity Level: 1

Raw ttl | Download

@prefix fhir: <http://hl7.org/fhir/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

# - resource -------------------------------------------------------------------

 a fhir:Library ;
  fhir:nodeRole fhir:treeRoot ;
  fhir:id [ fhir:v "SharedResourceCreation"] ; # 
  fhir:text [
fhir:status [ fhir:v "extensions" ] ;
fhir:div "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n<div>\n    <table class=\"grid dict\">\n        \n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Id: </b></th>\n            <td style=\"padding-left: 4px;\">SharedResourceCreation</td>\n        </tr>\n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Version: </b></th>\n            <td style=\"padding-left: 4px;\">1.0.0</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Url: </b></th>\n            <td style=\"padding-left: 4px;\"><a href=\"Library-SharedResourceCreation.html\">SharedResourceCreation</a></td>\n        </tr>\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Status: </b></th>\n            <td style=\"padding-left: 4px;\">draft</td>\n        </tr>\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Type: </b></th>\n            <td style=\"padding-left: 4px;\">\n                \n                    \n                        \n                        <p style=\"margin-bottom: 5px;\">\n                            <b>system: </b> <span><a href=\"http://terminology.hl7.org/6.5.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a></span>\n                        </p>\n                        \n                        \n                        <p style=\"margin-bottom: 5px;\">\n                            <b>code: </b> <span>logic-library</span>\n                        </p>\n                        \n                        \n                    \n                \n                \n            </td>\n        </tr>\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Date: </b></th>\n            <td style=\"padding-left: 4px;\">2025-09-15 11:51:36-0400</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Publisher: </b></th>\n            <td style=\"padding-left: 4px;\">CDC National Healthcare Safety Network (NHSN)</td>\n        </tr>\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Jurisdiction: </b></th>\n            <td style=\"padding-left: 4px;\">US</td>\n        </tr>\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Related Artifacts: </b></th>\n            <td style=\"padding-left: 4px;\">\n                \n                \n                \n                <p><b>Dependencies</b></p>\n                <ul>\n                  \n                    <li><a href=\"http://fhir.org/guides/cqf/common/4.0.1/4.0.1/Library-FHIR-ModelInfo.html\">http://fhir.org/guides/cqf/common/Library/FHIR-ModelInfo|4.0.1</a></li>\n                  \n                    <li><code>http://www.cdc.gov/nhsn/fhirportal/dqm/ig/Library/FHIRHelpers|4.0.2</code></li>\n                  \n                </ul>\n                \n                \n                \n                \n                \n            </td>\n        </tr>\n        \n\n        \n\n        \n\n        \n        \n        <tr>\n          <td colspan=\"2\">\n            <table>\n              <tr><th><a id=\"cql-content\"><b>Content: </b></a> text/cql</th></tr>\n              <tr><td><pre><code class=\"language-cql\">library SharedResourceCreation version '0.1.010'#xD;\n#xD;\ninclude FHIRHelpers version '4.0.2'#xD;\n#xD;\nusing FHIR version '4.0.1'#xD;\n#xD;\ndefine function \"GetIdExtensions\"(domainResource DomainResource):#xD;\n  domainResource.extension E#xD;\n  where E.url.value = 'http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/link-original-resource-id-extension'#xD;\n  return E#xD;\n#xD;\ndefine function \"GetPatientExtensions\"(domainResource DomainResource):#xD;\n  domainResource.extension E#xD;\n  where E.url.value = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race'#xD;\n    or E.url.value = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity'#xD;\n    or E.url.value = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex'#xD;\n    or E.url.value = 'http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/link-original-resource-id-extension'#xD;\n  return E#xD;\n#xD;\ndefine function \"MetaElement\"(resource Resource, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  resource r#xD;\n  return FHIR.Meta{#xD;\n    extension: r.meta.extension,#xD;\n    versionId: r.meta.versionId,#xD;\n    lastUpdated: r.meta.lastUpdated,#xD;\n    profile: profileURLs,#xD;\n    security: r.meta.security,#xD;\n    tag: r.meta.tag#xD;\n  }#xD;\n#xD;\ndefine function ConditionStage(stage List&lt;FHIR.Condition.Stage&gt;):#xD;\n  stage s#xD;\n  return FHIR.Condition.Stage{#xD;\n    summary: s.summary,#xD;\n    assessment: s.assessment,#xD;\n    type: s.type#xD;\n  }#xD;\n#xD;\ndefine function ConditionEvidence(evidence List&lt;FHIR.Condition.Evidence&gt;):#xD;\n  evidence e#xD;\n  return FHIR.Condition.Evidence{#xD;\n    code: e.code,#xD;\n    detail: e.detail#xD;\n  }#xD;\n#xD;\ndefine function ConditionResource(condition Condition, profileURLs List&lt;FHIR.canonical&gt;, acceptedCategories List&lt;System.Code&gt;):#xD;\n  condition c#xD;\n  return Condition{#xD;\n    id: FHIR.id {value: 'LCR-' + c.id},#xD;\n    meta: MetaElement(c, profileURLs),#xD;\n    extension: c.extension,#xD;\n    clinicalStatus: c.clinicalStatus,#xD;\n    verificationStatus: c.verificationStatus,#xD;\n    category: c.category,#xD;\n    severity: c.severity,#xD;\n    code: c.code,#xD;\n    bodySite: c.bodySite,#xD;\n    subject: c.subject,#xD;\n    encounter: c.encounter,#xD;\n    onset: c.onset,#xD;\n    abatement: c.abatement,#xD;\n    recordedDate: c.recordedDate,#xD;\n    stage: ConditionStage(c.stage),#xD;\n    evidence: ConditionEvidence(c.evidence),#xD;\n    note: c.note#xD;\n  }#xD;\n#xD;\ndefine function CoverageClass(class List&lt;FHIR.Coverage.Class&gt;):#xD;\n  class c#xD;\n  return FHIR.Coverage.Class{#xD;\n    value: c.value,#xD;\n    name: c.name#xD;\n  }#xD;\n#xD;\ndefine function CoverageResource(coverage Coverage, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  coverage c#xD;\n  return Coverage{#xD;\n    id: FHIR.id{value: 'LCR-' + c.id},#xD;\n    meta: MetaElement(c, profileURLs),#xD;\n    extension: c.extension,#xD;\n    status: c.status,#xD;\n    type: c.type,#xD;\n    policyHolder: c.policyHolder,#xD;\n    subscriber: c.subscriber,#xD;\n    subscriberId: c.subscriberId,#xD;\n    beneficiary: c.beneficiary,#xD;\n    dependent: c.dependent,#xD;\n    relationship: c.relationship,#xD;\n    period: c.period,#xD;\n    payor: c.payor,#xD;\n    class: CoverageClass(c.class),#xD;\n    order: c.order,#xD;\n    network: c.network,#xD;\n    subrogation: c.subrogation,#xD;\n    contract: c.contract#xD;\n  }#xD;\n#xD;\ndefine function DiagnosticReportCoding(coding List&lt;Coding&gt;):#xD;\n  coding c#xD;\n  return Coding{#xD;\n    system: c.system,#xD;\n    version: c.version,#xD;\n    code: c.code,#xD;\n    display: c.display,#xD;\n    userSelected: c.userSelected#xD;\n  }#xD;\n#xD;\ndefine function DiagnosticReportCategory(category List&lt;CodeableConcept&gt;):#xD;\n  category c#xD;\n  return CodeableConcept{#xD;\n    coding: DiagnosticReportCoding(c.coding)#xD;\n  }#xD;\n#xD;\ndefine function DiagnosticReportLabResource(diagnosticReport DiagnosticReport, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  diagnosticReport d#xD;\n  return DiagnosticReport{#xD;\n    id: FHIR.id{value: 'LCR-' + d.id},#xD;\n    meta: MetaElement(d, profileURLs),#xD;\n    extension: d.extension,#xD;\n    basedOn: d.basedOn,#xD;\n    status: d.status,#xD;\n    category: DiagnosticReportCategory(d.category),#xD;\n    code: d.code,#xD;\n    subject: d.subject,#xD;\n    encounter: d.encounter,#xD;\n    effective: d.effective,#xD;\n    issued: d.issued,#xD;\n    performer: d.performer,#xD;\n    resultsInterpreter: d.resultsInterpreter,#xD;\n    specimen: d.specimen,#xD;\n    result: d.result,#xD;\n    conclusion: d.conclusion,#xD;\n    conclusionCode: d.conclusionCode#xD;\n  }#xD;\n#xD;\ndefine function EncounterIdentifier(identifier List&lt;FHIR.Identifier&gt;):#xD;\n  identifier i#xD;\n  return FHIR.Identifier{#xD;\n    use: i.use,#xD;\n    type: i.type,#xD;\n    system: i.system,#xD;\n    value: i.value,#xD;\n    period: i.period#xD;\n  }#xD;\n#xD;\ndefine function EncounterStatusHistory(statusHistory List&lt;FHIR.Encounter.StatusHistory&gt;):#xD;\n  statusHistory sH#xD;\n  return FHIR.Encounter.StatusHistory{#xD;\n    status: sH.status,#xD;\n    period: sH.period#xD;\n  }#xD;\n#xD;\ndefine function EncounterClassHistory(classHistory List&lt;FHIR.Encounter.ClassHistory&gt;):#xD;\n  classHistory cH#xD;\n  return FHIR.Encounter.ClassHistory{#xD;\n    class: cH.class,#xD;\n    period: cH.period#xD;\n  }#xD;\n#xD;\n/*No longer needed but saving for potential future use#xD;\ndefine function EncounterParticipant(participant List&lt;FHIR.Encounter.Participant&gt;):#xD;\n  participant p#xD;\n  return FHIR.Encounter.Participant{#xD;\n    type: p.type,#xD;\n    period: p.period,#xD;\n    individual: p.individual#xD;\n  }*/#xD;\n#xD;\ndefine function EncounterDiagnosis(diagnosis List&lt;FHIR.Encounter.Diagnosis&gt;):#xD;\n  diagnosis d#xD;\n  return FHIR.Encounter.Diagnosis{#xD;\n    condition: d.condition,#xD;\n    use: d.use,#xD;\n    rank: d.rank#xD;\n  }#xD;\n#xD;\ndefine function EncounterHospitalization(hospitalization FHIR.Encounter.Hospitalization):#xD;\n  hospitalization h#xD;\n  return FHIR.Encounter.Hospitalization{#xD;\n    preAdmissionIdentifier: h.preAdmissionIdentifier,#xD;\n    origin: h.origin,#xD;\n    admitSource: h.admitSource,#xD;\n    reAdmission: h.reAdmission,#xD;\n    dietPreference: h.dietPreference,#xD;\n    specialCourtesy: h.specialCourtesy,#xD;\n    specialArrangement: h.specialArrangement,#xD;\n    destination: h.destination,#xD;\n    dischargeDisposition: h.dischargeDisposition#xD;\n  }#xD;\n#xD;\ndefine function EncounterLocation(location List&lt;FHIR.Encounter.Location&gt;):#xD;\n  location l#xD;\n  return FHIR.Encounter.Location{#xD;\n    location: l.location,#xD;\n    status: l.status,#xD;\n    physicalType: l.physicalType,#xD;\n    period: l.period#xD;\n  }#xD;\n#xD;\ndefine function EncounterResource(encounter Encounter, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  encounter e#xD;\n  return Encounter{#xD;\n    id: FHIR.id{value: 'LCR-' + e.id},#xD;\n    meta: MetaElement(e, profileURLs),#xD;\n    extension: e.extension,#xD;\n    identifier: EncounterIdentifier(e.identifier),#xD;\n    status: e.status,#xD;\n    statusHistory: EncounterStatusHistory(e.statusHistory),#xD;\n    class: e.class,#xD;\n    classHistory: EncounterClassHistory(e.classHistory),#xD;\n    type: e.type,#xD;\n    serviceType: e.serviceType,#xD;\n    priority: e.priority,#xD;\n    subject: e.subject,#xD;\n    period: e.period,#xD;\n    length: e.length,#xD;\n    reasonCode: e.reasonCode,#xD;\n    reasonReference: e.reasonReference,#xD;\n    diagnosis: EncounterDiagnosis(e.diagnosis),#xD;\n    account: e.account,#xD;\n    hospitalization: EncounterHospitalization(e.hospitalization),#xD;\n    location: EncounterLocation(e.location),#xD;\n    partOf: e.partOf#xD;\n  }#xD;\n#xD;\ndefine function ObservationLabCoding(coding List&lt;Coding&gt;):#xD;\n  coding c#xD;\n  return Coding{#xD;\n    id: c.id,#xD;\n    extension: c.extension,#xD;\n    system: c.system,#xD;\n    version: c.version,#xD;\n    code: c.code,#xD;\n    display: c.display,#xD;\n    userSelected: c.userSelected#xD;\n  }#xD;\n#xD;\ndefine function ObservationLabCategory(category List&lt;CodeableConcept&gt;):#xD;\n  category c#xD;\n  return CodeableConcept{#xD;\n    coding: ObservationLabCoding(c.coding),#xD;\n    text: c.text#xD;\n  }#xD;\n#xD;\ndefine function ObservationReferenceRange(referenceRange List&lt;FHIR.Observation.ReferenceRange&gt;):#xD;\n  referenceRange rR#xD;\n  return FHIR.Observation.ReferenceRange{#xD;\n    low: rR.low,#xD;\n    high: rR.high,#xD;\n    type: rR.type,#xD;\n    appliesTo: rR.appliesTo,#xD;\n    age: rR.age,#xD;\n    text: rR.text#xD;\n  }#xD;\n#xD;\ndefine function ObservationComponent(component List&lt;FHIR.Observation.Component&gt;):#xD;\n  component c#xD;\n  return FHIR.Observation.Component{#xD;\n    code: c.code,#xD;\n    value: c.value,#xD;\n    dataAbsentReason: c.dataAbsentReason,#xD;\n    interpretation: c.interpretation,#xD;\n    referenceRange: c.referenceRange#xD;\n  }#xD;\n#xD;\ndefine function ObservationLabResource(observation Observation, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  observation o#xD;\n  return Observation{#xD;\n    id: FHIR.id {value: 'LCR-' + o.id},#xD;\n    meta: MetaElement(o, profileURLs),#xD;\n    extension: o.extension,#xD;\n    basedOn: o.basedOn,#xD;\n    partOf: o.partOf,#xD;\n    status: o.status,#xD;\n    category: ObservationLabCategory(o.category),#xD;\n    code: o.code,#xD;\n    subject: o.subject,#xD;\n    focus: o.focus,#xD;\n    encounter: o.encounter,#xD;\n    effective: o.effective,#xD;\n    issued: o.issued,#xD;\n    performer: o.performer,#xD;\n    value: o.value,#xD;\n    dataAbsentReason: o.dataAbsentReason,#xD;\n    interpretation: o.interpretation,#xD;\n    note: o.note,#xD;\n    bodySite: o.bodySite,#xD;\n    method: o.method,#xD;\n    specimen: o.specimen,#xD;\n    device: o.device,#xD;\n    referenceRange: ObservationReferenceRange(o.referenceRange),#xD;\n    hasMember: o.hasMember,#xD;\n    derivedFrom: o.derivedFrom,#xD;\n    component: ObservationComponent(o.component)#xD;\n  }#xD;\n#xD;\ndefine function LocationAddress(address FHIR.Address):#xD;\n  address a#xD;\n  return FHIR.Address{#xD;\n    use: a.use,#xD;\n    type: a.type,#xD;\n    text: a.text,#xD;\n    line: a.line,#xD;\n    city: a.city,#xD;\n    district: a.district,#xD;\n    state: a.state,#xD;\n    postalCode: a.postalCode,#xD;\n    country: a.country,#xD;\n    period: a.period#xD;\n  }#xD;\n#xD;\ndefine function LocationPosition(position FHIR.Location.Position):#xD;\n  position p#xD;\n  return FHIR.Location.Position{#xD;\n    longitude: p.longitude,#xD;\n    latitude: p.latitude,#xD;\n    altitude: p.altitude#xD;\n  }#xD;\n#xD;\ndefine function LocationHoursOfOperation(hoursOfOperation List&lt;FHIR.Location.HoursOfOperation&gt;):#xD;\n  hoursOfOperation hOO#xD;\n  return FHIR.Location.HoursOfOperation{#xD;\n    daysOfWeek: hOO.daysOfWeek,#xD;\n    allDay: hOO.allDay,#xD;\n    openingTime: hOO.openingTime,#xD;\n    closingTime: hOO.closingTime#xD;\n  }#xD;\n#xD;\ndefine function LocationResource(location Location, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  location l#xD;\n  return Location{#xD;\n    id: FHIR.id {value: 'LCR-' + l.id},#xD;\n    meta: MetaElement(l, profileURLs),#xD;\n    extension: l.extension,#xD;\n    status: l.status,#xD;\n    operationalStatus: l.operationalStatus,#xD;\n    name: l.name,#xD;\n    alias: l.alias,#xD;\n    description: l.description,#xD;\n    mode: l.mode,#xD;\n    type: l.type,#xD;\n    telecom: l.telecom,#xD;\n    address: LocationAddress(l.address),#xD;\n    physicalType: l.physicalType,#xD;\n    position: LocationPosition(l.position),#xD;\n    managingOrganization: l.managingOrganization,#xD;\n    partOf: l.partOf,#xD;\n    hoursOfOperation: LocationHoursOfOperation(l.hoursOfOperation),#xD;\n    availabilityExceptions: l.availabilityExceptions,#xD;\n    endpoint: l.endpoint#xD;\n  }#xD;\n#xD;\ndefine function MedicationIngredient(ingredient List&lt;FHIR.Medication.Ingredient&gt;):#xD;\n  ingredient i#xD;\n  return FHIR.Medication.Ingredient{#xD;\n    item: i.item,#xD;\n    strength: i.strength#xD;\n  }#xD;\n#xD;\ndefine function MedicationBatch(batch FHIR.Medication.Batch):#xD;\n  batch b#xD;\n  return FHIR.Medication.Batch{#xD;\n    lotNumber: b.lotNumber,#xD;\n    expirationDate: b.expirationDate#xD;\n  }#xD;\n#xD;\ndefine function MedicationResource(medication Medication, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  medication m#xD;\n  return Medication{#xD;\n    id: FHIR.id {value: 'LCR-' + m.id},#xD;\n    meta: MetaElement(m, profileURLs),#xD;\n    extension: m.extension,#xD;\n    code: m.code,#xD;\n    status: m.status,#xD;\n    manufacturer: m.manufacturer,#xD;\n    form: m.form,#xD;\n    amount: m.amount,#xD;\n    ingredient: MedicationIngredient(m.ingredient),#xD;\n    batch: MedicationBatch(m.batch)#xD;\n  }#xD;\n#xD;\ndefine function MedicationAdministrationPerformer(performer List&lt;FHIR.MedicationAdministration.Performer&gt;):#xD;\n  performer p#xD;\n  return FHIR.MedicationAdministration.Performer{#xD;\n    function: p.function,#xD;\n    actor: p.actor#xD;\n  }#xD;\n#xD;\ndefine function MedicationAdministrationDosage(dosage FHIR.MedicationAdministration.Dosage):#xD;\n  dosage d#xD;\n  return FHIR.MedicationAdministration.Dosage{#xD;\n    text: d.text,#xD;\n    site: d.site,#xD;\n    route: d.route,#xD;\n    method: d.method,#xD;\n    dose: d.dose,#xD;\n    rate: d.rate#xD;\n  }#xD;\n#xD;\ndefine function MedicationAdministrationResource(medicationAdministration MedicationAdministration, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  medicationAdministration m#xD;\n  return MedicationAdministration{#xD;\n    id: FHIR.id {value: 'LCR-' + m.id},#xD;\n    meta: MetaElement(m, profileURLs),#xD;\n    extension: m.extension,#xD;\n    instantiates: m.instantiates,#xD;\n    partOf: m.partOf,#xD;\n    status: m.status,#xD;\n    statusReason: m.statusReason,#xD;\n    category: m.category,#xD;\n    medication: m.medication,#xD;\n    subject: m.subject,#xD;\n    context: m.context,#xD;\n    supportingInformation: m.supportingInformation,#xD;\n    effective: m.effective,#xD;\n    performer: MedicationAdministrationPerformer(m.performer),#xD;\n    reasonCode: m.reasonCode,#xD;\n    reasonReference: m.reasonReference,#xD;\n    request: m.request,#xD;\n    device: m.device,#xD;\n    note: m.note,#xD;\n    dosage: MedicationAdministrationDosage(m.dosage),#xD;\n    eventHistory: m.eventHistory#xD;\n  }#xD;\n#xD;\ndefine function MedicationRequestDoseAndRate(doseAndRate List&lt;FHIR.Dosage.DoseAndRate&gt;):#xD;\n  doseAndRate dR#xD;\n  return FHIR.Dosage.DoseAndRate{#xD;\n    type: dR.type,#xD;\n    dose: dR.dose,#xD;\n    rate: dR.rate#xD;\n  }#xD;\n#xD;\ndefine function MedicationRequestDosageInstruction(dosageInstruction List&lt;FHIR.Dosage&gt;):#xD;\n  dosageInstruction dI#xD;\n  return FHIR.Dosage{#xD;\n    text: dI.text,#xD;\n    patientInstruction: dI.patientInstruction,#xD;\n    timing: dI.timing,#xD;\n    asNeeded: dI.asNeeded,#xD;\n    site: dI.site,#xD;\n    route: dI.route,#xD;\n    method: dI.method,#xD;\n    doseAndRate: MedicationRequestDoseAndRate(dI.doseAndRate)#xD;\n  }#xD;\n#xD;\ndefine function MedicationRequestResource(medicationRequest MedicationRequest, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  medicationRequest m#xD;\n  return MedicationRequest{#xD;\n    id: FHIR.id {value: 'LCR-' + m.id},#xD;\n    meta: MetaElement(medicationRequest, profileURLs),#xD;\n    extension: m.extension,#xD;\n    status: m.status,#xD;\n    statusReason: m.statusReason,#xD;\n    intent: m.intent,#xD;\n    category: m.category,#xD;\n    priority: m.priority,#xD;\n    doNotPerform: m.doNotPerform,#xD;\n    reported: m.reported,#xD;\n    medication: m.medication,#xD;\n    subject: m.subject,#xD;\n    encounter: m.encounter,#xD;\n    authoredOn: m.authoredOn,#xD;\n    requester: m.requester,#xD;\n    recorder: m.recorder,#xD;\n    reasonCode: m.reasonCode,#xD;\n    reasonReference: m.reasonReference,#xD;\n    instantiatesCanonical: m.instantiatesCanonical,#xD;\n    instantiatesUri: m.instantiatesUri,#xD;\n    courseOfTherapyType: m.courseOfTherapyType,#xD;\n    dosageInstruction: MedicationRequestDosageInstruction(m.dosageInstruction)#xD;\n  }#xD;\n#xD;\n/* No longer needed but saving in case it's useful later#xD;\ndefine function PatientIdentifier(identifier List&lt;FHIR.Identifier&gt;):#xD;\n  identifier i#xD;\n  return FHIR.Identifier{#xD;\n    id: i.id,#xD;\n    extension: i.extension,#xD;\n    use: i.use,#xD;\n    type: i.type,#xD;\n    system: i.system,#xD;\n    value: i.value,#xD;\n    period: i.period,#xD;\n    assigner: i.assigner#xD;\n  }*/#xD;\n#xD;\ndefine function PatientName(name List&lt;FHIR.HumanName&gt;):#xD;\n  name n#xD;\n  return FHIR.HumanName{#xD;\n    id: n.id,#xD;\n    extension: n.extension,#xD;\n    use: n.use,#xD;\n    text: n.text,#xD;\n    family: n.family,#xD;\n    given: n.given,#xD;\n    prefix: n.prefix,#xD;\n    suffix: n.suffix,#xD;\n    period: n.period#xD;\n  }#xD;\n#xD;\ndefine function PatientTelecom(telecom List&lt;FHIR.ContactPoint&gt;):#xD;\n  telecom t#xD;\n  return FHIR.ContactPoint{#xD;\n    system: t.system,#xD;\n    value: t.value,#xD;\n    use: t.use,#xD;\n    rank: t.rank,#xD;\n    period: t.period#xD;\n  }#xD;\n#xD;\ndefine function PatientAddress(address List&lt;FHIR.Address&gt;):#xD;\n  address a#xD;\n  return FHIR.Address{#xD;\n    id: a.id,#xD;\n    extension: a.extension,#xD;\n    use: a.use,#xD;\n    type: a.type,#xD;\n    text: a.text,#xD;\n    line: a.line,#xD;\n    city: a.city,#xD;\n    district: a.district,#xD;\n    state: a.state,#xD;\n    postalCode: a.postalCode,#xD;\n    country: a.country,#xD;\n    period: a.period#xD;\n  }#xD;\n#xD;\ndefine function PatientContact(contact List&lt;FHIR.Patient.Contact&gt;):#xD;\n  contact c#xD;\n  return FHIR.Patient.Contact{#xD;\n    id: c.id,#xD;\n    extension: c.extension,#xD;\n    relationship: c.relationship,#xD;\n    name: c.name,#xD;\n    telecom: c.telecom,#xD;\n    address: c.address,#xD;\n    gender: c.gender,#xD;\n    organization: c.organization,#xD;\n    period: c.period#xD;\n  }#xD;\n#xD;\ndefine function PatientCommunication(communication List&lt;FHIR.Patient.Communication&gt;):#xD;\n  communication c#xD;\n  return FHIR.Patient.Communication{#xD;\n    id: c.id,#xD;\n    extension: c.extension,#xD;\n    language: c.language,#xD;\n    preferred: c.preferred#xD;\n  }#xD;\n#xD;\ndefine function PatientLink(link List&lt;FHIR.Patient.Link&gt;):#xD;\n  link l#xD;\n  return FHIR.Patient.Link{#xD;\n    id: l.id,#xD;\n    extension: l.extension,#xD;\n    modifierExtension: l.modifierExtension,#xD;\n    other: l.other,#xD;\n    type: l.type#xD;\n  }#xD;\n#xD;\ndefine function PatientResource(patient Patient, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  patient p#xD;\n  return Patient{#xD;\n    id: FHIR.id{value: 'LCR-' + p.id},#xD;\n    meta: MetaElement(p, profileURLs),#xD;\n    extension: GetPatientExtensions(p) union GetIdExtensions(p),#xD;\n    identifier: p.identifier,#xD;\n    active: p.active,#xD;\n    name: PatientName(p.name),#xD;\n    telecom: PatientTelecom(p.telecom),#xD;\n    gender: p.gender,#xD;\n    birthDate: p.birthDate,#xD;\n    deceased: p.deceased,#xD;\n    address: PatientAddress(p.address),#xD;\n    maritalStatus: p.maritalStatus,#xD;\n    multipleBirth: p.multipleBirth,#xD;\n    photo: p.photo,#xD;\n    contact: PatientContact(p.contact),#xD;\n    communication: PatientCommunication(p.communication),#xD;\n    generalPractitioner: p.generalPractitioner,#xD;\n    managingOrganization: p.managingOrganization,#xD;\n    link: PatientLink(p.link)#xD;\n  }#xD;\n#xD;\ndefine function ProcedurePerformer(performer List&lt;FHIR.Procedure.Performer&gt;):#xD;\n  performer p#xD;\n  return FHIR.Procedure.Performer{#xD;\n    function: p.function,#xD;\n    actor: p.actor,#xD;\n    onBehalfOf: p.onBehalfOf#xD;\n  }#xD;\n#xD;\ndefine function ProcedureFocalDevice(device List&lt;FHIR.Procedure.FocalDevice&gt;):#xD;\n  device d#xD;\n  return FHIR.Procedure.FocalDevice{#xD;\n    action: d.action,#xD;\n    manipulated: d.manipulated#xD;\n  }#xD;\n#xD;\ndefine function ProcedureResource(procedure Procedure, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  procedure p#xD;\n  return Procedure{#xD;\n    id: FHIR.id {value: 'LCR-' + p.id},#xD;\n    meta: MetaElement(p, profileURLs),#xD;\n    extension: p.extension,#xD;\n    instantiatesCanonical: p.instantiatesCanonical,#xD;\n    instantiatesUri: p.instantiatesUri,#xD;\n    basedOn: p.basedOn,#xD;\n    partOf: p.partOf,#xD;\n    status: p.status,#xD;\n    statusReason: p.statusReason,#xD;\n    category: p.category,#xD;\n    code: p.code,#xD;\n    subject: p.subject,#xD;\n    encounter: p.encounter,#xD;\n    performed: p.performed,#xD;\n    recorder: p.recorder,#xD;\n    asserter: p.asserter,#xD;\n    performer: ProcedurePerformer(p.performer),#xD;\n    location: p.location,#xD;\n    reasonCode: p.reasonCode,#xD;\n    reasonReference: p.reasonReference,#xD;\n    bodySite: p.bodySite,#xD;\n    outcome: p.outcome,#xD;\n    report: p.report,#xD;\n    complication: p.complication,#xD;\n    complicationDetail: p.complicationDetail,#xD;\n    followUp: p.followUp,#xD;\n    note: p.note,#xD;\n    focalDevice: ProcedureFocalDevice(p.focalDevice),#xD;\n    usedReference: p.usedReference,#xD;\n    usedCode: p.usedCode#xD;\n  }#xD;\n#xD;\ndefine function ServiceRequestResource(serviceRequest ServiceRequest, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  serviceRequest sR#xD;\n  return ServiceRequest{#xD;\n    id: FHIR.id {value: 'LCR-' + sR.id},#xD;\n    meta: MetaElement(sR, profileURLs),#xD;\n    extension: sR.extension,#xD;\n    instantiatesCanonical: sR.instantiatesCanonical,#xD;\n    instantiatesUri: sR.instantiatesUri,#xD;\n    basedOn: sR.basedOn,#xD;\n    replaces: sR.replaces,#xD;\n    requisition: sR.requisition,#xD;\n    status: sR.status,#xD;\n    intent: sR.intent,#xD;\n    category: sR.category,#xD;\n    priority: sR.priority,#xD;\n    doNotPerform: sR.doNotPerform,#xD;\n    code: sR.code,#xD;\n    orderDetail: sR.orderDetail,#xD;\n    quantity: sR.quantity,#xD;\n    subject: sR.subject,#xD;\n    encounter: sR.encounter,#xD;\n    occurrence: sR.occurrence,#xD;\n    asNeeded: sR.asNeeded,#xD;\n    authoredOn: sR.authoredOn,#xD;\n    requester: sR.requester,#xD;\n    performerType: sR.performerType,#xD;\n    performer: sR.performer,#xD;\n    locationCode: sR.locationCode,#xD;\n    locationReference: sR.locationReference,#xD;\n    reasonCode: sR.reasonCode,#xD;\n    reasonReference: sR.reasonReference,#xD;\n    insurance: sR.insurance,#xD;\n    supportingInfo: sR.supportingInfo,#xD;\n    specimen: sR.specimen,#xD;\n    bodySite: sR.bodySite,#xD;\n    note: sR.note,#xD;\n    patientInstruction: sR.patientInstruction,#xD;\n    relevantHistory: sR.relevantHistory#xD;\n  }#xD;\n#xD;\ndefine function SpecimenCollection(collection FHIR.Specimen.Collection):#xD;\n  collection c#xD;\n  return FHIR.Specimen.Collection{#xD;\n    collector: c.collector,#xD;\n    collected: c.collected,#xD;\n    \"duration\": c.\"duration\",#xD;\n    quantity: c.quantity,#xD;\n    method: c.method,#xD;\n    bodySite: c.bodySite,#xD;\n    fastingStatus: c.fastingStatus#xD;\n  }#xD;\n#xD;\ndefine function SpecimenProcessing(processing List&lt;FHIR.Specimen.Processing&gt;):#xD;\n  processing p#xD;\n  return FHIR.Specimen.Processing{#xD;\n    description: p.description,#xD;\n    procedure: p.procedure,#xD;\n    additive: p.additive,#xD;\n    time: p.time#xD;\n  }#xD;\n#xD;\ndefine function SpecimenContainer(container List&lt;FHIR.Specimen.Container&gt;):#xD;\n  container c#xD;\n  return FHIR.Specimen.Container{#xD;\n    description: c.description,#xD;\n    type: c.type,#xD;\n    capacity: c.capacity,#xD;\n    specimenQuantity: c.specimenQuantity,#xD;\n    additive: c.additive#xD;\n  }#xD;\n#xD;\ndefine function SpecimenResource(specimen Specimen, profileURLs List&lt;FHIR.canonical&gt;):#xD;\n  specimen s#xD;\n  return Specimen{#xD;\n    id: FHIR.id {value: 'LCR-' + s.id},#xD;\n    meta: MetaElement(s, profileURLs),#xD;\n    extension: s.extension,#xD;\n    identifier: s.identifier,#xD;\n    accessionIdentifier: s.accessionIdentifier,#xD;\n    status: s.status,#xD;\n    type: s.type,#xD;\n    subject: s.subject,#xD;\n    receivedTime: s.receivedTime,#xD;\n    parent: s.parent,#xD;\n    request: s.request,#xD;\n    collection: SpecimenCollection(s.collection),#xD;\n    processing: SpecimenProcessing(s.processing),#xD;\n    container: SpecimenContainer(s.container),#xD;\n    condition: s.condition,#xD;\n    note: s.note#xD;\n  }#xD;\n#xD;\ndefine function \"OperationOutcomeResource\"(errorId String, resourceId FHIR.id, message String):#xD;\n  OperationOutcome{#xD;\n      id: FHIR.id{value: errorId},#xD;\n      issue: {#xD;\n          FHIR.OperationOutcome.Issue{#xD;\n          severity: FHIR.IssueSeverity{value: 'error'},#xD;\n          code: FHIR.IssueType{value: 'exception'},#xD;\n          details: #xD;\n              FHIR.CodeableConcept{#xD;\n                  coding: {#xD;\n                      Coding{#xD;\n                      system: uri{value: 'https://lantanagroup.com/validation-error'},#xD;\n                      code: code{value: 'Error'},#xD;\n                      display: string{value: 'Resource ' + resourceId + ' failed validation: ' + message}#xD;\n                      }#xD;\n                  }#xD;\n              }#xD;\n          }#xD;\n      }#xD;\n  }</code></pre></td></tr>\n            </table>\n          </td>\n        </tr>\n        \n        \n        \n    </table>\n</div>\n</div>"^^rdf:XMLLiteral
  ] ; # 
  fhir:contained ( [
a fhir:Parameters ;
fhir:id [ fhir:v "options" ] ;
    ( fhir:parameter [
fhir:name [ fhir:v "translatorVersion" ] ;
fhir:value [
a fhir:string ;
fhir:v "3.25.0"       ]     ] [
fhir:name [ fhir:v "option" ] ;
fhir:value [
a fhir:string ;
fhir:v "EnableDateRangeOptimization"       ]     ] [
fhir:name [ fhir:v "option" ] ;
fhir:value [
a fhir:string ;
fhir:v "EnableAnnotations"       ]     ] [
fhir:name [ fhir:v "option" ] ;
fhir:value [
a fhir:string ;
fhir:v "EnableLocators"       ]     ] [
fhir:name [ fhir:v "option" ] ;
fhir:value [
a fhir:string ;
fhir:v "DisableListDemotion"       ]     ] [
fhir:name [ fhir:v "option" ] ;
fhir:value [
a fhir:string ;
fhir:v "DisableListPromotion"       ]     ] [
fhir:name [ fhir:v "analyzeDataRequirements" ] ;
fhir:value [
a fhir:boolean ;
fhir:v false       ]     ] [
fhir:name [ fhir:v "collapseDataRequirements" ] ;
fhir:value [
a fhir:boolean ;
fhir:v true       ]     ] [
fhir:name [ fhir:v "compatibilityLevel" ] ;
fhir:value [
a fhir:string ;
fhir:v "1.5"       ]     ] [
fhir:name [ fhir:v "enableCqlOnly" ] ;
fhir:value [
a fhir:boolean ;
fhir:v false       ]     ] [
fhir:name [ fhir:v "errorLevel" ] ;
fhir:value [
a fhir:string ;
fhir:v "Info"       ]     ] [
fhir:name [ fhir:v "signatureLevel" ] ;
fhir:value [
a fhir:string ;
fhir:v "Overloads"       ]     ] [
fhir:name [ fhir:v "validateUnits" ] ;
fhir:value [
a fhir:boolean ;
fhir:v true       ]     ] [
fhir:name [ fhir:v "verifyOnly" ] ;
fhir:value [
a fhir:boolean ;
fhir:v false       ]     ] )
  ] ) ; # 
  fhir:extension ( [
fhir:url [ fhir:v "http://hl7.org/fhir/StructureDefinition/cqf-cqlOptions"^^xsd:anyURI ] ;
fhir:value [
a fhir:Reference ;
fhir:reference [ fhir:v "#options" ]     ]
  ] ) ; # 
  fhir:url [ fhir:v "http://www.cdc.gov/nhsn/fhirportal/dqm/ig/Library/SharedResourceCreation"^^xsd:anyURI] ; # 
  fhir:version [ fhir:v "1.0.0"] ; # 
  fhir:name [ fhir:v "SharedResourceCreation"] ; # 
  fhir:status [ fhir:v "draft"] ; # 
  fhir:type [
    ( fhir:coding [
fhir:system [ fhir:v "http://terminology.hl7.org/CodeSystem/library-type"^^xsd:anyURI ] ;
fhir:code [ fhir:v "logic-library" ]     ] )
  ] ; # 
  fhir:date [ fhir:v "2025-09-15T11:51:36-04:00"^^xsd:dateTime] ; # 
  fhir:publisher [ fhir:v "CDC National Healthcare Safety Network (NHSN)"] ; # 
  fhir:contact ( [
fhir:name [ fhir:v "CDC National Healthcare Safety Network (NHSN)" ] ;
    ( fhir:telecom [
fhir:system [ fhir:v "url" ] ;
fhir:value [ fhir:v "http://www.cdc.gov/nhsn" ]     ] [
fhir:system [ fhir:v "email" ] ;
fhir:value [ fhir:v "nhsn@cdc.gov" ]     ] )
  ] ) ; # 
  fhir:jurisdiction ( [
    ( fhir:coding [
fhir:system [ fhir:v "urn:iso:std:iso:3166"^^xsd:anyURI ] ;
fhir:code [ fhir:v "US" ]     ] )
  ] ) ; # 
  fhir:relatedArtifact ( [
fhir:type [ fhir:v "depends-on" ] ;
fhir:display [ fhir:v "FHIR model information" ] ;
fhir:resource [
fhir:v "http://fhir.org/guides/cqf/common/Library/FHIR-ModelInfo|4.0.1"^^xsd:anyURI ;
fhir:link <http://fhir.org/guides/cqf/common/Library/FHIR-ModelInfo|4.0.1>     ]
  ] [
fhir:type [ fhir:v "depends-on" ] ;
fhir:display [ fhir:v "Library FHIRHelpers" ] ;
fhir:resource [
fhir:v "http://www.cdc.gov/nhsn/fhirportal/dqm/ig/Library/FHIRHelpers|4.0.2"^^xsd:anyURI ;
fhir:link <http://www.cdc.gov/nhsn/fhirportal/dqm/ig/Library/FHIRHelpers|4.0.2>     ]
  ] ) ; # 
  fhir:content ( [
fhir:contentType [ fhir:v "text/cql" ] ;
fhir:data [ fhir:v "bGlicmFyeSBTaGFyZWRSZXNvdXJjZUNyZWF0aW9uIHZlcnNpb24gJzAuMS4wMTAnDQoNCmluY2x1ZGUgRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjInDQoNCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnDQoNCmRlZmluZSBmdW5jdGlvbiAiR2V0SWRFeHRlbnNpb25zIihkb21haW5SZXNvdXJjZSBEb21haW5SZXNvdXJjZSk6DQogIGRvbWFpblJlc291cmNlLmV4dGVuc2lvbiBFDQogIHdoZXJlIEUudXJsLnZhbHVlID0gJ2h0dHA6Ly93d3cuY2RjLmdvdi9uaHNuL2ZoaXJwb3J0YWwvZHFtL2lnL1N0cnVjdHVyZURlZmluaXRpb24vbGluay1vcmlnaW5hbC1yZXNvdXJjZS1pZC1leHRlbnNpb24nDQogIHJldHVybiBFDQoNCmRlZmluZSBmdW5jdGlvbiAiR2V0UGF0aWVudEV4dGVuc2lvbnMiKGRvbWFpblJlc291cmNlIERvbWFpblJlc291cmNlKToNCiAgZG9tYWluUmVzb3VyY2UuZXh0ZW5zaW9uIEUNCiAgd2hlcmUgRS51cmwudmFsdWUgPSAnaHR0cDovL2hsNy5vcmcvZmhpci91cy9jb3JlL1N0cnVjdHVyZURlZmluaXRpb24vdXMtY29yZS1yYWNlJw0KICAgIG9yIEUudXJsLnZhbHVlID0gJ2h0dHA6Ly9obDcub3JnL2ZoaXIvdXMvY29yZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL3VzLWNvcmUtZXRobmljaXR5Jw0KICAgIG9yIEUudXJsLnZhbHVlID0gJ2h0dHA6Ly9obDcub3JnL2ZoaXIvdXMvY29yZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL3VzLWNvcmUtYmlydGhzZXgnDQogICAgb3IgRS51cmwudmFsdWUgPSAnaHR0cDovL3d3dy5jZGMuZ292L25oc24vZmhpcnBvcnRhbC9kcW0vaWcvU3RydWN0dXJlRGVmaW5pdGlvbi9saW5rLW9yaWdpbmFsLXJlc291cmNlLWlkLWV4dGVuc2lvbicNCiAgcmV0dXJuIEUNCg0KZGVmaW5lIGZ1bmN0aW9uICJNZXRhRWxlbWVudCIocmVzb3VyY2UgUmVzb3VyY2UsIHByb2ZpbGVVUkxzIExpc3Q8RkhJUi5jYW5vbmljYWw+KToNCiAgcmVzb3VyY2Ugcg0KICByZXR1cm4gRkhJUi5NZXRhew0KICAgIGV4dGVuc2lvbjogci5tZXRhLmV4dGVuc2lvbiwNCiAgICB2ZXJzaW9uSWQ6IHIubWV0YS52ZXJzaW9uSWQsDQogICAgbGFzdFVwZGF0ZWQ6IHIubWV0YS5sYXN0VXBkYXRlZCwNCiAgICBwcm9maWxlOiBwcm9maWxlVVJMcywNCiAgICBzZWN1cml0eTogci5tZXRhLnNlY3VyaXR5LA0KICAgIHRhZzogci5tZXRhLnRhZw0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBDb25kaXRpb25TdGFnZShzdGFnZSBMaXN0PEZISVIuQ29uZGl0aW9uLlN0YWdlPik6DQogIHN0YWdlIHMNCiAgcmV0dXJuIEZISVIuQ29uZGl0aW9uLlN0YWdlew0KICAgIHN1bW1hcnk6IHMuc3VtbWFyeSwNCiAgICBhc3Nlc3NtZW50OiBzLmFzc2Vzc21lbnQsDQogICAgdHlwZTogcy50eXBlDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIENvbmRpdGlvbkV2aWRlbmNlKGV2aWRlbmNlIExpc3Q8RkhJUi5Db25kaXRpb24uRXZpZGVuY2U+KToNCiAgZXZpZGVuY2UgZQ0KICByZXR1cm4gRkhJUi5Db25kaXRpb24uRXZpZGVuY2V7DQogICAgY29kZTogZS5jb2RlLA0KICAgIGRldGFpbDogZS5kZXRhaWwNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gQ29uZGl0aW9uUmVzb3VyY2UoY29uZGl0aW9uIENvbmRpdGlvbiwgcHJvZmlsZVVSTHMgTGlzdDxGSElSLmNhbm9uaWNhbD4sIGFjY2VwdGVkQ2F0ZWdvcmllcyBMaXN0PFN5c3RlbS5Db2RlPik6DQogIGNvbmRpdGlvbiBjDQogIHJldHVybiBDb25kaXRpb257DQogICAgaWQ6IEZISVIuaWQge3ZhbHVlOiAnTENSLScgKyBjLmlkfSwNCiAgICBtZXRhOiBNZXRhRWxlbWVudChjLCBwcm9maWxlVVJMcyksDQogICAgZXh0ZW5zaW9uOiBjLmV4dGVuc2lvbiwNCiAgICBjbGluaWNhbFN0YXR1czogYy5jbGluaWNhbFN0YXR1cywNCiAgICB2ZXJpZmljYXRpb25TdGF0dXM6IGMudmVyaWZpY2F0aW9uU3RhdHVzLA0KICAgIGNhdGVnb3J5OiBjLmNhdGVnb3J5LA0KICAgIHNldmVyaXR5OiBjLnNldmVyaXR5LA0KICAgIGNvZGU6IGMuY29kZSwNCiAgICBib2R5U2l0ZTogYy5ib2R5U2l0ZSwNCiAgICBzdWJqZWN0OiBjLnN1YmplY3QsDQogICAgZW5jb3VudGVyOiBjLmVuY291bnRlciwNCiAgICBvbnNldDogYy5vbnNldCwNCiAgICBhYmF0ZW1lbnQ6IGMuYWJhdGVtZW50LA0KICAgIHJlY29yZGVkRGF0ZTogYy5yZWNvcmRlZERhdGUsDQogICAgc3RhZ2U6IENvbmRpdGlvblN0YWdlKGMuc3RhZ2UpLA0KICAgIGV2aWRlbmNlOiBDb25kaXRpb25FdmlkZW5jZShjLmV2aWRlbmNlKSwNCiAgICBub3RlOiBjLm5vdGUNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gQ292ZXJhZ2VDbGFzcyhjbGFzcyBMaXN0PEZISVIuQ292ZXJhZ2UuQ2xhc3M+KToNCiAgY2xhc3MgYw0KICByZXR1cm4gRkhJUi5Db3ZlcmFnZS5DbGFzc3sNCiAgICB2YWx1ZTogYy52YWx1ZSwNCiAgICBuYW1lOiBjLm5hbWUNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gQ292ZXJhZ2VSZXNvdXJjZShjb3ZlcmFnZSBDb3ZlcmFnZSwgcHJvZmlsZVVSTHMgTGlzdDxGSElSLmNhbm9uaWNhbD4pOg0KICBjb3ZlcmFnZSBjDQogIHJldHVybiBDb3ZlcmFnZXsNCiAgICBpZDogRkhJUi5pZHt2YWx1ZTogJ0xDUi0nICsgYy5pZH0sDQogICAgbWV0YTogTWV0YUVsZW1lbnQoYywgcHJvZmlsZVVSTHMpLA0KICAgIGV4dGVuc2lvbjogYy5leHRlbnNpb24sDQogICAgc3RhdHVzOiBjLnN0YXR1cywNCiAgICB0eXBlOiBjLnR5cGUsDQogICAgcG9saWN5SG9sZGVyOiBjLnBvbGljeUhvbGRlciwNCiAgICBzdWJzY3JpYmVyOiBjLnN1YnNjcmliZXIsDQogICAgc3Vic2NyaWJlcklkOiBjLnN1YnNjcmliZXJJZCwNCiAgICBiZW5lZmljaWFyeTogYy5iZW5lZmljaWFyeSwNCiAgICBkZXBlbmRlbnQ6IGMuZGVwZW5kZW50LA0KICAgIHJlbGF0aW9uc2hpcDogYy5yZWxhdGlvbnNoaXAsDQogICAgcGVyaW9kOiBjLnBlcmlvZCwNCiAgICBwYXlvcjogYy5wYXlvciwNCiAgICBjbGFzczogQ292ZXJhZ2VDbGFzcyhjLmNsYXNzKSwNCiAgICBvcmRlcjogYy5vcmRlciwNCiAgICBuZXR3b3JrOiBjLm5ldHdvcmssDQogICAgc3Vicm9nYXRpb246IGMuc3Vicm9nYXRpb24sDQogICAgY29udHJhY3Q6IGMuY29udHJhY3QNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gRGlhZ25vc3RpY1JlcG9ydENvZGluZyhjb2RpbmcgTGlzdDxDb2Rpbmc+KToNCiAgY29kaW5nIGMNCiAgcmV0dXJuIENvZGluZ3sNCiAgICBzeXN0ZW06IGMuc3lzdGVtLA0KICAgIHZlcnNpb246IGMudmVyc2lvbiwNCiAgICBjb2RlOiBjLmNvZGUsDQogICAgZGlzcGxheTogYy5kaXNwbGF5LA0KICAgIHVzZXJTZWxlY3RlZDogYy51c2VyU2VsZWN0ZWQNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gRGlhZ25vc3RpY1JlcG9ydENhdGVnb3J5KGNhdGVnb3J5IExpc3Q8Q29kZWFibGVDb25jZXB0Pik6DQogIGNhdGVnb3J5IGMNCiAgcmV0dXJuIENvZGVhYmxlQ29uY2VwdHsNCiAgICBjb2Rpbmc6IERpYWdub3N0aWNSZXBvcnRDb2RpbmcoYy5jb2RpbmcpDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIERpYWdub3N0aWNSZXBvcnRMYWJSZXNvdXJjZShkaWFnbm9zdGljUmVwb3J0IERpYWdub3N0aWNSZXBvcnQsIHByb2ZpbGVVUkxzIExpc3Q8RkhJUi5jYW5vbmljYWw+KToNCiAgZGlhZ25vc3RpY1JlcG9ydCBkDQogIHJldHVybiBEaWFnbm9zdGljUmVwb3J0ew0KICAgIGlkOiBGSElSLmlke3ZhbHVlOiAnTENSLScgKyBkLmlkfSwNCiAgICBtZXRhOiBNZXRhRWxlbWVudChkLCBwcm9maWxlVVJMcyksDQogICAgZXh0ZW5zaW9uOiBkLmV4dGVuc2lvbiwNCiAgICBiYXNlZE9uOiBkLmJhc2VkT24sDQogICAgc3RhdHVzOiBkLnN0YXR1cywNCiAgICBjYXRlZ29yeTogRGlhZ25vc3RpY1JlcG9ydENhdGVnb3J5KGQuY2F0ZWdvcnkpLA0KICAgIGNvZGU6IGQuY29kZSwNCiAgICBzdWJqZWN0OiBkLnN1YmplY3QsDQogICAgZW5jb3VudGVyOiBkLmVuY291bnRlciwNCiAgICBlZmZlY3RpdmU6IGQuZWZmZWN0aXZlLA0KICAgIGlzc3VlZDogZC5pc3N1ZWQsDQogICAgcGVyZm9ybWVyOiBkLnBlcmZvcm1lciwNCiAgICByZXN1bHRzSW50ZXJwcmV0ZXI6IGQucmVzdWx0c0ludGVycHJldGVyLA0KICAgIHNwZWNpbWVuOiBkLnNwZWNpbWVuLA0KICAgIHJlc3VsdDogZC5yZXN1bHQsDQogICAgY29uY2x1c2lvbjogZC5jb25jbHVzaW9uLA0KICAgIGNvbmNsdXNpb25Db2RlOiBkLmNvbmNsdXNpb25Db2RlDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIEVuY291bnRlcklkZW50aWZpZXIoaWRlbnRpZmllciBMaXN0PEZISVIuSWRlbnRpZmllcj4pOg0KICBpZGVudGlmaWVyIGkNCiAgcmV0dXJuIEZISVIuSWRlbnRpZmllcnsNCiAgICB1c2U6IGkudXNlLA0KICAgIHR5cGU6IGkudHlwZSwNCiAgICBzeXN0ZW06IGkuc3lzdGVtLA0KICAgIHZhbHVlOiBpLnZhbHVlLA0KICAgIHBlcmlvZDogaS5wZXJpb2QNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gRW5jb3VudGVyU3RhdHVzSGlzdG9yeShzdGF0dXNIaXN0b3J5IExpc3Q8RkhJUi5FbmNvdW50ZXIuU3RhdHVzSGlzdG9yeT4pOg0KICBzdGF0dXNIaXN0b3J5IHNIDQogIHJldHVybiBGSElSLkVuY291bnRlci5TdGF0dXNIaXN0b3J5ew0KICAgIHN0YXR1czogc0guc3RhdHVzLA0KICAgIHBlcmlvZDogc0gucGVyaW9kDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIEVuY291bnRlckNsYXNzSGlzdG9yeShjbGFzc0hpc3RvcnkgTGlzdDxGSElSLkVuY291bnRlci5DbGFzc0hpc3Rvcnk+KToNCiAgY2xhc3NIaXN0b3J5IGNIDQogIHJldHVybiBGSElSLkVuY291bnRlci5DbGFzc0hpc3Rvcnl7DQogICAgY2xhc3M6IGNILmNsYXNzLA0KICAgIHBlcmlvZDogY0gucGVyaW9kDQogIH0NCg0KLypObyBsb25nZXIgbmVlZGVkIGJ1dCBzYXZpbmcgZm9yIHBvdGVudGlhbCBmdXR1cmUgdXNlDQpkZWZpbmUgZnVuY3Rpb24gRW5jb3VudGVyUGFydGljaXBhbnQocGFydGljaXBhbnQgTGlzdDxGSElSLkVuY291bnRlci5QYXJ0aWNpcGFudD4pOg0KICBwYXJ0aWNpcGFudCBwDQogIHJldHVybiBGSElSLkVuY291bnRlci5QYXJ0aWNpcGFudHsNCiAgICB0eXBlOiBwLnR5cGUsDQogICAgcGVyaW9kOiBwLnBlcmlvZCwNCiAgICBpbmRpdmlkdWFsOiBwLmluZGl2aWR1YWwNCiAgfSovDQoNCmRlZmluZSBmdW5jdGlvbiBFbmNvdW50ZXJEaWFnbm9zaXMoZGlhZ25vc2lzIExpc3Q8RkhJUi5FbmNvdW50ZXIuRGlhZ25vc2lzPik6DQogIGRpYWdub3NpcyBkDQogIHJldHVybiBGSElSLkVuY291bnRlci5EaWFnbm9zaXN7DQogICAgY29uZGl0aW9uOiBkLmNvbmRpdGlvbiwNCiAgICB1c2U6IGQudXNlLA0KICAgIHJhbms6IGQucmFuaw0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBFbmNvdW50ZXJIb3NwaXRhbGl6YXRpb24oaG9zcGl0YWxpemF0aW9uIEZISVIuRW5jb3VudGVyLkhvc3BpdGFsaXphdGlvbik6DQogIGhvc3BpdGFsaXphdGlvbiBoDQogIHJldHVybiBGSElSLkVuY291bnRlci5Ib3NwaXRhbGl6YXRpb257DQogICAgcHJlQWRtaXNzaW9uSWRlbnRpZmllcjogaC5wcmVBZG1pc3Npb25JZGVudGlmaWVyLA0KICAgIG9yaWdpbjogaC5vcmlnaW4sDQogICAgYWRtaXRTb3VyY2U6IGguYWRtaXRTb3VyY2UsDQogICAgcmVBZG1pc3Npb246IGgucmVBZG1pc3Npb24sDQogICAgZGlldFByZWZlcmVuY2U6IGguZGlldFByZWZlcmVuY2UsDQogICAgc3BlY2lhbENvdXJ0ZXN5OiBoLnNwZWNpYWxDb3VydGVzeSwNCiAgICBzcGVjaWFsQXJyYW5nZW1lbnQ6IGguc3BlY2lhbEFycmFuZ2VtZW50LA0KICAgIGRlc3RpbmF0aW9uOiBoLmRlc3RpbmF0aW9uLA0KICAgIGRpc2NoYXJnZURpc3Bvc2l0aW9uOiBoLmRpc2NoYXJnZURpc3Bvc2l0aW9uDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIEVuY291bnRlckxvY2F0aW9uKGxvY2F0aW9uIExpc3Q8RkhJUi5FbmNvdW50ZXIuTG9jYXRpb24+KToNCiAgbG9jYXRpb24gbA0KICByZXR1cm4gRkhJUi5FbmNvdW50ZXIuTG9jYXRpb257DQogICAgbG9jYXRpb246IGwubG9jYXRpb24sDQogICAgc3RhdHVzOiBsLnN0YXR1cywNCiAgICBwaHlzaWNhbFR5cGU6IGwucGh5c2ljYWxUeXBlLA0KICAgIHBlcmlvZDogbC5wZXJpb2QNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gRW5jb3VudGVyUmVzb3VyY2UoZW5jb3VudGVyIEVuY291bnRlciwgcHJvZmlsZVVSTHMgTGlzdDxGSElSLmNhbm9uaWNhbD4pOg0KICBlbmNvdW50ZXIgZQ0KICByZXR1cm4gRW5jb3VudGVyew0KICAgIGlkOiBGSElSLmlke3ZhbHVlOiAnTENSLScgKyBlLmlkfSwNCiAgICBtZXRhOiBNZXRhRWxlbWVudChlLCBwcm9maWxlVVJMcyksDQogICAgZXh0ZW5zaW9uOiBlLmV4dGVuc2lvbiwNCiAgICBpZGVudGlmaWVyOiBFbmNvdW50ZXJJZGVudGlmaWVyKGUuaWRlbnRpZmllciksDQogICAgc3RhdHVzOiBlLnN0YXR1cywNCiAgICBzdGF0dXNIaXN0b3J5OiBFbmNvdW50ZXJTdGF0dXNIaXN0b3J5KGUuc3RhdHVzSGlzdG9yeSksDQogICAgY2xhc3M6IGUuY2xhc3MsDQogICAgY2xhc3NIaXN0b3J5OiBFbmNvdW50ZXJDbGFzc0hpc3RvcnkoZS5jbGFzc0hpc3RvcnkpLA0KICAgIHR5cGU6IGUudHlwZSwNCiAgICBzZXJ2aWNlVHlwZTogZS5zZXJ2aWNlVHlwZSwNCiAgICBwcmlvcml0eTogZS5wcmlvcml0eSwNCiAgICBzdWJqZWN0OiBlLnN1YmplY3QsDQogICAgcGVyaW9kOiBlLnBlcmlvZCwNCiAgICBsZW5ndGg6IGUubGVuZ3RoLA0KICAgIHJlYXNvbkNvZGU6IGUucmVhc29uQ29kZSwNCiAgICByZWFzb25SZWZlcmVuY2U6IGUucmVhc29uUmVmZXJlbmNlLA0KICAgIGRpYWdub3NpczogRW5jb3VudGVyRGlhZ25vc2lzKGUuZGlhZ25vc2lzKSwNCiAgICBhY2NvdW50OiBlLmFjY291bnQsDQogICAgaG9zcGl0YWxpemF0aW9uOiBFbmNvdW50ZXJIb3NwaXRhbGl6YXRpb24oZS5ob3NwaXRhbGl6YXRpb24pLA0KICAgIGxvY2F0aW9uOiBFbmNvdW50ZXJMb2NhdGlvbihlLmxvY2F0aW9uKSwNCiAgICBwYXJ0T2Y6IGUucGFydE9mDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIE9ic2VydmF0aW9uTGFiQ29kaW5nKGNvZGluZyBMaXN0PENvZGluZz4pOg0KICBjb2RpbmcgYw0KICByZXR1cm4gQ29kaW5new0KICAgIGlkOiBjLmlkLA0KICAgIGV4dGVuc2lvbjogYy5leHRlbnNpb24sDQogICAgc3lzdGVtOiBjLnN5c3RlbSwNCiAgICB2ZXJzaW9uOiBjLnZlcnNpb24sDQogICAgY29kZTogYy5jb2RlLA0KICAgIGRpc3BsYXk6IGMuZGlzcGxheSwNCiAgICB1c2VyU2VsZWN0ZWQ6IGMudXNlclNlbGVjdGVkDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIE9ic2VydmF0aW9uTGFiQ2F0ZWdvcnkoY2F0ZWdvcnkgTGlzdDxDb2RlYWJsZUNvbmNlcHQ+KToNCiAgY2F0ZWdvcnkgYw0KICByZXR1cm4gQ29kZWFibGVDb25jZXB0ew0KICAgIGNvZGluZzogT2JzZXJ2YXRpb25MYWJDb2RpbmcoYy5jb2RpbmcpLA0KICAgIHRleHQ6IGMudGV4dA0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBPYnNlcnZhdGlvblJlZmVyZW5jZVJhbmdlKHJlZmVyZW5jZVJhbmdlIExpc3Q8RkhJUi5PYnNlcnZhdGlvbi5SZWZlcmVuY2VSYW5nZT4pOg0KICByZWZlcmVuY2VSYW5nZSByUg0KICByZXR1cm4gRkhJUi5PYnNlcnZhdGlvbi5SZWZlcmVuY2VSYW5nZXsNCiAgICBsb3c6IHJSLmxvdywNCiAgICBoaWdoOiByUi5oaWdoLA0KICAgIHR5cGU6IHJSLnR5cGUsDQogICAgYXBwbGllc1RvOiByUi5hcHBsaWVzVG8sDQogICAgYWdlOiByUi5hZ2UsDQogICAgdGV4dDogclIudGV4dA0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBPYnNlcnZhdGlvbkNvbXBvbmVudChjb21wb25lbnQgTGlzdDxGSElSLk9ic2VydmF0aW9uLkNvbXBvbmVudD4pOg0KICBjb21wb25lbnQgYw0KICByZXR1cm4gRkhJUi5PYnNlcnZhdGlvbi5Db21wb25lbnR7DQogICAgY29kZTogYy5jb2RlLA0KICAgIHZhbHVlOiBjLnZhbHVlLA0KICAgIGRhdGFBYnNlbnRSZWFzb246IGMuZGF0YUFic2VudFJlYXNvbiwNCiAgICBpbnRlcnByZXRhdGlvbjogYy5pbnRlcnByZXRhdGlvbiwNCiAgICByZWZlcmVuY2VSYW5nZTogYy5yZWZlcmVuY2VSYW5nZQ0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBPYnNlcnZhdGlvbkxhYlJlc291cmNlKG9ic2VydmF0aW9uIE9ic2VydmF0aW9uLCBwcm9maWxlVVJMcyBMaXN0PEZISVIuY2Fub25pY2FsPik6DQogIG9ic2VydmF0aW9uIG8NCiAgcmV0dXJuIE9ic2VydmF0aW9uew0KICAgIGlkOiBGSElSLmlkIHt2YWx1ZTogJ0xDUi0nICsgby5pZH0sDQogICAgbWV0YTogTWV0YUVsZW1lbnQobywgcHJvZmlsZVVSTHMpLA0KICAgIGV4dGVuc2lvbjogby5leHRlbnNpb24sDQogICAgYmFzZWRPbjogby5iYXNlZE9uLA0KICAgIHBhcnRPZjogby5wYXJ0T2YsDQogICAgc3RhdHVzOiBvLnN0YXR1cywNCiAgICBjYXRlZ29yeTogT2JzZXJ2YXRpb25MYWJDYXRlZ29yeShvLmNhdGVnb3J5KSwNCiAgICBjb2RlOiBvLmNvZGUsDQogICAgc3ViamVjdDogby5zdWJqZWN0LA0KICAgIGZvY3VzOiBvLmZvY3VzLA0KICAgIGVuY291bnRlcjogby5lbmNvdW50ZXIsDQogICAgZWZmZWN0aXZlOiBvLmVmZmVjdGl2ZSwNCiAgICBpc3N1ZWQ6IG8uaXNzdWVkLA0KICAgIHBlcmZvcm1lcjogby5wZXJmb3JtZXIsDQogICAgdmFsdWU6IG8udmFsdWUsDQogICAgZGF0YUFic2VudFJlYXNvbjogby5kYXRhQWJzZW50UmVhc29uLA0KICAgIGludGVycHJldGF0aW9uOiBvLmludGVycHJldGF0aW9uLA0KICAgIG5vdGU6IG8ubm90ZSwNCiAgICBib2R5U2l0ZTogby5ib2R5U2l0ZSwNCiAgICBtZXRob2Q6IG8ubWV0aG9kLA0KICAgIHNwZWNpbWVuOiBvLnNwZWNpbWVuLA0KICAgIGRldmljZTogby5kZXZpY2UsDQogICAgcmVmZXJlbmNlUmFuZ2U6IE9ic2VydmF0aW9uUmVmZXJlbmNlUmFuZ2Uoby5yZWZlcmVuY2VSYW5nZSksDQogICAgaGFzTWVtYmVyOiBvLmhhc01lbWJlciwNCiAgICBkZXJpdmVkRnJvbTogby5kZXJpdmVkRnJvbSwNCiAgICBjb21wb25lbnQ6IE9ic2VydmF0aW9uQ29tcG9uZW50KG8uY29tcG9uZW50KQ0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBMb2NhdGlvbkFkZHJlc3MoYWRkcmVzcyBGSElSLkFkZHJlc3MpOg0KICBhZGRyZXNzIGENCiAgcmV0dXJuIEZISVIuQWRkcmVzc3sNCiAgICB1c2U6IGEudXNlLA0KICAgIHR5cGU6IGEudHlwZSwNCiAgICB0ZXh0OiBhLnRleHQsDQogICAgbGluZTogYS5saW5lLA0KICAgIGNpdHk6IGEuY2l0eSwNCiAgICBkaXN0cmljdDogYS5kaXN0cmljdCwNCiAgICBzdGF0ZTogYS5zdGF0ZSwNCiAgICBwb3N0YWxDb2RlOiBhLnBvc3RhbENvZGUsDQogICAgY291bnRyeTogYS5jb3VudHJ5LA0KICAgIHBlcmlvZDogYS5wZXJpb2QNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gTG9jYXRpb25Qb3NpdGlvbihwb3NpdGlvbiBGSElSLkxvY2F0aW9uLlBvc2l0aW9uKToNCiAgcG9zaXRpb24gcA0KICByZXR1cm4gRkhJUi5Mb2NhdGlvbi5Qb3NpdGlvbnsNCiAgICBsb25naXR1ZGU6IHAubG9uZ2l0dWRlLA0KICAgIGxhdGl0dWRlOiBwLmxhdGl0dWRlLA0KICAgIGFsdGl0dWRlOiBwLmFsdGl0dWRlDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIExvY2F0aW9uSG91cnNPZk9wZXJhdGlvbihob3Vyc09mT3BlcmF0aW9uIExpc3Q8RkhJUi5Mb2NhdGlvbi5Ib3Vyc09mT3BlcmF0aW9uPik6DQogIGhvdXJzT2ZPcGVyYXRpb24gaE9PDQogIHJldHVybiBGSElSLkxvY2F0aW9uLkhvdXJzT2ZPcGVyYXRpb257DQogICAgZGF5c09mV2VlazogaE9PLmRheXNPZldlZWssDQogICAgYWxsRGF5OiBoT08uYWxsRGF5LA0KICAgIG9wZW5pbmdUaW1lOiBoT08ub3BlbmluZ1RpbWUsDQogICAgY2xvc2luZ1RpbWU6IGhPTy5jbG9zaW5nVGltZQ0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBMb2NhdGlvblJlc291cmNlKGxvY2F0aW9uIExvY2F0aW9uLCBwcm9maWxlVVJMcyBMaXN0PEZISVIuY2Fub25pY2FsPik6DQogIGxvY2F0aW9uIGwNCiAgcmV0dXJuIExvY2F0aW9uew0KICAgIGlkOiBGSElSLmlkIHt2YWx1ZTogJ0xDUi0nICsgbC5pZH0sDQogICAgbWV0YTogTWV0YUVsZW1lbnQobCwgcHJvZmlsZVVSTHMpLA0KICAgIGV4dGVuc2lvbjogbC5leHRlbnNpb24sDQogICAgc3RhdHVzOiBsLnN0YXR1cywNCiAgICBvcGVyYXRpb25hbFN0YXR1czogbC5vcGVyYXRpb25hbFN0YXR1cywNCiAgICBuYW1lOiBsLm5hbWUsDQogICAgYWxpYXM6IGwuYWxpYXMsDQogICAgZGVzY3JpcHRpb246IGwuZGVzY3JpcHRpb24sDQogICAgbW9kZTogbC5tb2RlLA0KICAgIHR5cGU6IGwudHlwZSwNCiAgICB0ZWxlY29tOiBsLnRlbGVjb20sDQogICAgYWRkcmVzczogTG9jYXRpb25BZGRyZXNzKGwuYWRkcmVzcyksDQogICAgcGh5c2ljYWxUeXBlOiBsLnBoeXNpY2FsVHlwZSwNCiAgICBwb3NpdGlvbjogTG9jYXRpb25Qb3NpdGlvbihsLnBvc2l0aW9uKSwNCiAgICBtYW5hZ2luZ09yZ2FuaXphdGlvbjogbC5tYW5hZ2luZ09yZ2FuaXphdGlvbiwNCiAgICBwYXJ0T2Y6IGwucGFydE9mLA0KICAgIGhvdXJzT2ZPcGVyYXRpb246IExvY2F0aW9uSG91cnNPZk9wZXJhdGlvbihsLmhvdXJzT2ZPcGVyYXRpb24pLA0KICAgIGF2YWlsYWJpbGl0eUV4Y2VwdGlvbnM6IGwuYXZhaWxhYmlsaXR5RXhjZXB0aW9ucywNCiAgICBlbmRwb2ludDogbC5lbmRwb2ludA0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBNZWRpY2F0aW9uSW5ncmVkaWVudChpbmdyZWRpZW50IExpc3Q8RkhJUi5NZWRpY2F0aW9uLkluZ3JlZGllbnQ+KToNCiAgaW5ncmVkaWVudCBpDQogIHJldHVybiBGSElSLk1lZGljYXRpb24uSW5ncmVkaWVudHsNCiAgICBpdGVtOiBpLml0ZW0sDQogICAgc3RyZW5ndGg6IGkuc3RyZW5ndGgNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gTWVkaWNhdGlvbkJhdGNoKGJhdGNoIEZISVIuTWVkaWNhdGlvbi5CYXRjaCk6DQogIGJhdGNoIGINCiAgcmV0dXJuIEZISVIuTWVkaWNhdGlvbi5CYXRjaHsNCiAgICBsb3ROdW1iZXI6IGIubG90TnVtYmVyLA0KICAgIGV4cGlyYXRpb25EYXRlOiBiLmV4cGlyYXRpb25EYXRlDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIE1lZGljYXRpb25SZXNvdXJjZShtZWRpY2F0aW9uIE1lZGljYXRpb24sIHByb2ZpbGVVUkxzIExpc3Q8RkhJUi5jYW5vbmljYWw+KToNCiAgbWVkaWNhdGlvbiBtDQogIHJldHVybiBNZWRpY2F0aW9uew0KICAgIGlkOiBGSElSLmlkIHt2YWx1ZTogJ0xDUi0nICsgbS5pZH0sDQogICAgbWV0YTogTWV0YUVsZW1lbnQobSwgcHJvZmlsZVVSTHMpLA0KICAgIGV4dGVuc2lvbjogbS5leHRlbnNpb24sDQogICAgY29kZTogbS5jb2RlLA0KICAgIHN0YXR1czogbS5zdGF0dXMsDQogICAgbWFudWZhY3R1cmVyOiBtLm1hbnVmYWN0dXJlciwNCiAgICBmb3JtOiBtLmZvcm0sDQogICAgYW1vdW50OiBtLmFtb3VudCwNCiAgICBpbmdyZWRpZW50OiBNZWRpY2F0aW9uSW5ncmVkaWVudChtLmluZ3JlZGllbnQpLA0KICAgIGJhdGNoOiBNZWRpY2F0aW9uQmF0Y2gobS5iYXRjaCkNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uUGVyZm9ybWVyKHBlcmZvcm1lciBMaXN0PEZISVIuTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uLlBlcmZvcm1lcj4pOg0KICBwZXJmb3JtZXIgcA0KICByZXR1cm4gRkhJUi5NZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24uUGVyZm9ybWVyew0KICAgIGZ1bmN0aW9uOiBwLmZ1bmN0aW9uLA0KICAgIGFjdG9yOiBwLmFjdG9yDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIE1lZGljYXRpb25BZG1pbmlzdHJhdGlvbkRvc2FnZShkb3NhZ2UgRkhJUi5NZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24uRG9zYWdlKToNCiAgZG9zYWdlIGQNCiAgcmV0dXJuIEZISVIuTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uLkRvc2FnZXsNCiAgICB0ZXh0OiBkLnRleHQsDQogICAgc2l0ZTogZC5zaXRlLA0KICAgIHJvdXRlOiBkLnJvdXRlLA0KICAgIG1ldGhvZDogZC5tZXRob2QsDQogICAgZG9zZTogZC5kb3NlLA0KICAgIHJhdGU6IGQucmF0ZQ0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb25SZXNvdXJjZShtZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24gTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uLCBwcm9maWxlVVJMcyBMaXN0PEZISVIuY2Fub25pY2FsPik6DQogIG1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiBtDQogIHJldHVybiBNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb257DQogICAgaWQ6IEZISVIuaWQge3ZhbHVlOiAnTENSLScgKyBtLmlkfSwNCiAgICBtZXRhOiBNZXRhRWxlbWVudChtLCBwcm9maWxlVVJMcyksDQogICAgZXh0ZW5zaW9uOiBtLmV4dGVuc2lvbiwNCiAgICBpbnN0YW50aWF0ZXM6IG0uaW5zdGFudGlhdGVzLA0KICAgIHBhcnRPZjogbS5wYXJ0T2YsDQogICAgc3RhdHVzOiBtLnN0YXR1cywNCiAgICBzdGF0dXNSZWFzb246IG0uc3RhdHVzUmVhc29uLA0KICAgIGNhdGVnb3J5OiBtLmNhdGVnb3J5LA0KICAgIG1lZGljYXRpb246IG0ubWVkaWNhdGlvbiwNCiAgICBzdWJqZWN0OiBtLnN1YmplY3QsDQogICAgY29udGV4dDogbS5jb250ZXh0LA0KICAgIHN1cHBvcnRpbmdJbmZvcm1hdGlvbjogbS5zdXBwb3J0aW5nSW5mb3JtYXRpb24sDQogICAgZWZmZWN0aXZlOiBtLmVmZmVjdGl2ZSwNCiAgICBwZXJmb3JtZXI6IE1lZGljYXRpb25BZG1pbmlzdHJhdGlvblBlcmZvcm1lcihtLnBlcmZvcm1lciksDQogICAgcmVhc29uQ29kZTogbS5yZWFzb25Db2RlLA0KICAgIHJlYXNvblJlZmVyZW5jZTogbS5yZWFzb25SZWZlcmVuY2UsDQogICAgcmVxdWVzdDogbS5yZXF1ZXN0LA0KICAgIGRldmljZTogbS5kZXZpY2UsDQogICAgbm90ZTogbS5ub3RlLA0KICAgIGRvc2FnZTogTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uRG9zYWdlKG0uZG9zYWdlKSwNCiAgICBldmVudEhpc3Rvcnk6IG0uZXZlbnRIaXN0b3J5DQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIE1lZGljYXRpb25SZXF1ZXN0RG9zZUFuZFJhdGUoZG9zZUFuZFJhdGUgTGlzdDxGSElSLkRvc2FnZS5Eb3NlQW5kUmF0ZT4pOg0KICBkb3NlQW5kUmF0ZSBkUg0KICByZXR1cm4gRkhJUi5Eb3NhZ2UuRG9zZUFuZFJhdGV7DQogICAgdHlwZTogZFIudHlwZSwNCiAgICBkb3NlOiBkUi5kb3NlLA0KICAgIHJhdGU6IGRSLnJhdGUNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gTWVkaWNhdGlvblJlcXVlc3REb3NhZ2VJbnN0cnVjdGlvbihkb3NhZ2VJbnN0cnVjdGlvbiBMaXN0PEZISVIuRG9zYWdlPik6DQogIGRvc2FnZUluc3RydWN0aW9uIGRJDQogIHJldHVybiBGSElSLkRvc2FnZXsNCiAgICB0ZXh0OiBkSS50ZXh0LA0KICAgIHBhdGllbnRJbnN0cnVjdGlvbjogZEkucGF0aWVudEluc3RydWN0aW9uLA0KICAgIHRpbWluZzogZEkudGltaW5nLA0KICAgIGFzTmVlZGVkOiBkSS5hc05lZWRlZCwNCiAgICBzaXRlOiBkSS5zaXRlLA0KICAgIHJvdXRlOiBkSS5yb3V0ZSwNCiAgICBtZXRob2Q6IGRJLm1ldGhvZCwNCiAgICBkb3NlQW5kUmF0ZTogTWVkaWNhdGlvblJlcXVlc3REb3NlQW5kUmF0ZShkSS5kb3NlQW5kUmF0ZSkNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gTWVkaWNhdGlvblJlcXVlc3RSZXNvdXJjZShtZWRpY2F0aW9uUmVxdWVzdCBNZWRpY2F0aW9uUmVxdWVzdCwgcHJvZmlsZVVSTHMgTGlzdDxGSElSLmNhbm9uaWNhbD4pOg0KICBtZWRpY2F0aW9uUmVxdWVzdCBtDQogIHJldHVybiBNZWRpY2F0aW9uUmVxdWVzdHsNCiAgICBpZDogRkhJUi5pZCB7dmFsdWU6ICdMQ1ItJyArIG0uaWR9LA0KICAgIG1ldGE6IE1ldGFFbGVtZW50KG1lZGljYXRpb25SZXF1ZXN0LCBwcm9maWxlVVJMcyksDQogICAgZXh0ZW5zaW9uOiBtLmV4dGVuc2lvbiwNCiAgICBzdGF0dXM6IG0uc3RhdHVzLA0KICAgIHN0YXR1c1JlYXNvbjogbS5zdGF0dXNSZWFzb24sDQogICAgaW50ZW50OiBtLmludGVudCwNCiAgICBjYXRlZ29yeTogbS5jYXRlZ29yeSwNCiAgICBwcmlvcml0eTogbS5wcmlvcml0eSwNCiAgICBkb05vdFBlcmZvcm06IG0uZG9Ob3RQZXJmb3JtLA0KICAgIHJlcG9ydGVkOiBtLnJlcG9ydGVkLA0KICAgIG1lZGljYXRpb246IG0ubWVkaWNhdGlvbiwNCiAgICBzdWJqZWN0OiBtLnN1YmplY3QsDQogICAgZW5jb3VudGVyOiBtLmVuY291bnRlciwNCiAgICBhdXRob3JlZE9uOiBtLmF1dGhvcmVkT24sDQogICAgcmVxdWVzdGVyOiBtLnJlcXVlc3RlciwNCiAgICByZWNvcmRlcjogbS5yZWNvcmRlciwNCiAgICByZWFzb25Db2RlOiBtLnJlYXNvbkNvZGUsDQogICAgcmVhc29uUmVmZXJlbmNlOiBtLnJlYXNvblJlZmVyZW5jZSwNCiAgICBpbnN0YW50aWF0ZXNDYW5vbmljYWw6IG0uaW5zdGFudGlhdGVzQ2Fub25pY2FsLA0KICAgIGluc3RhbnRpYXRlc1VyaTogbS5pbnN0YW50aWF0ZXNVcmksDQogICAgY291cnNlT2ZUaGVyYXB5VHlwZTogbS5jb3Vyc2VPZlRoZXJhcHlUeXBlLA0KICAgIGRvc2FnZUluc3RydWN0aW9uOiBNZWRpY2F0aW9uUmVxdWVzdERvc2FnZUluc3RydWN0aW9uKG0uZG9zYWdlSW5zdHJ1Y3Rpb24pDQogIH0NCg0KLyogTm8gbG9uZ2VyIG5lZWRlZCBidXQgc2F2aW5nIGluIGNhc2UgaXQncyB1c2VmdWwgbGF0ZXINCmRlZmluZSBmdW5jdGlvbiBQYXRpZW50SWRlbnRpZmllcihpZGVudGlmaWVyIExpc3Q8RkhJUi5JZGVudGlmaWVyPik6DQogIGlkZW50aWZpZXIgaQ0KICByZXR1cm4gRkhJUi5JZGVudGlmaWVyew0KICAgIGlkOiBpLmlkLA0KICAgIGV4dGVuc2lvbjogaS5leHRlbnNpb24sDQogICAgdXNlOiBpLnVzZSwNCiAgICB0eXBlOiBpLnR5cGUsDQogICAgc3lzdGVtOiBpLnN5c3RlbSwNCiAgICB2YWx1ZTogaS52YWx1ZSwNCiAgICBwZXJpb2Q6IGkucGVyaW9kLA0KICAgIGFzc2lnbmVyOiBpLmFzc2lnbmVyDQogIH0qLw0KDQpkZWZpbmUgZnVuY3Rpb24gUGF0aWVudE5hbWUobmFtZSBMaXN0PEZISVIuSHVtYW5OYW1lPik6DQogIG5hbWUgbg0KICByZXR1cm4gRkhJUi5IdW1hbk5hbWV7DQogICAgaWQ6IG4uaWQsDQogICAgZXh0ZW5zaW9uOiBuLmV4dGVuc2lvbiwNCiAgICB1c2U6IG4udXNlLA0KICAgIHRleHQ6IG4udGV4dCwNCiAgICBmYW1pbHk6IG4uZmFtaWx5LA0KICAgIGdpdmVuOiBuLmdpdmVuLA0KICAgIHByZWZpeDogbi5wcmVmaXgsDQogICAgc3VmZml4OiBuLnN1ZmZpeCwNCiAgICBwZXJpb2Q6IG4ucGVyaW9kDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIFBhdGllbnRUZWxlY29tKHRlbGVjb20gTGlzdDxGSElSLkNvbnRhY3RQb2ludD4pOg0KICB0ZWxlY29tIHQNCiAgcmV0dXJuIEZISVIuQ29udGFjdFBvaW50ew0KICAgIHN5c3RlbTogdC5zeXN0ZW0sDQogICAgdmFsdWU6IHQudmFsdWUsDQogICAgdXNlOiB0LnVzZSwNCiAgICByYW5rOiB0LnJhbmssDQogICAgcGVyaW9kOiB0LnBlcmlvZA0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBQYXRpZW50QWRkcmVzcyhhZGRyZXNzIExpc3Q8RkhJUi5BZGRyZXNzPik6DQogIGFkZHJlc3MgYQ0KICByZXR1cm4gRkhJUi5BZGRyZXNzew0KICAgIGlkOiBhLmlkLA0KICAgIGV4dGVuc2lvbjogYS5leHRlbnNpb24sDQogICAgdXNlOiBhLnVzZSwNCiAgICB0eXBlOiBhLnR5cGUsDQogICAgdGV4dDogYS50ZXh0LA0KICAgIGxpbmU6IGEubGluZSwNCiAgICBjaXR5OiBhLmNpdHksDQogICAgZGlzdHJpY3Q6IGEuZGlzdHJpY3QsDQogICAgc3RhdGU6IGEuc3RhdGUsDQogICAgcG9zdGFsQ29kZTogYS5wb3N0YWxDb2RlLA0KICAgIGNvdW50cnk6IGEuY291bnRyeSwNCiAgICBwZXJpb2Q6IGEucGVyaW9kDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIFBhdGllbnRDb250YWN0KGNvbnRhY3QgTGlzdDxGSElSLlBhdGllbnQuQ29udGFjdD4pOg0KICBjb250YWN0IGMNCiAgcmV0dXJuIEZISVIuUGF0aWVudC5Db250YWN0ew0KICAgIGlkOiBjLmlkLA0KICAgIGV4dGVuc2lvbjogYy5leHRlbnNpb24sDQogICAgcmVsYXRpb25zaGlwOiBjLnJlbGF0aW9uc2hpcCwNCiAgICBuYW1lOiBjLm5hbWUsDQogICAgdGVsZWNvbTogYy50ZWxlY29tLA0KICAgIGFkZHJlc3M6IGMuYWRkcmVzcywNCiAgICBnZW5kZXI6IGMuZ2VuZGVyLA0KICAgIG9yZ2FuaXphdGlvbjogYy5vcmdhbml6YXRpb24sDQogICAgcGVyaW9kOiBjLnBlcmlvZA0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBQYXRpZW50Q29tbXVuaWNhdGlvbihjb21tdW5pY2F0aW9uIExpc3Q8RkhJUi5QYXRpZW50LkNvbW11bmljYXRpb24+KToNCiAgY29tbXVuaWNhdGlvbiBjDQogIHJldHVybiBGSElSLlBhdGllbnQuQ29tbXVuaWNhdGlvbnsNCiAgICBpZDogYy5pZCwNCiAgICBleHRlbnNpb246IGMuZXh0ZW5zaW9uLA0KICAgIGxhbmd1YWdlOiBjLmxhbmd1YWdlLA0KICAgIHByZWZlcnJlZDogYy5wcmVmZXJyZWQNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gUGF0aWVudExpbmsobGluayBMaXN0PEZISVIuUGF0aWVudC5MaW5rPik6DQogIGxpbmsgbA0KICByZXR1cm4gRkhJUi5QYXRpZW50Lkxpbmt7DQogICAgaWQ6IGwuaWQsDQogICAgZXh0ZW5zaW9uOiBsLmV4dGVuc2lvbiwNCiAgICBtb2RpZmllckV4dGVuc2lvbjogbC5tb2RpZmllckV4dGVuc2lvbiwNCiAgICBvdGhlcjogbC5vdGhlciwNCiAgICB0eXBlOiBsLnR5cGUNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gUGF0aWVudFJlc291cmNlKHBhdGllbnQgUGF0aWVudCwgcHJvZmlsZVVSTHMgTGlzdDxGSElSLmNhbm9uaWNhbD4pOg0KICBwYXRpZW50IHANCiAgcmV0dXJuIFBhdGllbnR7DQogICAgaWQ6IEZISVIuaWR7dmFsdWU6ICdMQ1ItJyArIHAuaWR9LA0KICAgIG1ldGE6IE1ldGFFbGVtZW50KHAsIHByb2ZpbGVVUkxzKSwNCiAgICBleHRlbnNpb246IEdldFBhdGllbnRFeHRlbnNpb25zKHApIHVuaW9uIEdldElkRXh0ZW5zaW9ucyhwKSwNCiAgICBpZGVudGlmaWVyOiBwLmlkZW50aWZpZXIsDQogICAgYWN0aXZlOiBwLmFjdGl2ZSwNCiAgICBuYW1lOiBQYXRpZW50TmFtZShwLm5hbWUpLA0KICAgIHRlbGVjb206IFBhdGllbnRUZWxlY29tKHAudGVsZWNvbSksDQogICAgZ2VuZGVyOiBwLmdlbmRlciwNCiAgICBiaXJ0aERhdGU6IHAuYmlydGhEYXRlLA0KICAgIGRlY2Vhc2VkOiBwLmRlY2Vhc2VkLA0KICAgIGFkZHJlc3M6IFBhdGllbnRBZGRyZXNzKHAuYWRkcmVzcyksDQogICAgbWFyaXRhbFN0YXR1czogcC5tYXJpdGFsU3RhdHVzLA0KICAgIG11bHRpcGxlQmlydGg6IHAubXVsdGlwbGVCaXJ0aCwNCiAgICBwaG90bzogcC5waG90bywNCiAgICBjb250YWN0OiBQYXRpZW50Q29udGFjdChwLmNvbnRhY3QpLA0KICAgIGNvbW11bmljYXRpb246IFBhdGllbnRDb21tdW5pY2F0aW9uKHAuY29tbXVuaWNhdGlvbiksDQogICAgZ2VuZXJhbFByYWN0aXRpb25lcjogcC5nZW5lcmFsUHJhY3RpdGlvbmVyLA0KICAgIG1hbmFnaW5nT3JnYW5pemF0aW9uOiBwLm1hbmFnaW5nT3JnYW5pemF0aW9uLA0KICAgIGxpbms6IFBhdGllbnRMaW5rKHAubGluaykNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gUHJvY2VkdXJlUGVyZm9ybWVyKHBlcmZvcm1lciBMaXN0PEZISVIuUHJvY2VkdXJlLlBlcmZvcm1lcj4pOg0KICBwZXJmb3JtZXIgcA0KICByZXR1cm4gRkhJUi5Qcm9jZWR1cmUuUGVyZm9ybWVyew0KICAgIGZ1bmN0aW9uOiBwLmZ1bmN0aW9uLA0KICAgIGFjdG9yOiBwLmFjdG9yLA0KICAgIG9uQmVoYWxmT2Y6IHAub25CZWhhbGZPZg0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBQcm9jZWR1cmVGb2NhbERldmljZShkZXZpY2UgTGlzdDxGSElSLlByb2NlZHVyZS5Gb2NhbERldmljZT4pOg0KICBkZXZpY2UgZA0KICByZXR1cm4gRkhJUi5Qcm9jZWR1cmUuRm9jYWxEZXZpY2V7DQogICAgYWN0aW9uOiBkLmFjdGlvbiwNCiAgICBtYW5pcHVsYXRlZDogZC5tYW5pcHVsYXRlZA0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBQcm9jZWR1cmVSZXNvdXJjZShwcm9jZWR1cmUgUHJvY2VkdXJlLCBwcm9maWxlVVJMcyBMaXN0PEZISVIuY2Fub25pY2FsPik6DQogIHByb2NlZHVyZSBwDQogIHJldHVybiBQcm9jZWR1cmV7DQogICAgaWQ6IEZISVIuaWQge3ZhbHVlOiAnTENSLScgKyBwLmlkfSwNCiAgICBtZXRhOiBNZXRhRWxlbWVudChwLCBwcm9maWxlVVJMcyksDQogICAgZXh0ZW5zaW9uOiBwLmV4dGVuc2lvbiwNCiAgICBpbnN0YW50aWF0ZXNDYW5vbmljYWw6IHAuaW5zdGFudGlhdGVzQ2Fub25pY2FsLA0KICAgIGluc3RhbnRpYXRlc1VyaTogcC5pbnN0YW50aWF0ZXNVcmksDQogICAgYmFzZWRPbjogcC5iYXNlZE9uLA0KICAgIHBhcnRPZjogcC5wYXJ0T2YsDQogICAgc3RhdHVzOiBwLnN0YXR1cywNCiAgICBzdGF0dXNSZWFzb246IHAuc3RhdHVzUmVhc29uLA0KICAgIGNhdGVnb3J5OiBwLmNhdGVnb3J5LA0KICAgIGNvZGU6IHAuY29kZSwNCiAgICBzdWJqZWN0OiBwLnN1YmplY3QsDQogICAgZW5jb3VudGVyOiBwLmVuY291bnRlciwNCiAgICBwZXJmb3JtZWQ6IHAucGVyZm9ybWVkLA0KICAgIHJlY29yZGVyOiBwLnJlY29yZGVyLA0KICAgIGFzc2VydGVyOiBwLmFzc2VydGVyLA0KICAgIHBlcmZvcm1lcjogUHJvY2VkdXJlUGVyZm9ybWVyKHAucGVyZm9ybWVyKSwNCiAgICBsb2NhdGlvbjogcC5sb2NhdGlvbiwNCiAgICByZWFzb25Db2RlOiBwLnJlYXNvbkNvZGUsDQogICAgcmVhc29uUmVmZXJlbmNlOiBwLnJlYXNvblJlZmVyZW5jZSwNCiAgICBib2R5U2l0ZTogcC5ib2R5U2l0ZSwNCiAgICBvdXRjb21lOiBwLm91dGNvbWUsDQogICAgcmVwb3J0OiBwLnJlcG9ydCwNCiAgICBjb21wbGljYXRpb246IHAuY29tcGxpY2F0aW9uLA0KICAgIGNvbXBsaWNhdGlvbkRldGFpbDogcC5jb21wbGljYXRpb25EZXRhaWwsDQogICAgZm9sbG93VXA6IHAuZm9sbG93VXAsDQogICAgbm90ZTogcC5ub3RlLA0KICAgIGZvY2FsRGV2aWNlOiBQcm9jZWR1cmVGb2NhbERldmljZShwLmZvY2FsRGV2aWNlKSwNCiAgICB1c2VkUmVmZXJlbmNlOiBwLnVzZWRSZWZlcmVuY2UsDQogICAgdXNlZENvZGU6IHAudXNlZENvZGUNCiAgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gU2VydmljZVJlcXVlc3RSZXNvdXJjZShzZXJ2aWNlUmVxdWVzdCBTZXJ2aWNlUmVxdWVzdCwgcHJvZmlsZVVSTHMgTGlzdDxGSElSLmNhbm9uaWNhbD4pOg0KICBzZXJ2aWNlUmVxdWVzdCBzUg0KICByZXR1cm4gU2VydmljZVJlcXVlc3R7DQogICAgaWQ6IEZISVIuaWQge3ZhbHVlOiAnTENSLScgKyBzUi5pZH0sDQogICAgbWV0YTogTWV0YUVsZW1lbnQoc1IsIHByb2ZpbGVVUkxzKSwNCiAgICBleHRlbnNpb246IHNSLmV4dGVuc2lvbiwNCiAgICBpbnN0YW50aWF0ZXNDYW5vbmljYWw6IHNSLmluc3RhbnRpYXRlc0Nhbm9uaWNhbCwNCiAgICBpbnN0YW50aWF0ZXNVcmk6IHNSLmluc3RhbnRpYXRlc1VyaSwNCiAgICBiYXNlZE9uOiBzUi5iYXNlZE9uLA0KICAgIHJlcGxhY2VzOiBzUi5yZXBsYWNlcywNCiAgICByZXF1aXNpdGlvbjogc1IucmVxdWlzaXRpb24sDQogICAgc3RhdHVzOiBzUi5zdGF0dXMsDQogICAgaW50ZW50OiBzUi5pbnRlbnQsDQogICAgY2F0ZWdvcnk6IHNSLmNhdGVnb3J5LA0KICAgIHByaW9yaXR5OiBzUi5wcmlvcml0eSwNCiAgICBkb05vdFBlcmZvcm06IHNSLmRvTm90UGVyZm9ybSwNCiAgICBjb2RlOiBzUi5jb2RlLA0KICAgIG9yZGVyRGV0YWlsOiBzUi5vcmRlckRldGFpbCwNCiAgICBxdWFudGl0eTogc1IucXVhbnRpdHksDQogICAgc3ViamVjdDogc1Iuc3ViamVjdCwNCiAgICBlbmNvdW50ZXI6IHNSLmVuY291bnRlciwNCiAgICBvY2N1cnJlbmNlOiBzUi5vY2N1cnJlbmNlLA0KICAgIGFzTmVlZGVkOiBzUi5hc05lZWRlZCwNCiAgICBhdXRob3JlZE9uOiBzUi5hdXRob3JlZE9uLA0KICAgIHJlcXVlc3Rlcjogc1IucmVxdWVzdGVyLA0KICAgIHBlcmZvcm1lclR5cGU6IHNSLnBlcmZvcm1lclR5cGUsDQogICAgcGVyZm9ybWVyOiBzUi5wZXJmb3JtZXIsDQogICAgbG9jYXRpb25Db2RlOiBzUi5sb2NhdGlvbkNvZGUsDQogICAgbG9jYXRpb25SZWZlcmVuY2U6IHNSLmxvY2F0aW9uUmVmZXJlbmNlLA0KICAgIHJlYXNvbkNvZGU6IHNSLnJlYXNvbkNvZGUsDQogICAgcmVhc29uUmVmZXJlbmNlOiBzUi5yZWFzb25SZWZlcmVuY2UsDQogICAgaW5zdXJhbmNlOiBzUi5pbnN1cmFuY2UsDQogICAgc3VwcG9ydGluZ0luZm86IHNSLnN1cHBvcnRpbmdJbmZvLA0KICAgIHNwZWNpbWVuOiBzUi5zcGVjaW1lbiwNCiAgICBib2R5U2l0ZTogc1IuYm9keVNpdGUsDQogICAgbm90ZTogc1Iubm90ZSwNCiAgICBwYXRpZW50SW5zdHJ1Y3Rpb246IHNSLnBhdGllbnRJbnN0cnVjdGlvbiwNCiAgICByZWxldmFudEhpc3Rvcnk6IHNSLnJlbGV2YW50SGlzdG9yeQ0KICB9DQoNCmRlZmluZSBmdW5jdGlvbiBTcGVjaW1lbkNvbGxlY3Rpb24oY29sbGVjdGlvbiBGSElSLlNwZWNpbWVuLkNvbGxlY3Rpb24pOg0KICBjb2xsZWN0aW9uIGMNCiAgcmV0dXJuIEZISVIuU3BlY2ltZW4uQ29sbGVjdGlvbnsNCiAgICBjb2xsZWN0b3I6IGMuY29sbGVjdG9yLA0KICAgIGNvbGxlY3RlZDogYy5jb2xsZWN0ZWQsDQogICAgImR1cmF0aW9uIjogYy4iZHVyYXRpb24iLA0KICAgIHF1YW50aXR5OiBjLnF1YW50aXR5LA0KICAgIG1ldGhvZDogYy5tZXRob2QsDQogICAgYm9keVNpdGU6IGMuYm9keVNpdGUsDQogICAgZmFzdGluZ1N0YXR1czogYy5mYXN0aW5nU3RhdHVzDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIFNwZWNpbWVuUHJvY2Vzc2luZyhwcm9jZXNzaW5nIExpc3Q8RkhJUi5TcGVjaW1lbi5Qcm9jZXNzaW5nPik6DQogIHByb2Nlc3NpbmcgcA0KICByZXR1cm4gRkhJUi5TcGVjaW1lbi5Qcm9jZXNzaW5new0KICAgIGRlc2NyaXB0aW9uOiBwLmRlc2NyaXB0aW9uLA0KICAgIHByb2NlZHVyZTogcC5wcm9jZWR1cmUsDQogICAgYWRkaXRpdmU6IHAuYWRkaXRpdmUsDQogICAgdGltZTogcC50aW1lDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIFNwZWNpbWVuQ29udGFpbmVyKGNvbnRhaW5lciBMaXN0PEZISVIuU3BlY2ltZW4uQ29udGFpbmVyPik6DQogIGNvbnRhaW5lciBjDQogIHJldHVybiBGSElSLlNwZWNpbWVuLkNvbnRhaW5lcnsNCiAgICBkZXNjcmlwdGlvbjogYy5kZXNjcmlwdGlvbiwNCiAgICB0eXBlOiBjLnR5cGUsDQogICAgY2FwYWNpdHk6IGMuY2FwYWNpdHksDQogICAgc3BlY2ltZW5RdWFudGl0eTogYy5zcGVjaW1lblF1YW50aXR5LA0KICAgIGFkZGl0aXZlOiBjLmFkZGl0aXZlDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIFNwZWNpbWVuUmVzb3VyY2Uoc3BlY2ltZW4gU3BlY2ltZW4sIHByb2ZpbGVVUkxzIExpc3Q8RkhJUi5jYW5vbmljYWw+KToNCiAgc3BlY2ltZW4gcw0KICByZXR1cm4gU3BlY2ltZW57DQogICAgaWQ6IEZISVIuaWQge3ZhbHVlOiAnTENSLScgKyBzLmlkfSwNCiAgICBtZXRhOiBNZXRhRWxlbWVudChzLCBwcm9maWxlVVJMcyksDQogICAgZXh0ZW5zaW9uOiBzLmV4dGVuc2lvbiwNCiAgICBpZGVudGlmaWVyOiBzLmlkZW50aWZpZXIsDQogICAgYWNjZXNzaW9uSWRlbnRpZmllcjogcy5hY2Nlc3Npb25JZGVudGlmaWVyLA0KICAgIHN0YXR1czogcy5zdGF0dXMsDQogICAgdHlwZTogcy50eXBlLA0KICAgIHN1YmplY3Q6IHMuc3ViamVjdCwNCiAgICByZWNlaXZlZFRpbWU6IHMucmVjZWl2ZWRUaW1lLA0KICAgIHBhcmVudDogcy5wYXJlbnQsDQogICAgcmVxdWVzdDogcy5yZXF1ZXN0LA0KICAgIGNvbGxlY3Rpb246IFNwZWNpbWVuQ29sbGVjdGlvbihzLmNvbGxlY3Rpb24pLA0KICAgIHByb2Nlc3Npbmc6IFNwZWNpbWVuUHJvY2Vzc2luZyhzLnByb2Nlc3NpbmcpLA0KICAgIGNvbnRhaW5lcjogU3BlY2ltZW5Db250YWluZXIocy5jb250YWluZXIpLA0KICAgIGNvbmRpdGlvbjogcy5jb25kaXRpb24sDQogICAgbm90ZTogcy5ub3RlDQogIH0NCg0KZGVmaW5lIGZ1bmN0aW9uICJPcGVyYXRpb25PdXRjb21lUmVzb3VyY2UiKGVycm9ySWQgU3RyaW5nLCByZXNvdXJjZUlkIEZISVIuaWQsIG1lc3NhZ2UgU3RyaW5nKToNCiAgT3BlcmF0aW9uT3V0Y29tZXsNCiAgICAgIGlkOiBGSElSLmlke3ZhbHVlOiBlcnJvcklkfSwNCiAgICAgIGlzc3VlOiB7DQogICAgICAgICAgRkhJUi5PcGVyYXRpb25PdXRjb21lLklzc3Vlew0KICAgICAgICAgIHNldmVyaXR5OiBGSElSLklzc3VlU2V2ZXJpdHl7dmFsdWU6ICdlcnJvcid9LA0KICAgICAgICAgIGNvZGU6IEZISVIuSXNzdWVUeXBle3ZhbHVlOiAnZXhjZXB0aW9uJ30sDQogICAgICAgICAgZGV0YWlsczogDQogICAgICAgICAgICAgIEZISVIuQ29kZWFibGVDb25jZXB0ew0KICAgICAgICAgICAgICAgICAgY29kaW5nOiB7DQogICAgICAgICAgICAgICAgICAgICAgQ29kaW5new0KICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbTogdXJpe3ZhbHVlOiAnaHR0cHM6Ly9sYW50YW5hZ3JvdXAuY29tL3ZhbGlkYXRpb24tZXJyb3InfSwNCiAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBjb2Rle3ZhbHVlOiAnRXJyb3InfSwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBzdHJpbmd7dmFsdWU6ICdSZXNvdXJjZSAnICsgcmVzb3VyY2VJZCArICcgZmFpbGVkIHZhbGlkYXRpb246ICcgKyBtZXNzYWdlfQ0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgIH0NCiAgfQ=="^^xsd:base64Binary ]
  ] ) . #