dQM CMS Content Implementation Guide
2026.1.0 - CI Build
dQM CMS Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2026.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-2026/ and changes regularly. See the Directory of published versions
| Page standards status: Informative | Maturity Level: 1 |
{
"resourceType" : "Library",
"id" : "HOB",
"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<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Title</th>\n\n\n\n<td class=\"content-container\">HOB Elements and Logic</td>\n\n\n</tr>\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\">2026.1.0</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<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Experimental</th>\n\n\n\n<td class=\"content-container\">true</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Topic</th>\n\n\n\n<td class=\"content-container\">FHIR\n</td>\n\n\n</tr>\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Topic</th>\n\n\n\n<td class=\"content-container\">CQL\n</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\">Description</th>\n\n\n\n<td class=\"content-container\"><div><p>DRAFT Data elements used in the calculation of Hospital-onset Bacteremia and Fungemia measures.</p>\n</div></td>\n\n\n</tr>\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.5.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\">/*\nDraft CQL representation of Hospital Onset Bacteremia and Fungemia Surveillance Measure\n*/\nlibrary HOB\n\nusing USQualityCore version '0.5.0'\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\n\ninclude CQMConcepts version '0.5.000' called CQMConcepts\ninclude CQMElements version '0.5.000' called CQMElements\ninclude HOBOrganismTaxonomy\n\nvalueset "Bacteria and Fungi - HOB Specific": 'https://example.org/fhir/ValueSet/bacteria-and-fungi-hob-specific'\nvalueset "Bacterial Skin Commensals": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.24.7.281' version '20240918' // Was 20241003, verify\nvalueset "Community-associated Organisms - HOB Specific": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.24.7.1170' version '20250930'\nvalueset "Bacterial and Fungal Blood Culture Tests": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1190.63' version '20220721'\nvalueset "Enteral Medication Route": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1190.74' version '20240618'\nvalueset "Intravenous Medication Route": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1190.75' version '20240618'\nvalueset "Specimen Type - Blood": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.24.7.315' version '20250929'\nvalueset "Absolute Neutrophils": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.24.7.1173' version '20250913'\nvalueset "Antimicrobial Medications - I.V Antibacterials": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.24.7.1220' version '20260122'\nvalueset "Antimicrobial Medications - Oral Antibacterials": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.24.7.1220' version '20250813'\nvalueset "Antimicrobials for Bacteremia and Fungemia Surveillance Module": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.24.7.1220' version '20260205'\n\nparameter "Measurement Period" Interval<DateTime> \n default Interval[@2026-01-01T00:00:00.0, @2026-01-31T23:59:59.999]\n\ncontext Patient\n\ndefine "Bacterial and Fungal Blood Culture Test Results":\n [USQualityCore.LaboratoryResultObservation: "Bacterial and Fungal Blood Culture Tests"] O\n where O.isResulted()\n\ndefine "Blood Specimen":\n [USCore.SpecimenProfile: "Specimen Type - Blood"] S\n where S.status = 'available'\n\ndefine "Bacteremia or Fungemia Result":\n "Bacterial and Fungal Blood Culture Test Results" R\n where ((R.value as CodeableConcept) in "Bacteria and Fungi - HOB Specific")\n and not ((R.value as CodeableConcept) in "Bacterial Skin Commensals")\n\ndefine "Bacteremia or Fungemia Result With Specimen":\n "Bacteremia or Fungemia Result" R\n let specimen: singleton from ("Blood Specimen" S where R.specimen.references(S))\n return {\n result: R,\n specimen: specimen\n }\n\n/*\n@description: Returns the specimen collection time if available, falling back to the effective time\n@comment: Note that specimen collection time is not a USCI+Qualtiy or USCDI element\n*/\ndefine fluent function collectionTime(\n resultWithSpecimen Tuple { \n result USQualityCore.LaboratoryResultObservation, \n specimen USCore.SpecimenProfile\n }\n):\n Coalesce(\n resultWithSpecimen.specimen.collection.collected.toInterval(), \n resultWithSpecimen.result.effective.toInterval()\n )\n\n// TODO: Consider this IP:\n// https://measures-ci.nhsnlink.org/Library-NHSNAcuteCareHospitalMonthlyInitialPopulation.html\n\n// TODO: Consider "Outpatient Surgery Encounter"?\ndefine "Hospital Stays":\n CQMElements."Hospitalization Encounters"(\n CQMElements."Inpatient Encounter"\n union CQMElements."Emergency Department Encounter"\n union CQMElements."Observation Encounter"\n )\n\ndefine "Inpatient Encounter":\n "Hospital Stays" Stay\n where Stay.type in CQMConcepts."Encounter Inpatient"\n\ndefine "Outpatient Encounter":\n "Hospital Stays"\n except "Inpatient Encounter"\n\n/*\nAn O-COB event occurs when a patient has a bacterial or fungal organism identified \nfrom a blood culture performed on a blood specimen collected during an ED/Observation-only \nHospital Stay that does not include an inpatient admission.\n*/\ndefine "O-COB Event":\n "Outpatient Encounter" E\n let results: (\n "Bacteremia or Fungemia Result With Specimen" RS \n where RS.collectionTime() during E.hospitalization()\n )\n where exists (results)\n return {\n encounter: E,\n indexDate: Min(results R return start of R.collectionTime()),\n organisms: results R return R.result.value as CodeableConcept\n }\n\n/*\n@description: Returns the community onset window, hospital days 1 to 3\n*/\ndefine fluent function communityOnsetWindow(encounter USQualityCore.Encounter):\n encounter.hospitalization().hospitalDays(1, 3)\n\n/*\nA COB event occurs when a patient has a bacterial or fungal organism identified from a blood \nculture performed on a blood specimen collected on Hospital Stay days 1 through 3 of a Hospital \nStay that includes an inpatient admission.\n*/\ndefine "COB Event":\n "Inpatient Encounter" E\n let results: (\n "Bacteremia or Fungemia Result With Specimen" RS\n where RS.collectionTime() during E.hospitalization().hospitalDays(1, 3)\n )\n where exists (results)\n return {\n encounter: E,\n indexDate: Min(results R return start of R.collectionTime()),\n organisms: results R return R.result.value as CodeableConcept\n }\n\n/*\n@description: Returns the hospital onset window, hospital day 4 to the end of the hospitalization\n*/\ndefine fluent function hospitalOnsetWindow(encounter USQualityCore.Encounter):\n (encounter.hospitalization()) H\n let day4Start: DateTimeWithSamePrecision(date from start of H + 3 days, start of H)\n return if day4Start <= H.high then Interval[start of H.hospitalDay(4), H.high] else null\n \n/*\nAn HOB event occurs when a patient has a bacterial or fungal organism identified from a blood\nculture performed on a blood specimen collected on Hospital Stay day 4 or later of a Hospital \nStay that includes an inpatient admission.\n*/\ndefine "HOB Event":\n "Inpatient Encounter" E\n let \n COB: singleton from ("COB Event" COBEvent where E.id = COBEvent.encounter.id),\n results: (\n "Bacteremia or Fungemia Result With Specimen" RS\n where RS.collectionTime() during E.hospitalOnsetWindow()\n and not exists (\n COB.organisms O\n where O.organismMatches(RS.result.value as CodeableConcept)\n )\n )\n where exists (results)\n return {\n encounter: E,\n indexDate: Min(results R return start of R.collectionTime()),\n organisms: results R return R.result.value as CodeableConcept\n }\n\n/*\nMetric: O-COB Prevalence Rate\nScoring: Proportion\nNumerator: Number of outpatient O-COB events occurring within the measurement period\nDenominator: Number of outpatient (ED/OBS) encounters occurring within the measurement period\n*/\n\ndefine "Outpatient Encounter During Measurement Period":\n "Outpatient Encounter" O\n where O.hospitalization() overlaps "Measurement Period"\n\ndefine "O-COB Prevalence Rate Initial Population":\n "Outpatient Encounter During Measurement Period"\n\ndefine "O-COB Prevalence Rate Denominator":\n "Outpatient Encounter During Measurement Period"\n\ndefine "O-COB Prevlanece Rate Numerator":\n "O-COB Event" OCOBEvent\n where OCOBEvent.indexDate during "Measurement Period"\n return OCOBEvent.encounter\n\n/*\nMetric: Inpatient COB Prevalence Rate\nScoring: Proportion\nNumerator: Number of inpatient COB events occurring within the measurement period\nDenominator: Number of inpatient stays where at least one of the first three inpatient calendar days falls within the measurement period\n*/\n\ndefine "Community Eligible Inpatient Encounter During Measurement Period":\n "Inpatient Encounter" I\n where I.communityOnsetWindow() overlaps "Measurement Period"\n\ndefine "COB Prevalence Rate Initial Population":\n "Community Eligible Inpatient Encounter During Measurement Period"\n\ndefine "COB Prevalence Rate Denominator":\n "Community Eligible Inpatient Encounter During Measurement Period"\n\ndefine "COB Prevalence Rate Numerator":\n "COB Event" COBEvent\n where COBEvent.indexDate during "Measurement Period"\n return COBEvent.encounter\n\n/*\nMetric: HOB Crude Risk\nScoring: Proportion\nNumerator: Number of inpatient stays with at least one HOB event occurring within the measurement period\nDenominator: Number of inpatient stays where there are any inpatient days eligible for a hosptial-onset event during the measurement period\nNotes: The denominator for HOB admission risk will include only those inpatient stays who were eligible for an HOB event in the measurement period: \n 1. Stays where day 4 (or later) of their admission occurred during the measurement period. \n 2. If an event occurs, then a stay will not be included in the denominator of subsequent measurement periods.\n*/\n\ndefine "Hospital Eligible Inpatient Encounter During Measurement Period":\n "Inpatient Encounter" I\n where I.hospitalOnsetWindow() overlaps "Measurement Period"\n and not exists (\n "HOB Event" HOBEvent\n where HOBEvent.encounter.id = I.id\n and HOBEvent.indexDate before start of "Measurement Period"\n )\n\ndefine "HOB Crude Risk Initial Population":\n "Hospital Eligible Inpatient Encounter During Measurement Period"\n\ndefine "HOB Crude Risk Denominator":\n "Hospital Eligible Inpatient Encounter During Measurement Period"\n\ndefine "HOB Crude Risk Numerator":\n "HOB Event" HOBEvent\n where HOBEvent.indexDate during "Measurement Period"\n return HOBEvent.encounter\n\n/*\nMetric: HOB Incidence Density\nScoring: Ratio /100.d\nNumerator: Number of HOB events\nDenominator: Number of inpatient days eligible for a hospital-onset event during the measurement period\nNotes: Eligible patient days are defined as: Inpatient day 4 until discharge or index HOB event date\n*/\n\ndefine "HOB Incidence Density Initial Population":\n "Hospital Eligible Inpatient Encounter During Measurement Period"\n\ndefine "HOB Incidence Density Denominator":\n "Hospital Eligible Inpatient Encounter During Measurement Period"\n\ndefine function "HOB Incidence Density Denominator Observation"(encounter USQualityCore.Encounter):\n days between start of encounter.hospitalOnsetWindow()\n and Min({\n ("HOB Event" HOBEvent where HOBEvent.encounter.id = encounter.id).single().indexDate,\n end of encounter.period\n })\n\ndefine "HOB Incidence Density Numerator":\n "HOB Event" HOBEvent\n where HOBEvent.indexDate during "Measurement Period"\n return HOBEvent.encounter\n\n// Just counting, so return 1\ndefine function "HOB Incidence Density Numerator Observation"(encounter USQualityCore.Encounter):\n 1\n\n/*\n@description: Returns a DateTime constructed with the same precision as\nthe given date time. This is effectively a ToDateTime operation but setting\nthe time components to 0 (i.e. starting at midnight on the given date)\n@comment: Proposed for inclusion in CQMConcepts\n*/\ndefine function DateTimeWithSamePrecision(_date Date, _dateTime DateTime):\n DateTime(\n year from _date,\n month from _date,\n day from _date,\n if hour from _dateTime is not null then 0 else null,\n if minute from _dateTime is not null then 0 else null,\n if second from _dateTime is not null then 0 else null\n )\n\n/*\n@description: Returns the interval of time covering the given hospital day\n@comment: The interval will be a full day unless it is the first or last day\nof the hospital stay, in which case it will start or end with the hospitalization\nstart or end.\n\nNOTE: Proposed for inclusion in CQMConcepts\n*/\ndefine fluent function hospitalDay(hospitalization Interval<DateTime>, dayNumber Integer):\n hospitalization H\n let \n hospitalDate: date from start of H + ((dayNumber - 1) * 1 day),\n hospitalDateTime: DateTimeWithSamePrecision(hospitalDate, start of H)\n return Interval[\n Max({ start of H, hospitalDateTime }),\n Min({ hospitalDateTime + 1 day, H.high })\n )\n\n/*\n@description: Returns the interval of time covering the given hospital days\n@comment: The interval will start at midnight on the starting day, unless it is\nthe first day, in which case it will start with the hospitalization start. The\ninterval will end just before midnight on the ending day, unless it is the last\nday or later, in which case it will end with the hospitalization end.\n\nNOTE: Proposed for inclusion in CQMConcepts\n*/\ndefine fluent function hospitalDays(hospitalization Interval<DateTime>, startDayNumber Integer, endDayNumber Integer):\n hospitalization H\n let \n hospitalDate: date from start of H + ((startDayNumber - 1) * 1 day),\n hospitalDateTime: DateTimeWithSamePrecision(hospitalDate, start of H),\n numberOfDays: (endDayNumber - startDayNumber) + 1\n return Interval[\n Max({ start of H, hospitalDateTime }),\n Min({ hospitalDateTime + (numberOfDays * 1 day), H.high })\n )\n \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/StructureDefinition/structuredefinition-fmm",
"valueInteger" : 1
},
{
"url" : "http://hl7.org/fhir/StructureDefinition/structuredefinition-wg",
"valueCode" : "cds"
},
{
"url" : "http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status",
"valueCode" : "informative"
}
],
"url" : "https://madie.cms.gov/Library/HOB",
"version" : "2026.1.0",
"name" : "HOB",
"title" : "HOB Elements and Logic",
"status" : "draft",
"experimental" : true,
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/library-type",
"code" : "logic-library"
}
]
},
"date" : "2026-11-03T15:45:35+00:00",
"description" : "DRAFT Data elements used in the calculation of Hospital-onset Bacteremia and Fungemia measures.",
"topic" : [
{
"text" : "FHIR"
},
{
"text" : "CQL"
}
],
"content" : [
{
"contentType" : "text/cql",
"data" : "LyoKRHJhZnQgQ1FMIHJlcHJlc2VudGF0aW9uIG9mIEhvc3BpdGFsIE9uc2V0IEJhY3RlcmVtaWEgYW5kIEZ1bmdlbWlhIFN1cnZlaWxsYW5jZSBNZWFzdXJlCiovCmxpYnJhcnkgSE9CCgp1c2luZyBVU1F1YWxpdHlDb3JlIHZlcnNpb24gJzAuNS4wJwp1c2luZyBVU0NvcmUgdmVyc2lvbiAnNi4xLjAtZGVyaXZlZCcKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4xJyBjYWxsZWQgRkhJUkhlbHBlcnMKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkNvbW1vbiB2ZXJzaW9uICcyLjAuMCcgY2FsbGVkIEZISVJDb21tb24KCmluY2x1ZGUgQ1FNQ29uY2VwdHMgdmVyc2lvbiAnMC41LjAwMCcgY2FsbGVkIENRTUNvbmNlcHRzCmluY2x1ZGUgQ1FNRWxlbWVudHMgdmVyc2lvbiAnMC41LjAwMCcgY2FsbGVkIENRTUVsZW1lbnRzCmluY2x1ZGUgSE9CT3JnYW5pc21UYXhvbm9teQoKdmFsdWVzZXQgIkJhY3RlcmlhIGFuZCBGdW5naSAtIEhPQiBTcGVjaWZpYyI6ICdodHRwczovL2V4YW1wbGUub3JnL2ZoaXIvVmFsdWVTZXQvYmFjdGVyaWEtYW5kLWZ1bmdpLWhvYi1zcGVjaWZpYycKdmFsdWVzZXQgIkJhY3RlcmlhbCBTa2luIENvbW1lbnNhbHMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTE0MjIyLjI0LjcuMjgxJyB2ZXJzaW9uICcyMDI0MDkxOCcgLy8gV2FzIDIwMjQxMDAzLCB2ZXJpZnkKdmFsdWVzZXQgIkNvbW11bml0eS1hc3NvY2lhdGVkIE9yZ2FuaXNtcyAtIEhPQiBTcGVjaWZpYyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTQyMjIuMjQuNy4xMTcwJyB2ZXJzaW9uICcyMDI1MDkzMCcKdmFsdWVzZXQgIkJhY3RlcmlhbCBhbmQgRnVuZ2FsIEJsb29kIEN1bHR1cmUgVGVzdHMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTkwLjYzJyB2ZXJzaW9uICcyMDIyMDcyMScKdmFsdWVzZXQgIkVudGVyYWwgTWVkaWNhdGlvbiBSb3V0ZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExOTAuNzQnIHZlcnNpb24gJzIwMjQwNjE4Jwp2YWx1ZXNldCAiSW50cmF2ZW5vdXMgTWVkaWNhdGlvbiBSb3V0ZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExOTAuNzUnIHZlcnNpb24gJzIwMjQwNjE4Jwp2YWx1ZXNldCAiU3BlY2ltZW4gVHlwZSAtIEJsb29kIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExNDIyMi4yNC43LjMxNScgdmVyc2lvbiAnMjAyNTA5MjknCnZhbHVlc2V0ICJBYnNvbHV0ZSBOZXV0cm9waGlscyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTQyMjIuMjQuNy4xMTczJyB2ZXJzaW9uICcyMDI1MDkxMycKdmFsdWVzZXQgIkFudGltaWNyb2JpYWwgTWVkaWNhdGlvbnMgLSBJLlYgQW50aWJhY3RlcmlhbHMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTE0MjIyLjI0LjcuMTIyMCcgdmVyc2lvbiAnMjAyNjAxMjInCnZhbHVlc2V0ICJBbnRpbWljcm9iaWFsIE1lZGljYXRpb25zIC0gT3JhbCBBbnRpYmFjdGVyaWFscyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTQyMjIuMjQuNy4xMjIwJyB2ZXJzaW9uICcyMDI1MDgxMycKdmFsdWVzZXQgIkFudGltaWNyb2JpYWxzIGZvciBCYWN0ZXJlbWlhIGFuZCBGdW5nZW1pYSBTdXJ2ZWlsbGFuY2UgTW9kdWxlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExNDIyMi4yNC43LjEyMjAnIHZlcnNpb24gJzIwMjYwMjA1JwoKcGFyYW1ldGVyICJNZWFzdXJlbWVudCBQZXJpb2QiIEludGVydmFsPERhdGVUaW1lPiAKICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAsIEAyMDI2LTAxLTMxVDIzOjU5OjU5Ljk5OV0KCmNvbnRleHQgUGF0aWVudAoKZGVmaW5lICJCYWN0ZXJpYWwgYW5kIEZ1bmdhbCBCbG9vZCBDdWx0dXJlIFRlc3QgUmVzdWx0cyI6CiAgW1VTUXVhbGl0eUNvcmUuTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uOiAiQmFjdGVyaWFsIGFuZCBGdW5nYWwgQmxvb2QgQ3VsdHVyZSBUZXN0cyJdIE8KICAgIHdoZXJlIE8uaXNSZXN1bHRlZCgpCgpkZWZpbmUgIkJsb29kIFNwZWNpbWVuIjoKICBbVVNDb3JlLlNwZWNpbWVuUHJvZmlsZTogIlNwZWNpbWVuIFR5cGUgLSBCbG9vZCJdIFMKICAgIHdoZXJlIFMuc3RhdHVzID0gJ2F2YWlsYWJsZScKCmRlZmluZSAiQmFjdGVyZW1pYSBvciBGdW5nZW1pYSBSZXN1bHQiOgogICJCYWN0ZXJpYWwgYW5kIEZ1bmdhbCBCbG9vZCBDdWx0dXJlIFRlc3QgUmVzdWx0cyIgUgogICAgd2hlcmUgKChSLnZhbHVlIGFzIENvZGVhYmxlQ29uY2VwdCkgaW4gIkJhY3RlcmlhIGFuZCBGdW5naSAtIEhPQiBTcGVjaWZpYyIpCiAgICAgIGFuZCBub3QgKChSLnZhbHVlIGFzIENvZGVhYmxlQ29uY2VwdCkgaW4gIkJhY3RlcmlhbCBTa2luIENvbW1lbnNhbHMiKQoKZGVmaW5lICJCYWN0ZXJlbWlhIG9yIEZ1bmdlbWlhIFJlc3VsdCBXaXRoIFNwZWNpbWVuIjoKICAiQmFjdGVyZW1pYSBvciBGdW5nZW1pYSBSZXN1bHQiIFIKICAgIGxldCBzcGVjaW1lbjogc2luZ2xldG9uIGZyb20gKCJCbG9vZCBTcGVjaW1lbiIgUyB3aGVyZSBSLnNwZWNpbWVuLnJlZmVyZW5jZXMoUykpCiAgICByZXR1cm4gewogICAgICByZXN1bHQ6IFIsCiAgICAgIHNwZWNpbWVuOiBzcGVjaW1lbgogICAgfQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBzcGVjaW1lbiBjb2xsZWN0aW9uIHRpbWUgaWYgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGVmZmVjdGl2ZSB0aW1lCkBjb21tZW50OiBOb3RlIHRoYXQgc3BlY2ltZW4gY29sbGVjdGlvbiB0aW1lIGlzIG5vdCBhIFVTQ0krUXVhbHRpeSBvciBVU0NESSBlbGVtZW50CiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gY29sbGVjdGlvblRpbWUoCiAgcmVzdWx0V2l0aFNwZWNpbWVuIFR1cGxlIHsgCiAgICByZXN1bHQgVVNRdWFsaXR5Q29yZS5MYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24sIAogICAgc3BlY2ltZW4gVVNDb3JlLlNwZWNpbWVuUHJvZmlsZQogIH0KKToKICBDb2FsZXNjZSgKICAgIHJlc3VsdFdpdGhTcGVjaW1lbi5zcGVjaW1lbi5jb2xsZWN0aW9uLmNvbGxlY3RlZC50b0ludGVydmFsKCksIAogICAgcmVzdWx0V2l0aFNwZWNpbWVuLnJlc3VsdC5lZmZlY3RpdmUudG9JbnRlcnZhbCgpCiAgKQoKLy8gVE9ETzogQ29uc2lkZXIgdGhpcyBJUDoKLy8gaHR0cHM6Ly9tZWFzdXJlcy1jaS5uaHNubGluay5vcmcvTGlicmFyeS1OSFNOQWN1dGVDYXJlSG9zcGl0YWxNb250aGx5SW5pdGlhbFBvcHVsYXRpb24uaHRtbAoKLy8gVE9ETzogQ29uc2lkZXIgIk91dHBhdGllbnQgU3VyZ2VyeSBFbmNvdW50ZXIiPwpkZWZpbmUgIkhvc3BpdGFsIFN0YXlzIjoKICBDUU1FbGVtZW50cy4iSG9zcGl0YWxpemF0aW9uIEVuY291bnRlcnMiKAogICAgQ1FNRWxlbWVudHMuIklucGF0aWVudCBFbmNvdW50ZXIiCiAgICAgIHVuaW9uIENRTUVsZW1lbnRzLiJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBFbmNvdW50ZXIiCiAgICAgIHVuaW9uIENRTUVsZW1lbnRzLiJPYnNlcnZhdGlvbiBFbmNvdW50ZXIiCiAgKQoKZGVmaW5lICJJbnBhdGllbnQgRW5jb3VudGVyIjoKICAiSG9zcGl0YWwgU3RheXMiIFN0YXkKICAgIHdoZXJlIFN0YXkudHlwZSBpbiBDUU1Db25jZXB0cy4iRW5jb3VudGVyIElucGF0aWVudCIKCmRlZmluZSAiT3V0cGF0aWVudCBFbmNvdW50ZXIiOgogICJIb3NwaXRhbCBTdGF5cyIKICAgIGV4Y2VwdCAiSW5wYXRpZW50IEVuY291bnRlciIKCi8qCkFuIE8tQ09CIGV2ZW50IG9jY3VycyB3aGVuIGEgcGF0aWVudCBoYXMgYSBiYWN0ZXJpYWwgb3IgZnVuZ2FsIG9yZ2FuaXNtIGlkZW50aWZpZWQgCmZyb20gYSBibG9vZCBjdWx0dXJlIHBlcmZvcm1lZCBvbiBhIGJsb29kIHNwZWNpbWVuIGNvbGxlY3RlZCBkdXJpbmcgYW4gRUQvT2JzZXJ2YXRpb24tb25seSAKSG9zcGl0YWwgU3RheSB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYW4gaW5wYXRpZW50IGFkbWlzc2lvbi4KKi8KZGVmaW5lICJPLUNPQiBFdmVudCI6CiAgIk91dHBhdGllbnQgRW5jb3VudGVyIiBFCiAgICBsZXQgcmVzdWx0czogKAogICAgICAiQmFjdGVyZW1pYSBvciBGdW5nZW1pYSBSZXN1bHQgV2l0aCBTcGVjaW1lbiIgUlMgCiAgICAgICAgd2hlcmUgUlMuY29sbGVjdGlvblRpbWUoKSBkdXJpbmcgRS5ob3NwaXRhbGl6YXRpb24oKQogICAgKQogICAgd2hlcmUgZXhpc3RzIChyZXN1bHRzKQogICAgcmV0dXJuIHsKICAgICAgZW5jb3VudGVyOiBFLAogICAgICBpbmRleERhdGU6IE1pbihyZXN1bHRzIFIgcmV0dXJuIHN0YXJ0IG9mIFIuY29sbGVjdGlvblRpbWUoKSksCiAgICAgIG9yZ2FuaXNtczogcmVzdWx0cyBSIHJldHVybiBSLnJlc3VsdC52YWx1ZSBhcyBDb2RlYWJsZUNvbmNlcHQKICAgIH0KCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgY29tbXVuaXR5IG9uc2V0IHdpbmRvdywgaG9zcGl0YWwgZGF5cyAxIHRvIDMKKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBjb21tdW5pdHlPbnNldFdpbmRvdyhlbmNvdW50ZXIgVVNRdWFsaXR5Q29yZS5FbmNvdW50ZXIpOgogIGVuY291bnRlci5ob3NwaXRhbGl6YXRpb24oKS5ob3NwaXRhbERheXMoMSwgMykKCi8qCkEgQ09CIGV2ZW50IG9jY3VycyB3aGVuIGEgcGF0aWVudCBoYXMgYSBiYWN0ZXJpYWwgb3IgZnVuZ2FsIG9yZ2FuaXNtIGlkZW50aWZpZWQgZnJvbSBhIGJsb29kIApjdWx0dXJlIHBlcmZvcm1lZCBvbiBhIGJsb29kIHNwZWNpbWVuIGNvbGxlY3RlZCBvbiBIb3NwaXRhbCBTdGF5IGRheXMgMSB0aHJvdWdoIDMgb2YgYSBIb3NwaXRhbCAKU3RheSB0aGF0IGluY2x1ZGVzIGFuIGlucGF0aWVudCBhZG1pc3Npb24uCiovCmRlZmluZSAiQ09CIEV2ZW50IjoKICAiSW5wYXRpZW50IEVuY291bnRlciIgRQogICAgbGV0IHJlc3VsdHM6ICgKICAgICAgIkJhY3RlcmVtaWEgb3IgRnVuZ2VtaWEgUmVzdWx0IFdpdGggU3BlY2ltZW4iIFJTCiAgICAgICAgd2hlcmUgUlMuY29sbGVjdGlvblRpbWUoKSBkdXJpbmcgRS5ob3NwaXRhbGl6YXRpb24oKS5ob3NwaXRhbERheXMoMSwgMykKICAgICkKICAgIHdoZXJlIGV4aXN0cyAocmVzdWx0cykKICAgIHJldHVybiB7CiAgICAgIGVuY291bnRlcjogRSwKICAgICAgaW5kZXhEYXRlOiBNaW4ocmVzdWx0cyBSIHJldHVybiBzdGFydCBvZiBSLmNvbGxlY3Rpb25UaW1lKCkpLAogICAgICBvcmdhbmlzbXM6IHJlc3VsdHMgUiByZXR1cm4gUi5yZXN1bHQudmFsdWUgYXMgQ29kZWFibGVDb25jZXB0CiAgICB9CgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgdGhlIGhvc3BpdGFsIG9uc2V0IHdpbmRvdywgaG9zcGl0YWwgZGF5IDQgdG8gdGhlIGVuZCBvZiB0aGUgaG9zcGl0YWxpemF0aW9uCiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaG9zcGl0YWxPbnNldFdpbmRvdyhlbmNvdW50ZXIgVVNRdWFsaXR5Q29yZS5FbmNvdW50ZXIpOgogIChlbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uKCkpIEgKICAgIGxldCBkYXk0U3RhcnQ6IERhdGVUaW1lV2l0aFNhbWVQcmVjaXNpb24oZGF0ZSBmcm9tIHN0YXJ0IG9mIEggKyAzIGRheXMsIHN0YXJ0IG9mIEgpCiAgICByZXR1cm4gaWYgZGF5NFN0YXJ0IDw9IEguaGlnaCB0aGVuIEludGVydmFsW3N0YXJ0IG9mIEguaG9zcGl0YWxEYXkoNCksIEguaGlnaF0gZWxzZSBudWxsCiAgCi8qCkFuIEhPQiBldmVudCBvY2N1cnMgd2hlbiBhIHBhdGllbnQgaGFzIGEgYmFjdGVyaWFsIG9yIGZ1bmdhbCBvcmdhbmlzbSBpZGVudGlmaWVkIGZyb20gYSBibG9vZApjdWx0dXJlIHBlcmZvcm1lZCBvbiBhIGJsb29kIHNwZWNpbWVuIGNvbGxlY3RlZCBvbiBIb3NwaXRhbCBTdGF5IGRheSA0IG9yIGxhdGVyIG9mIGEgSG9zcGl0YWwgClN0YXkgdGhhdCBpbmNsdWRlcyBhbiBpbnBhdGllbnQgYWRtaXNzaW9uLgoqLwpkZWZpbmUgIkhPQiBFdmVudCI6CiAgIklucGF0aWVudCBFbmNvdW50ZXIiIEUKICAgIGxldCAKICAgICAgQ09COiBzaW5nbGV0b24gZnJvbSAoIkNPQiBFdmVudCIgQ09CRXZlbnQgd2hlcmUgRS5pZCA9IENPQkV2ZW50LmVuY291bnRlci5pZCksCiAgICAgIHJlc3VsdHM6ICgKICAgICAgICAiQmFjdGVyZW1pYSBvciBGdW5nZW1pYSBSZXN1bHQgV2l0aCBTcGVjaW1lbiIgUlMKICAgICAgICAgIHdoZXJlIFJTLmNvbGxlY3Rpb25UaW1lKCkgZHVyaW5nIEUuaG9zcGl0YWxPbnNldFdpbmRvdygpCiAgICAgICAgICAgIGFuZCBub3QgZXhpc3RzICgKICAgICAgICAgICAgICBDT0Iub3JnYW5pc21zIE8KICAgICAgICAgICAgICAgIHdoZXJlIE8ub3JnYW5pc21NYXRjaGVzKFJTLnJlc3VsdC52YWx1ZSBhcyBDb2RlYWJsZUNvbmNlcHQpCiAgICAgICAgICAgICkKICAgICkKICAgIHdoZXJlIGV4aXN0cyAocmVzdWx0cykKICAgIHJldHVybiB7CiAgICAgIGVuY291bnRlcjogRSwKICAgICAgaW5kZXhEYXRlOiBNaW4ocmVzdWx0cyBSIHJldHVybiBzdGFydCBvZiBSLmNvbGxlY3Rpb25UaW1lKCkpLAogICAgICBvcmdhbmlzbXM6IHJlc3VsdHMgUiByZXR1cm4gUi5yZXN1bHQudmFsdWUgYXMgQ29kZWFibGVDb25jZXB0CiAgICB9CgovKgpNZXRyaWM6IE8tQ09CIFByZXZhbGVuY2UgUmF0ZQpTY29yaW5nOiBQcm9wb3J0aW9uCk51bWVyYXRvcjogTnVtYmVyIG9mIG91dHBhdGllbnQgTy1DT0IgZXZlbnRzIG9jY3VycmluZyB3aXRoaW4gdGhlIG1lYXN1cmVtZW50IHBlcmlvZApEZW5vbWluYXRvcjogTnVtYmVyIG9mIG91dHBhdGllbnQgKEVEL09CUykgZW5jb3VudGVycyBvY2N1cnJpbmcgd2l0aGluIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QKKi8KCmRlZmluZSAiT3V0cGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgIk91dHBhdGllbnQgRW5jb3VudGVyIiBPCiAgICB3aGVyZSBPLmhvc3BpdGFsaXphdGlvbigpIG92ZXJsYXBzICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIk8tQ09CIFByZXZhbGVuY2UgUmF0ZSBJbml0aWFsIFBvcHVsYXRpb24iOgogICJPdXRwYXRpZW50IEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIgoKZGVmaW5lICJPLUNPQiBQcmV2YWxlbmNlIFJhdGUgRGVub21pbmF0b3IiOgogICJPdXRwYXRpZW50IEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIgoKZGVmaW5lICJPLUNPQiBQcmV2bGFuZWNlIFJhdGUgTnVtZXJhdG9yIjoKICAiTy1DT0IgRXZlbnQiIE9DT0JFdmVudAogICAgd2hlcmUgT0NPQkV2ZW50LmluZGV4RGF0ZSBkdXJpbmcgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgIHJldHVybiBPQ09CRXZlbnQuZW5jb3VudGVyCgovKgpNZXRyaWM6IElucGF0aWVudCBDT0IgUHJldmFsZW5jZSBSYXRlClNjb3Jpbmc6IFByb3BvcnRpb24KTnVtZXJhdG9yOiBOdW1iZXIgb2YgaW5wYXRpZW50IENPQiBldmVudHMgb2NjdXJyaW5nIHdpdGhpbiB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kCkRlbm9taW5hdG9yOiBOdW1iZXIgb2YgaW5wYXRpZW50IHN0YXlzIHdoZXJlIGF0IGxlYXN0IG9uZSBvZiB0aGUgZmlyc3QgdGhyZWUgaW5wYXRpZW50IGNhbGVuZGFyIGRheXMgZmFsbHMgd2l0aGluIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QKKi8KCmRlZmluZSAiQ29tbXVuaXR5IEVsaWdpYmxlIElucGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgIklucGF0aWVudCBFbmNvdW50ZXIiIEkKICAgIHdoZXJlIEkuY29tbXVuaXR5T25zZXRXaW5kb3coKSBvdmVybGFwcyAiTWVhc3VyZW1lbnQgUGVyaW9kIgoKZGVmaW5lICJDT0IgUHJldmFsZW5jZSBSYXRlIEluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIkNvbW11bml0eSBFbGlnaWJsZSBJbnBhdGllbnQgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIkNPQiBQcmV2YWxlbmNlIFJhdGUgRGVub21pbmF0b3IiOgogICJDb21tdW5pdHkgRWxpZ2libGUgSW5wYXRpZW50IEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIgoKZGVmaW5lICJDT0IgUHJldmFsZW5jZSBSYXRlIE51bWVyYXRvciI6CiAgIkNPQiBFdmVudCIgQ09CRXZlbnQKICAgIHdoZXJlIENPQkV2ZW50LmluZGV4RGF0ZSBkdXJpbmcgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgIHJldHVybiBDT0JFdmVudC5lbmNvdW50ZXIKCi8qCk1ldHJpYzogSE9CIENydWRlIFJpc2sKU2NvcmluZzogUHJvcG9ydGlvbgpOdW1lcmF0b3I6IE51bWJlciBvZiBpbnBhdGllbnQgc3RheXMgd2l0aCBhdCBsZWFzdCBvbmUgSE9CIGV2ZW50IG9jY3VycmluZyB3aXRoaW4gdGhlIG1lYXN1cmVtZW50IHBlcmlvZApEZW5vbWluYXRvcjogTnVtYmVyIG9mIGlucGF0aWVudCBzdGF5cyB3aGVyZSB0aGVyZSBhcmUgYW55IGlucGF0aWVudCBkYXlzIGVsaWdpYmxlIGZvciBhIGhvc3B0aWFsLW9uc2V0IGV2ZW50IGR1cmluZyB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kCk5vdGVzOiBUaGUgZGVub21pbmF0b3IgZm9yIEhPQiBhZG1pc3Npb24gcmlzayB3aWxsIGluY2x1ZGUgb25seSB0aG9zZSBpbnBhdGllbnQgc3RheXMgd2hvIHdlcmUgZWxpZ2libGUgZm9yIGFuIEhPQiBldmVudCBpbiB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kOiAgCiAgMS4gU3RheXMgd2hlcmUgZGF5IDQgKG9yIGxhdGVyKSBvZiB0aGVpciBhZG1pc3Npb24gb2NjdXJyZWQgZHVyaW5nIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QuICAKICAyLiBJZiBhbiBldmVudCBvY2N1cnMsIHRoZW4gYSBzdGF5IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBkZW5vbWluYXRvciBvZiBzdWJzZXF1ZW50IG1lYXN1cmVtZW50IHBlcmlvZHMuCiovCgpkZWZpbmUgIkhvc3BpdGFsIEVsaWdpYmxlIElucGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgIklucGF0aWVudCBFbmNvdW50ZXIiIEkKICAgIHdoZXJlIEkuaG9zcGl0YWxPbnNldFdpbmRvdygpIG92ZXJsYXBzICJNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgIGFuZCBub3QgZXhpc3RzICgKICAgICAgICAiSE9CIEV2ZW50IiBIT0JFdmVudAogICAgICAgICAgd2hlcmUgSE9CRXZlbnQuZW5jb3VudGVyLmlkID0gSS5pZAogICAgICAgICAgICBhbmQgSE9CRXZlbnQuaW5kZXhEYXRlIGJlZm9yZSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICApCgpkZWZpbmUgIkhPQiBDcnVkZSBSaXNrIEluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIkhvc3BpdGFsIEVsaWdpYmxlIElucGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIKCmRlZmluZSAiSE9CIENydWRlIFJpc2sgRGVub21pbmF0b3IiOgogICJIb3NwaXRhbCBFbGlnaWJsZSBJbnBhdGllbnQgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIkhPQiBDcnVkZSBSaXNrIE51bWVyYXRvciI6CiAgIkhPQiBFdmVudCIgSE9CRXZlbnQKICAgIHdoZXJlIEhPQkV2ZW50LmluZGV4RGF0ZSBkdXJpbmcgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgIHJldHVybiBIT0JFdmVudC5lbmNvdW50ZXIKCi8qCk1ldHJpYzogSE9CIEluY2lkZW5jZSBEZW5zaXR5ClNjb3Jpbmc6IFJhdGlvIC8xMDAuZApOdW1lcmF0b3I6IE51bWJlciBvZiBIT0IgZXZlbnRzCkRlbm9taW5hdG9yOiBOdW1iZXIgb2YgaW5wYXRpZW50IGRheXMgZWxpZ2libGUgZm9yIGEgaG9zcGl0YWwtb25zZXQgZXZlbnQgZHVyaW5nIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QKTm90ZXM6IEVsaWdpYmxlIHBhdGllbnQgZGF5cyBhcmUgZGVmaW5lZCBhczogSW5wYXRpZW50IGRheSA0IHVudGlsIGRpc2NoYXJnZSBvciBpbmRleCBIT0IgZXZlbnQgZGF0ZQoqLwoKZGVmaW5lICJIT0IgSW5jaWRlbmNlIERlbnNpdHkgSW5pdGlhbCBQb3B1bGF0aW9uIjoKICAiSG9zcGl0YWwgRWxpZ2libGUgSW5wYXRpZW50IEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIgoKZGVmaW5lICJIT0IgSW5jaWRlbmNlIERlbnNpdHkgRGVub21pbmF0b3IiOgogICJIb3NwaXRhbCBFbGlnaWJsZSBJbnBhdGllbnQgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgZnVuY3Rpb24gIkhPQiBJbmNpZGVuY2UgRGVuc2l0eSBEZW5vbWluYXRvciBPYnNlcnZhdGlvbiIoZW5jb3VudGVyIFVTUXVhbGl0eUNvcmUuRW5jb3VudGVyKToKICBkYXlzIGJldHdlZW4gc3RhcnQgb2YgZW5jb3VudGVyLmhvc3BpdGFsT25zZXRXaW5kb3coKQogICAgYW5kIE1pbih7CiAgICAgICgiSE9CIEV2ZW50IiBIT0JFdmVudCB3aGVyZSBIT0JFdmVudC5lbmNvdW50ZXIuaWQgPSBlbmNvdW50ZXIuaWQpLnNpbmdsZSgpLmluZGV4RGF0ZSwKICAgICAgZW5kIG9mIGVuY291bnRlci5wZXJpb2QKICAgIH0pCgpkZWZpbmUgIkhPQiBJbmNpZGVuY2UgRGVuc2l0eSBOdW1lcmF0b3IiOgogICJIT0IgRXZlbnQiIEhPQkV2ZW50CiAgICB3aGVyZSBIT0JFdmVudC5pbmRleERhdGUgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCiAgICByZXR1cm4gSE9CRXZlbnQuZW5jb3VudGVyCgovLyBKdXN0IGNvdW50aW5nLCBzbyByZXR1cm4gMQpkZWZpbmUgZnVuY3Rpb24gIkhPQiBJbmNpZGVuY2UgRGVuc2l0eSBOdW1lcmF0b3IgT2JzZXJ2YXRpb24iKGVuY291bnRlciBVU1F1YWxpdHlDb3JlLkVuY291bnRlcik6CiAgMQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIGEgRGF0ZVRpbWUgY29uc3RydWN0ZWQgd2l0aCB0aGUgc2FtZSBwcmVjaXNpb24gYXMKdGhlIGdpdmVuIGRhdGUgdGltZS4gVGhpcyBpcyBlZmZlY3RpdmVseSBhIFRvRGF0ZVRpbWUgb3BlcmF0aW9uIGJ1dCBzZXR0aW5nCnRoZSB0aW1lIGNvbXBvbmVudHMgdG8gMCAoaS5lLiBzdGFydGluZyBhdCBtaWRuaWdodCBvbiB0aGUgZ2l2ZW4gZGF0ZSkKQGNvbW1lbnQ6IFByb3Bvc2VkIGZvciBpbmNsdXNpb24gaW4gQ1FNQ29uY2VwdHMKKi8KZGVmaW5lIGZ1bmN0aW9uIERhdGVUaW1lV2l0aFNhbWVQcmVjaXNpb24oX2RhdGUgRGF0ZSwgX2RhdGVUaW1lIERhdGVUaW1lKToKICBEYXRlVGltZSgKICAgIHllYXIgZnJvbSBfZGF0ZSwKICAgIG1vbnRoIGZyb20gX2RhdGUsCiAgICBkYXkgZnJvbSBfZGF0ZSwKICAgIGlmIGhvdXIgZnJvbSBfZGF0ZVRpbWUgaXMgbm90IG51bGwgdGhlbiAwIGVsc2UgbnVsbCwKICAgIGlmIG1pbnV0ZSBmcm9tIF9kYXRlVGltZSBpcyBub3QgbnVsbCB0aGVuIDAgZWxzZSBudWxsLAogICAgaWYgc2Vjb25kIGZyb20gX2RhdGVUaW1lIGlzIG5vdCBudWxsIHRoZW4gMCBlbHNlIG51bGwKICApCgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgdGhlIGludGVydmFsIG9mIHRpbWUgY292ZXJpbmcgdGhlIGdpdmVuIGhvc3BpdGFsIGRheQpAY29tbWVudDogVGhlIGludGVydmFsIHdpbGwgYmUgYSBmdWxsIGRheSB1bmxlc3MgaXQgaXMgdGhlIGZpcnN0IG9yIGxhc3QgZGF5Cm9mIHRoZSBob3NwaXRhbCBzdGF5LCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgc3RhcnQgb3IgZW5kIHdpdGggdGhlIGhvc3BpdGFsaXphdGlvbgpzdGFydCBvciBlbmQuCgpOT1RFOiBQcm9wb3NlZCBmb3IgaW5jbHVzaW9uIGluIENRTUNvbmNlcHRzCiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaG9zcGl0YWxEYXkoaG9zcGl0YWxpemF0aW9uIEludGVydmFsPERhdGVUaW1lPiwgZGF5TnVtYmVyIEludGVnZXIpOgogIGhvc3BpdGFsaXphdGlvbiBICiAgICBsZXQgCiAgICAgIGhvc3BpdGFsRGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIEggKyAoKGRheU51bWJlciAtIDEpICogMSBkYXkpLAogICAgICBob3NwaXRhbERhdGVUaW1lOiBEYXRlVGltZVdpdGhTYW1lUHJlY2lzaW9uKGhvc3BpdGFsRGF0ZSwgc3RhcnQgb2YgSCkKICAgIHJldHVybiBJbnRlcnZhbFsKICAgICAgTWF4KHsgc3RhcnQgb2YgSCwgaG9zcGl0YWxEYXRlVGltZSB9KSwKICAgICAgTWluKHsgaG9zcGl0YWxEYXRlVGltZSArIDEgZGF5LCBILmhpZ2ggfSkKICAgICkKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgaW50ZXJ2YWwgb2YgdGltZSBjb3ZlcmluZyB0aGUgZ2l2ZW4gaG9zcGl0YWwgZGF5cwpAY29tbWVudDogVGhlIGludGVydmFsIHdpbGwgc3RhcnQgYXQgbWlkbmlnaHQgb24gdGhlIHN0YXJ0aW5nIGRheSwgdW5sZXNzIGl0IGlzCnRoZSBmaXJzdCBkYXksIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBzdGFydCB3aXRoIHRoZSBob3NwaXRhbGl6YXRpb24gc3RhcnQuIFRoZQppbnRlcnZhbCB3aWxsIGVuZCBqdXN0IGJlZm9yZSBtaWRuaWdodCBvbiB0aGUgZW5kaW5nIGRheSwgdW5sZXNzIGl0IGlzIHRoZSBsYXN0CmRheSBvciBsYXRlciwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGVuZCB3aXRoIHRoZSBob3NwaXRhbGl6YXRpb24gZW5kLgoKTk9URTogUHJvcG9zZWQgZm9yIGluY2x1c2lvbiBpbiBDUU1Db25jZXB0cwoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGhvc3BpdGFsRGF5cyhob3NwaXRhbGl6YXRpb24gSW50ZXJ2YWw8RGF0ZVRpbWU+LCBzdGFydERheU51bWJlciBJbnRlZ2VyLCBlbmREYXlOdW1iZXIgSW50ZWdlcik6CiAgaG9zcGl0YWxpemF0aW9uIEgKICAgIGxldCAKICAgICAgaG9zcGl0YWxEYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgSCArICgoc3RhcnREYXlOdW1iZXIgLSAxKSAqIDEgZGF5KSwKICAgICAgaG9zcGl0YWxEYXRlVGltZTogRGF0ZVRpbWVXaXRoU2FtZVByZWNpc2lvbihob3NwaXRhbERhdGUsIHN0YXJ0IG9mIEgpLAogICAgICBudW1iZXJPZkRheXM6IChlbmREYXlOdW1iZXIgLSBzdGFydERheU51bWJlcikgKyAxCiAgICByZXR1cm4gSW50ZXJ2YWxbCiAgICAgIE1heCh7IHN0YXJ0IG9mIEgsIGhvc3BpdGFsRGF0ZVRpbWUgfSksCiAgICAgIE1pbih7IGhvc3BpdGFsRGF0ZVRpbWUgKyAobnVtYmVyT2ZEYXlzICogMSBkYXkpLCBILmhpZ2ggfSkKICAgICkKICAgIAo="
}
]
}