From 2ea8acdc339fc94674dff583aeed9b7901b83cef Mon Sep 17 00:00:00 2001 From: Chris Schuler Date: Sun, 12 Nov 2017 16:09:58 -0700 Subject: [PATCH] Adding cqf-ruler project --- hapi-fhir-jpaserver-cqf-ruler/.gitignore | 137 + hapi-fhir-jpaserver-cqf-ruler/README.md | 31 + hapi-fhir-jpaserver-cqf-ruler/pom.xml | 357 ++ .../cqf/ruler/builders/AnnotationBuilder.java | 30 + .../jpa/cqf/ruler/builders/BaseBuilder.java | 21 + .../builders/CarePlanActivityBuilder.java | 68 + .../CarePlanActivityDetailBuilder.java | 139 + .../cqf/ruler/builders/CarePlanBuilder.java | 252 + .../builders/CodeableConceptBuilder.java | 33 + .../jpa/cqf/ruler/builders/CodingBuilder.java | 35 + .../cqf/ruler/builders/IdentifierBuilder.java | 49 + .../cqf/ruler/builders/JavaDateBuilder.java | 18 + .../jpa/cqf/ruler/builders/PeriodBuilder.java | 22 + .../cqf/ruler/builders/ReferenceBuilder.java | 26 + .../cqf/ruler/builders/ValueSetBuider.java | 47 + .../builders/ValueSetComposeBuilder.java | 22 + .../builders/ValueSetIncludesBuilder.java | 37 + .../uhn/fhir/jpa/cqf/ruler/cds/CdsCard.java | 353 ++ .../jpa/cqf/ruler/cds/CdsHooksHelper.java | 70 + .../jpa/cqf/ruler/cds/CdsHooksRequest.java | 158 + .../cqf/ruler/cds/CdsRequestProcessor.java | 122 + .../cds/MedicationPrescribeProcessor.java | 121 + .../ruler/cds/OpioidGuidanceProcessor.java | 115 + .../cqf/ruler/cds/OrderReviewProcessor.java | 93 + .../cqf/ruler/cds/PatientViewProcessor.java | 77 + .../uhn/fhir/jpa/cqf/ruler/cds/Processor.java | 7 + .../ruler/config/FhirServerConfigDstu3.java | 137 + .../ruler/config/FhirTesterConfigDstu3.java | 33 + .../cqf/ruler/config/STU3LibraryLoader.java | 108 + .../config/STU3LibrarySourceProvider.java | 35 + .../ActivityDefinitionApplyException.java | 8 + .../exceptions/InvalidHookException.java | 9 + .../exceptions/MissingContextException.java | 9 + .../exceptions/MissingHookException.java | 9 + .../jpa/cqf/ruler/helpers/DateHelper.java | 46 + .../jpa/cqf/ruler/helpers/Dstu2ToStu3.java | 84 + .../cqf/ruler/helpers/FhirMeasureBundler.java | 40 + .../ruler/helpers/FhirMeasureEvaluator.java | 177 + .../jpa/cqf/ruler/helpers/LibraryHelper.java | 81 + .../jpa/cqf/ruler/helpers/XlsxToValueSet.java | 211 + .../jpa/cqf/ruler/omtk/OmtkDataProvider.java | 157 + .../jpa/cqf/ruler/omtk/OmtkDataWrapper.java | 124 + .../uhn/fhir/jpa/cqf/ruler/omtk/OmtkRow.java | 21 + .../ruler/providers/CqlExecutionProvider.java | 148 + ...HIRActivityDefinitionResourceProvider.java | 462 ++ .../FHIRMeasureResourceProvider.java | 494 ++ .../FHIRPlanDefinitionResourceProvider.java | 295 ++ .../cqf/ruler/providers/JpaDataProvider.java | 127 + .../providers/JpaTerminologyProvider.java | 58 + .../ruler/providers/NarrativeProvider.java | 46 + .../jpa/cqf/ruler/servlet/BaseServlet.java | 150 + .../cqf/ruler/servlet/CdsServicesServlet.java | 180 + .../resources/cds/OMTK-modelinfo-0.1.0.xml | 67 + .../codesystems/2.16.840.1.113883.6.1.json | 34 + .../codesystems/2.16.840.1.113883.6.103.json | 443 ++ .../codesystems/2.16.840.1.113883.6.90.json | 1179 +++++ .../codesystems/2.16.840.1.113883.6.96.json | 291 + .../src/main/resources/logback.xml | 16 + .../src/main/resources/md/load_resources.md | 108 + .../activitydefinition/MedicationOrder.json | 99 + .../ReferralDefinition.json | 31 + .../ZIkaMedicationOrder.json | 33 + .../activitydefinition/ZikaPrevention.json | 38 + .../activitydefinition/ZikaVirusExposure.json | 31 + .../guidanceresponse/SimpleExample.json | 8 + .../narratives/examples/library/CMS146.json | 161 + .../examples/library/ChlamydiaScreening.json | 52 + .../library/ExclusiveBreastfeeding_CDS.json | 53 + .../library/ExclusiveBreastfeeding_CQM.json | 53 + .../examples/library/FhirHelpers.json | 44 + .../examples/library/FhirModel.json | 33 + .../examples/library/QuickModel.json | 33 + .../examples/library/SuicideRisk.json | 95 + .../measure/ExclusiveBreastfeeding.json | 101 + .../narratives/examples/measure/cms146.json | 112 + .../measurereport/CMS146Individual.json | 285 + .../measurereport/CMS146PatientListing.json | 405 ++ .../examples/measurereport/CMS146Summary.json | 279 + .../plandefinition/ChlamydiaScreening.json | 42 + .../ExclusiveBreastfeeding_1.json | 82 + .../ExclusiveBreastfeeding_2.json | 69 + .../ExclusiveBreastfeeding_3.json | 82 + .../ExclusiveBreastfeeding_4.json | 69 + .../plandefinition/ZikaVirusIntervention.json | 217 + .../plandefinition/low-suicide-risk.json | 476 ++ .../plandefinition-example.json | 64 + .../AppropriateOrdering.json | 23 + .../servicedefinition/InfoButton.json | 38 + .../src/main/resources/narratives/scratch.xml | 447 ++ .../narratives/templates/actdefcomponent.html | 100 + .../templates/actiondefcomponent.html | 87 + .../templates/activitydefinition.html | 236 + .../narratives/templates/attachment.html | 18 + .../narratives/templates/codeableconcept.html | 10 + .../narratives/templates/coding.html | 16 + .../narratives/templates/datarequirement.html | 88 + .../resources/narratives/templates/date.html | 1 + .../templates/guidanceresponse.html | 36 + .../narratives/templates/identifier.html | 12 + .../narratives/templates/integer.html | 1 + .../narratives/templates/library.html | 215 + .../narratives/templates/measure.html | 363 ++ .../narratives/templates/measurereport.html | 226 + .../narratives/templates/medication.html | 36 + .../narratives/templates/plandef.html | 180 + .../narratives/templates/plandefinition.html | 107 + .../resources/narratives/templates/ratio.html | 20 + .../narratives/templates/reference.html | 15 + .../narratives/templates/relatedartifact.html | 23 + .../templates/servicedefinition.html | 153 + .../narratives/templates/string.html | 1 + .../narratives/templates/usagecontext.html | 40 + ...6.840.1.113883.3.464.1003.103.12.1001.json | 4710 +++++++++++++++++ ...6.840.1.113883.3.464.1003.198.11.1024.json | 64 + .../2.16.840.1.114222.4.11.4003.json | 250 + .../2.16.840.1.114222.4.11.4025.json | 130 + .../2.16.840.1.114222.4.11.4120.json | 570 ++ .../2.16.840.1.114222.4.11.4141.json | 1470 +++++ .../2.16.840.1.114222.4.11.7339.json | 430 ++ .../2.16.840.1.114222.4.11.7343.json | 30 + .../2.16.840.1.114222.4.11.7457.json | 1190 +++++ .../2.16.840.1.114222.4.11.7459.json | 150 + .../2.16.840.1.114222.4.11.7460.json | 550 ++ .../2.16.840.1.114222.4.11.7476.json | 90 + .../2.16.840.1.114222.4.11.7477.json | 90 + .../2.16.840.1.114222.4.11.7480.json | 590 +++ .../main/webapp/WEB-INF/templates/about.html | 67 + .../webapp/WEB-INF/templates/tmpl-footer.html | 16 + .../WEB-INF/templates/tmpl-home-welcome.html | 52 + .../src/main/webapp/WEB-INF/web.xml | 122 + .../src/main/webapp/WEB-INF/xsd/javaee_6.xsd | 2419 +++++++++ .../src/main/webapp/WEB-INF/xsd/jsp_2_2.xsd | 389 ++ .../main/webapp/WEB-INF/xsd/web-app_3_0.xsd | 272 + .../webapp/WEB-INF/xsd/web-common_3_0.xsd | 1575 ++++++ .../src/main/webapp/WEB-INF/xsd/xml.xsd | 287 + .../fhir/jpa/cqf/ruler/RulerHelperTests.java | 90 + .../uhn/fhir/jpa/cqf/ruler/RulerTestBase.java | 320 ++ .../activitydefinition-apply-library.json | 19 + .../ruler/activitydefinition-apply-test.cql | 4 + .../cqf/ruler/activitydefinition-apply.json | 32 + .../uhn/fhir/jpa/cqf/ruler/cdc-opioid-5.json | 144 + ...cdc-opioid-guidance-cds-hooks-request.json | 132 + .../cdc-opioid-guidance-library-omtk.json | 23 + .../cdc-opioid-guidance-library-primary.json | 19 + .../jpa/cqf/ruler/general-fhirhelpers-3.json | 19 + .../fhir/jpa/cqf/ruler/general-patient.json | 114 + .../jpa/cqf/ruler/general-practitioner.json | 173 + .../fhir/jpa/cqf/ruler/library-col.elm.xml | 319 ++ .../ca/uhn/fhir/jpa/cqf/ruler/measure-col.xml | 138 + .../ruler/measure-processing-condition.json | 49 + .../cqf/ruler/measure-processing-library.json | 22 + .../cqf/ruler/measure-processing-measure.json | 158 + .../ruler/measure-processing-procedure.json | 68 + .../ruler/measure-processing-valueset-1.json | 416 ++ .../ruler/measure-processing-valueset-2.json | 181 + .../ruler/measure-processing-valueset-3.json | 421 ++ .../ruler/measure-processing-valueset-4.json | 208 + .../ruler/measure-processing-valueset-5.json | 147 + .../ruler/plandefinition-apply-library.json | 19 + .../cqf/ruler/plandefinition-apply-test.cql | 7 + .../jpa/cqf/ruler/plandefinition-apply.json | 59 + .../ca/uhn/fhir/jpa/cqf/ruler/test.xlsx | Bin 0 -> 55604 bytes .../jpa/cqf/ruler/zika-affected-areas.xlsx | Bin 0 -> 12461 bytes .../ruler/zika-arbovirus-signs-symptoms.xlsx | Bin 0 -> 11003 bytes .../ruler/zika-arbovirus-test-results.xlsx | Bin 0 -> 9775 bytes .../jpa/cqf/ruler/zika-arbovirus-tests.xlsx | Bin 0 -> 11127 bytes .../ruler/zika-chikungunya-test-results.xlsx | Bin 0 -> 8864 bytes .../jpa/cqf/ruler/zika-chikungunya-tests.xlsx | Bin 0 -> 10618 bytes .../fhir/jpa/cqf/ruler/zika-codesystem.xlsx | Bin 0 -> 52542 bytes .../cqf/ruler/zika-dengue-test-results.xlsx | Bin 0 -> 9240 bytes .../fhir/jpa/cqf/ruler/zika-dengue-tests.xlsx | Bin 0 -> 13781 bytes .../jpa/cqf/ruler/zika-igm-elisa-results.xlsx | Bin 0 -> 9133 bytes .../zika-neutralizing-antibody-results.xlsx | Bin 0 -> 9224 bytes .../cqf/ruler/zika-virus-signs-symptoms.xlsx | Bin 0 -> 9394 bytes .../fhir/jpa/cqf/ruler/zika-virus-tests.xlsx | Bin 0 -> 11160 bytes .../ca/uhn/fhir/jpa/cqf/ruler/~$test.xlsx | Bin 0 -> 171 bytes .../fhir/jpa/cqf/ruler/~$zika-codesystem.xlsx | Bin 0 -> 171 bytes 177 files changed, 32180 insertions(+) create mode 100644 hapi-fhir-jpaserver-cqf-ruler/.gitignore create mode 100644 hapi-fhir-jpaserver-cqf-ruler/README.md create mode 100644 hapi-fhir-jpaserver-cqf-ruler/pom.xml create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/AnnotationBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/BaseBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanActivityBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanActivityDetailBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CodeableConceptBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CodingBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/IdentifierBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/JavaDateBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/PeriodBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ReferenceBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetBuider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetComposeBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetIncludesBuilder.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsCard.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsHooksHelper.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsHooksRequest.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsRequestProcessor.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/MedicationPrescribeProcessor.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/OpioidGuidanceProcessor.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/OrderReviewProcessor.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/PatientViewProcessor.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/Processor.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/FhirServerConfigDstu3.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/FhirTesterConfigDstu3.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/STU3LibraryLoader.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/STU3LibrarySourceProvider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/ActivityDefinitionApplyException.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/InvalidHookException.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/MissingContextException.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/MissingHookException.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/DateHelper.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/Dstu2ToStu3.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/FhirMeasureBundler.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/FhirMeasureEvaluator.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/LibraryHelper.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/XlsxToValueSet.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkDataProvider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkDataWrapper.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkRow.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/CqlExecutionProvider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRActivityDefinitionResourceProvider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRMeasureResourceProvider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRPlanDefinitionResourceProvider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/JpaDataProvider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/JpaTerminologyProvider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/NarrativeProvider.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/servlet/BaseServlet.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/servlet/CdsServicesServlet.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/cds/OMTK-modelinfo-0.1.0.xml create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.1.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.103.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.90.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.96.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/logback.xml create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/md/load_resources.md create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/MedicationOrder.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ReferralDefinition.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZIkaMedicationOrder.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZikaPrevention.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZikaVirusExposure.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/guidanceresponse/SimpleExample.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/CMS146.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ChlamydiaScreening.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ExclusiveBreastfeeding_CDS.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ExclusiveBreastfeeding_CQM.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/FhirHelpers.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/FhirModel.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/QuickModel.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/SuicideRisk.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measure/ExclusiveBreastfeeding.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measure/cms146.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146Individual.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146PatientListing.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146Summary.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ChlamydiaScreening.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_1.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_2.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_3.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_4.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ZikaVirusIntervention.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/low-suicide-risk.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/plandefinition-example.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/servicedefinition/AppropriateOrdering.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/servicedefinition/InfoButton.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/scratch.xml create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/actdefcomponent.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/actiondefcomponent.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/activitydefinition.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/attachment.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/codeableconcept.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/coding.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/datarequirement.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/date.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/guidanceresponse.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/identifier.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/integer.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/library.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/measure.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/measurereport.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/medication.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/plandef.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/plandefinition.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/ratio.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/reference.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/relatedartifact.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/servicedefinition.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/string.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/usagecontext.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.113883.3.464.1003.103.12.1001.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.113883.3.464.1003.198.11.1024.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4003.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4025.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4120.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4141.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7339.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7343.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7457.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7459.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7460.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7476.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7477.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7480.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/about.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/tmpl-footer.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/tmpl-home-welcome.html create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/web.xml create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/javaee_6.xsd create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/jsp_2_2.xsd create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/web-app_3_0.xsd create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/web-common_3_0.xsd create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/xml.xsd create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/java/ca/uhn/fhir/jpa/cqf/ruler/RulerHelperTests.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/java/ca/uhn/fhir/jpa/cqf/ruler/RulerTestBase.java create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply-library.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply-test.cql create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-5.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-cds-hooks-request.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-library-omtk.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-library-primary.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-fhirhelpers-3.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-patient.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-practitioner.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/library-col.elm.xml create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-col.xml create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-condition.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-library.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-measure.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-procedure.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-1.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-2.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-3.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-4.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-5.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply-library.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply-test.cql create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply.json create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/test.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-affected-areas.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-signs-symptoms.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-test-results.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-tests.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-chikungunya-test-results.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-chikungunya-tests.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-codesystem.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-dengue-test-results.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-dengue-tests.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-igm-elisa-results.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-neutralizing-antibody-results.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-virus-signs-symptoms.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-virus-tests.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/~$test.xlsx create mode 100644 hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/~$zika-codesystem.xlsx diff --git a/hapi-fhir-jpaserver-cqf-ruler/.gitignore b/hapi-fhir-jpaserver-cqf-ruler/.gitignore new file mode 100644 index 00000000000..bb6d549893d --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/.gitignore @@ -0,0 +1,137 @@ +# Created by https://www.gitignore.io + +.DS_Store + +# RxNorm data +src/main/resources/cds/OpioidManagementTerminologyKnowledge.db + +# log files +*.log + +### Java ### +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties + + +### Vim ### +[._]*.s[a-w][a-z] +[._]s[a-w][a-z] +*.un~ +Session.vim +.netrwhist +*~ + + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties + + + +### Eclipse ### +*.pydevproject +.metadata +.gradle +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.loadpath + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# JDT-specific (Eclipse Java Development Tools) + +# PDT-specific +.buildpath + +# sbteclipse plugin +.target + +# TeXlipse plugin +.texlipse + +*.data +*.lck +*.properties +*.script +/*.tmp +*.txt \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/README.md b/hapi-fhir-jpaserver-cqf-ruler/README.md new file mode 100644 index 00000000000..76a94108c98 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/README.md @@ -0,0 +1,31 @@ +# cqf-ruler + +The CQF Ruler is an implementation of FHIR's [Clinical Reasoning Module]( +http://hl7.org/fhir/clinicalreasoning-module.html) and serves as a +knowledge artifact repository and clinical decision support service. + +## Usage + + - `$ mvn install` + - `$ mvn -Djetty.http.port=XXXX jetty:run` + +Visit the [wiki](https://github.com/DBCG/cqf-ruler/wiki) for more documentation. + +## Dependencies + +Before the instructions in the above "Usage" section will work, you need to +install several primary dependencies. + +### Java + +Go to [http://www.oracle.com/technetwork/java/javase/downloads/]( +http://www.oracle.com/technetwork/java/javase/downloads/) and download the +latest (version 8 or higher) JDK for your platform, and install it. + +### Apache Maven + +Go to [https://maven.apache.org](https://maven.apache.org), visit the main +"Download" page, and under "Files" download a binary archive of your +choice. Then unpack that archive file and follow the installation +instructions in its README.txt. The end result of this should be that the +binary "mvn" is now in your path. diff --git a/hapi-fhir-jpaserver-cqf-ruler/pom.xml b/hapi-fhir-jpaserver-cqf-ruler/pom.xml new file mode 100644 index 00000000000..ef5d5fbd0e3 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/pom.xml @@ -0,0 +1,357 @@ + + 4.0.0 + + + ca.uhn.hapi.fhir + hapi-fhir + 3.1.0-SNAPSHOT + ../pom.xml + + + cqf-ruler + + + war + + CQF Ruler + + + + oss-sonatype + https://oss.sonatype.org/content/repositories/snapshots + + true + + + + oss-sonatype-public + https://oss.sonatype.org/content/groups/public/ + + + + + + + org.opencds.cqf + cql-engine + 1.2.36-SNAPSHOT + + + + org.opencds.cqf + cql-engine-fhir + 1.2.36-SNAPSHOT + + + + info.cqframework + cql-to-elm + 1.2.16 + + + + org.xerial + sqlite-jdbc + 3.15.1 + + + + com.googlecode.json-simple + json-simple + 1.1.1 + + + + com.fasterxml.jackson.core + jackson-databind + + + + com.google.code.gson + gson + 2.8.0 + + + + com.fasterxml.jackson.core + jackson-core + + + + + ca.uhn.hapi.fhir + hapi-fhir-base + ${project.version} + + + + + ca.uhn.hapi.fhir + hapi-fhir-structures-dstu2 + ${project.version} + + + ca.uhn.hapi.fhir + hapi-fhir-structures-dstu3 + ${project.version} + + + + + ca.uhn.hapi.fhir + hapi-fhir-jpaserver-base + ${project.version} + + + + + ca.uhn.hapi.fhir + hapi-fhir-testpage-overlay + ${project.version} + war + provided + + + ca.uhn.hapi.fhir + hapi-fhir-testpage-overlay + ${project.version} + classes + provided + + + + + ch.qos.logback + logback-classic + + + + org.slf4j + jcl-over-slf4j + 1.7.22 + + + + org.apache.poi + poi-ooxml + 3.15 + + + + + javax.servlet + javax.servlet-api + provided + + + + + org.thymeleaf + thymeleaf + + + + + org.springframework + spring-web + + + + + org.apache.commons + commons-dbcp2 + + + + org.postgresql + postgresql + 9.4.1212.jre7 + + + + org.apache.derby + derby + + + org.apache.derby + derbynet + + + org.apache.derby + derbyclient + + + + + org.eclipse.jetty + jetty-servlets + test + + + org.eclipse.jetty + jetty-servlet + test + + + org.eclipse.jetty + jetty-server + test + + + org.eclipse.jetty + jetty-util + test + + + org.eclipse.jetty + jetty-webapp + test + + + com.phloc + phloc-schematron + + + + org.ebaysf.web + cors-filter + + + servlet-api + javax.servlet + + + + + + junit + junit + 4.11 + test + + + + + + + cqf-ruler + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + org.eclipse.jetty + jetty-maven-plugin + + + /cqf-ruler + true + + + + + + + org.apache.maven.plugins + maven-war-plugin + + + + ${maven.build.timestamp} + + + + + ca.uhn.hapi.fhir + hapi-fhir-testpage-overlay + + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + true + + + + + integration-test + verify + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20.1 + + + org.apache.maven.surefire + surefire-junit47 + 2.20.1 + + + + + + + + + + + + + + org.codehaus.mojo + exec-maven-plugin + + + + exec + + + + + maven + ca.uhn.fhir.jpa.cqf.ruler.helpers.XlsxToValueSet + + -b + -o + -s + -v + -c + -d + -u + -outDir + + + + + + + + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/AnnotationBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/AnnotationBuilder.java new file mode 100644 index 00000000000..dc33decf0b4 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/AnnotationBuilder.java @@ -0,0 +1,30 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.Annotation; +import org.hl7.fhir.dstu3.model.Type; + +import java.util.Date; + +public class AnnotationBuilder extends BaseBuilder { + + public AnnotationBuilder() { + super(new Annotation()); + } + + // Type is one of the following: Reference or String + public AnnotationBuilder buildAuthor(Type choice) { + complexProperty.setAuthor(choice); + return this; + } + + public AnnotationBuilder buildTime(Date date) { + complexProperty.setTime(date); + return this; + } + + // required + public AnnotationBuilder buildText(String text) { + complexProperty.setText(text); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/BaseBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/BaseBuilder.java new file mode 100644 index 00000000000..2d2add3741d --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/BaseBuilder.java @@ -0,0 +1,21 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +/* + These builders are based off of work performed by Philips Healthcare. + I simplified their work with this generic base class and added/expanded builders. + + Tip of the hat to Philips Healthcare developer nly98977 +*/ + +public class BaseBuilder { + + protected T complexProperty; + + public BaseBuilder(T complexProperty) { + this.complexProperty = complexProperty; + } + + public T build() { + return complexProperty; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanActivityBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanActivityBuilder.java new file mode 100644 index 00000000000..6c356586a66 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanActivityBuilder.java @@ -0,0 +1,68 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.Annotation; +import org.hl7.fhir.dstu3.model.CarePlan; +import org.hl7.fhir.dstu3.model.CodeableConcept; +import org.hl7.fhir.dstu3.model.Reference; + +import java.util.ArrayList; +import java.util.List; + +public class CarePlanActivityBuilder extends BaseBuilder { + + public CarePlanActivityBuilder() { + super(new CarePlan.CarePlanActivityComponent()); + } + + public CarePlanActivityBuilder buildOutcomeConcept(List concepts) { + complexProperty.setOutcomeCodeableConcept(concepts); + return this; + } + + public CarePlanActivityBuilder buildOutcomeConcept(CodeableConcept concept) { + if (!complexProperty.hasOutcomeCodeableConcept()) { + complexProperty.setOutcomeCodeableConcept(new ArrayList<>()); + } + + complexProperty.addOutcomeCodeableConcept(concept); + return this; + } + + public CarePlanActivityBuilder buildOutcomeReference(List references) { + complexProperty.setOutcomeReference(references); + return this; + } + + public CarePlanActivityBuilder buildOutcomeReference(Reference reference) { + if (!complexProperty.hasOutcomeReference()) { + complexProperty.setOutcomeReference(new ArrayList<>()); + } + + complexProperty.addOutcomeReference(reference); + return this; + } + + public CarePlanActivityBuilder buildProgress(List annotations) { + complexProperty.setProgress(annotations); + return this; + } + + public CarePlanActivityBuilder buildProgress(Annotation annotation) { + if (!complexProperty.hasProgress()) { + complexProperty.setProgress(new ArrayList<>()); + } + + complexProperty.addProgress(annotation); + return this; + } + + public CarePlanActivityBuilder buildReference(Reference reference) { + complexProperty.setReference(reference); + return this; + } + + public CarePlanActivityBuilder buildDetail(CarePlan.CarePlanActivityDetailComponent detail) { + complexProperty.setDetail(detail); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanActivityDetailBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanActivityDetailBuilder.java new file mode 100644 index 00000000000..bf73b6b8de8 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanActivityDetailBuilder.java @@ -0,0 +1,139 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.*; +import org.hl7.fhir.exceptions.FHIRException; + +import java.util.ArrayList; +import java.util.List; + +public class CarePlanActivityDetailBuilder extends BaseBuilder { + + public CarePlanActivityDetailBuilder() { + super(new CarePlan.CarePlanActivityDetailComponent()); + } + + public CarePlanActivityDetailBuilder buildCategory(CodeableConcept category) { + complexProperty.setCategory(category); + return this; + } + + public CarePlanActivityDetailBuilder buildDefinition(Reference reference) { + complexProperty.setDefinition(reference); + return this; + } + + public CarePlanActivityDetailBuilder buildCode(CodeableConcept code) { + complexProperty.setCode(code); + return this; + } + + public CarePlanActivityDetailBuilder buildReasonCode(List concepts) { + complexProperty.setReasonCode(concepts); + return this; + } + + public CarePlanActivityDetailBuilder buildReasonCode(CodeableConcept concept) { + if (!complexProperty.hasReasonCode()) { + complexProperty.setReasonCode(new ArrayList<>()); + } + + complexProperty.addReasonCode(concept); + return this; + } + + public CarePlanActivityDetailBuilder buildReasonReference(List references) { + complexProperty.setReasonReference(references); + return this; + } + + public CarePlanActivityDetailBuilder buildReasonReference(Reference reference) { + if (!complexProperty.hasReasonReference()) { + complexProperty.setReasonReference(new ArrayList<>()); + } + + complexProperty.addReasonReference(reference); + return this; + } + + public CarePlanActivityDetailBuilder buildGoal(List goals) { + complexProperty.setGoal(goals); + return this; + } + + public CarePlanActivityDetailBuilder buildGoal(Reference goal) { + if (!complexProperty.hasGoal()) { + complexProperty.setGoal(new ArrayList<>()); + } + + complexProperty.addGoal(goal); + return this; + } + + // required + public CarePlanActivityDetailBuilder buildStatus(CarePlan.CarePlanActivityStatus status) { + complexProperty.setStatus(status); + return this; + } + + // String overload + public CarePlanActivityDetailBuilder buildStatus(String status) throws FHIRException { + complexProperty.setStatus(CarePlan.CarePlanActivityStatus.fromCode(status)); + return this; + } + + public CarePlanActivityDetailBuilder buildStatusReason(String reason) { + complexProperty.setStatusReason(reason); + return this; + } + + public CarePlanActivityDetailBuilder buildProhibited(boolean prohibited) { + complexProperty.setProhibited(prohibited); + return this; + } + + // Type is one of the following: Timing, Period, or String + public CarePlanActivityDetailBuilder buildScheduled(Type type) { + complexProperty.setScheduled(type); + return this; + } + + public CarePlanActivityDetailBuilder buildLocation(Reference location) { + complexProperty.setLocation(location); + return this; + } + + public CarePlanActivityDetailBuilder buildPerformer(List performers) { + complexProperty.setPerformer(performers); + return this; + } + + public CarePlanActivityDetailBuilder buildPerformer(Reference performer) { + if (!complexProperty.hasPerformer()) { + complexProperty.setPerformer(new ArrayList<>()); + } + + complexProperty.addPerformer(performer); + return this; + } + + // Type is one of the following: CodeableConcept or Reference + public CarePlanActivityDetailBuilder buildProduct(Type type) { + complexProperty.setProduct(type); + return this; + } + + public CarePlanActivityDetailBuilder buildDailyAmount(SimpleQuantity amount) { + complexProperty.setDailyAmount(amount); + return this; + } + + public CarePlanActivityDetailBuilder buildQuantity(SimpleQuantity quantity) { + complexProperty.setQuantity(quantity); + return this; + } + + public CarePlanActivityDetailBuilder buildDescription(String description) { + complexProperty.setDescription(description); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanBuilder.java new file mode 100644 index 00000000000..a3926cb0306 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CarePlanBuilder.java @@ -0,0 +1,252 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.*; +import org.hl7.fhir.exceptions.FHIRException; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class CarePlanBuilder extends BaseBuilder { + + public CarePlanBuilder() { + super(new CarePlan()); + } + + public CarePlanBuilder buildIdentifier(List identifiers) { + complexProperty.setIdentifier(identifiers); + return this; + } + + public CarePlanBuilder buildIdentifier(Identifier identifier) { + if (!complexProperty.hasIdentifier()) { + complexProperty.setIdentifier(new ArrayList<>()); + } + + complexProperty.addIdentifier(identifier); + return this; + } + + public CarePlanBuilder buildDefinition(List references) { + complexProperty.setDefinition(references); + return this; + } + + public CarePlanBuilder buildDefinition(Reference reference) { + if (!complexProperty.hasDefinition()) { + complexProperty.setDefinition(new ArrayList<>()); + } + + complexProperty.addDefinition(reference); + return this; + } + + public CarePlanBuilder buildBasedOn(List references) { + complexProperty.setBasedOn(references); + return this; + } + + public CarePlanBuilder buildBasedOn(Reference reference) { + if (!complexProperty.hasBasedOn()) { + complexProperty.setBasedOn(new ArrayList<>()); + } + + complexProperty.addBasedOn(reference); + return this; + } + + public CarePlanBuilder buildReplaces(List references) { + complexProperty.setReplaces(references); + return this; + } + + public CarePlanBuilder buildReplaces(Reference reference) { + if (!complexProperty.hasReplaces()) { + complexProperty.setReplaces(new ArrayList<>()); + } + + complexProperty.addReplaces(reference); + return this; + } + + public CarePlanBuilder buildPartOf(List references) { + complexProperty.setPartOf(references); + return this; + } + + public CarePlanBuilder buildPartOf(Reference reference) { + if (!complexProperty.hasPartOf()) { + complexProperty.setPartOf(new ArrayList<>()); + } + + complexProperty.addPartOf(reference); + return this; + } + + // required + public CarePlanBuilder buildStatus(CarePlan.CarePlanStatus status) { + complexProperty.setStatus(status); + return this; + } + + // String overload + public CarePlanBuilder buildStatus(String status) throws FHIRException { + complexProperty.setStatus(CarePlan.CarePlanStatus.fromCode(status)); + return this; + } + + // required + public CarePlanBuilder buildIntent(CarePlan.CarePlanIntent intent) { + complexProperty.setIntent(intent); + return this; + } + + // String overload + public CarePlanBuilder buildIntent(String intent) throws FHIRException { + complexProperty.setIntent(CarePlan.CarePlanIntent.fromCode(intent)); + return this; + } + + public CarePlanBuilder buildCategory(List categories) { + complexProperty.setCategory(categories); + return this; + } + + public CarePlanBuilder buildCategory(CodeableConcept category) { + if (!complexProperty.hasCategory()) { + complexProperty.setCategory(new ArrayList<>()); + } + + complexProperty.addCategory(category); + return this; + } + + public CarePlanBuilder buildTitle(String title) { + complexProperty.setTitle(title); + return this; + } + + public CarePlanBuilder buildDescription(String description) { + complexProperty.setDescription(description); + return this; + } + + // required + public CarePlanBuilder buildSubject(Reference reference) { + complexProperty.setSubject(reference); + return this; + } + + public CarePlanBuilder buildContext(Reference reference) { + complexProperty.setContext(reference); + return this; + } + + public CarePlanBuilder buildPeriod(Period period) { + complexProperty.setPeriod(period); + return this; + } + + public CarePlanBuilder buildAuthor(List references) { + complexProperty.setAuthor(references); + return this; + } + + public CarePlanBuilder buildAuthor(Reference reference) { + if (!complexProperty.hasAuthor()) { + complexProperty.setAuthor(new ArrayList<>()); + } + + complexProperty.addAuthor(reference); + return this; + } + + public CarePlanBuilder buildCareTeam(List careTeams) { + complexProperty.setCareTeam(careTeams); + return this; + } + + public CarePlanBuilder buildCareTeam(Reference careTeam) { + if (!complexProperty.hasCareTeam()) { + complexProperty.setCareTeam(new ArrayList<>()); + } + + complexProperty.addCareTeam(careTeam); + return this; + } + + public CarePlanBuilder buildAddresses(List addresses) { + complexProperty.setAddresses(addresses); + return this; + } + + public CarePlanBuilder buildAddresses(Reference address) { + if (!complexProperty.hasAddresses()) { + complexProperty.setAddresses(new ArrayList<>()); + } + + complexProperty.addAddresses(address); + return this; + } + + public CarePlanBuilder buildSupportingInfo(List supportingInfo) { + complexProperty.setSupportingInfo(supportingInfo); + return this; + } + + public CarePlanBuilder buildSupportingInfo(Reference supportingInfo) { + if (!complexProperty.hasSupportingInfo()) { + complexProperty.setSupportingInfo(new ArrayList<>()); + } + + complexProperty.addSupportingInfo(supportingInfo); + return this; + } + + public CarePlanBuilder buildGoal(List goals) { + complexProperty.setGoal(goals); + return this; + } + + public CarePlanBuilder buildGoal(Reference goal) { + if (!complexProperty.hasGoal()) { + complexProperty.setGoal(new ArrayList<>()); + } + + complexProperty.addGoal(goal); + return this; + } + + public CarePlanBuilder buildActivity(List activities) { + complexProperty.setActivity(activities); + return this; + } + + public CarePlanBuilder buildActivity(CarePlan.CarePlanActivityComponent activity) { + if (!complexProperty.hasActivity()) { + complexProperty.setActivity(Collections.singletonList(new CarePlan.CarePlanActivityComponent())); + } + + complexProperty.getActivity().add(activity); + return this; + } + + public CarePlanBuilder buildNotes(List notes) { + complexProperty.setNote(notes); + return this; + } + + public CarePlanBuilder buildNotes(Annotation note) { + if (!complexProperty.hasNote()) { + complexProperty.setNote(new ArrayList<>()); + } + + complexProperty.addNote(note); + return this; + } + + public CarePlanBuilder buildLanguage(String language) { + complexProperty.setLanguage(language); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CodeableConceptBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CodeableConceptBuilder.java new file mode 100644 index 00000000000..771a10485f5 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CodeableConceptBuilder.java @@ -0,0 +1,33 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.CodeableConcept; +import org.hl7.fhir.dstu3.model.Coding; + +import java.util.ArrayList; +import java.util.List; + +public class CodeableConceptBuilder extends BaseBuilder { + + public CodeableConceptBuilder() { + super(new CodeableConcept()); + } + + public CodeableConceptBuilder buildCoding(List coding) { + complexProperty.setCoding(coding); + return this; + } + + public CodeableConceptBuilder buildCoding(Coding coding) { + if (!complexProperty.hasCoding()) { + complexProperty.setCoding(new ArrayList<>()); + } + + complexProperty.addCoding(coding); + return this; + } + + public CodeableConceptBuilder buildText(String text) { + complexProperty.setText(text); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CodingBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CodingBuilder.java new file mode 100644 index 00000000000..3e12a318141 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/CodingBuilder.java @@ -0,0 +1,35 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.Coding; + +public class CodingBuilder extends BaseBuilder { + + public CodingBuilder() { + super(new Coding()); + } + + public CodingBuilder buildSystem(String system) { + complexProperty.setSystem(system); + return this; + } + + public CodingBuilder buildVersion(String version) { + complexProperty.setVersion(version); + return this; + } + + public CodingBuilder buildCode(String code) { + complexProperty.setCode(code); + return this; + } + + public CodingBuilder buildDisplay(String display) { + complexProperty.setDisplay(display); + return this; + } + + public CodingBuilder buildUserSelected(boolean selected) { + complexProperty.setUserSelected(selected); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/IdentifierBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/IdentifierBuilder.java new file mode 100644 index 00000000000..b31dcec74ee --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/IdentifierBuilder.java @@ -0,0 +1,49 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.CodeableConcept; +import org.hl7.fhir.dstu3.model.Identifier; +import org.hl7.fhir.dstu3.model.Period; +import org.hl7.fhir.dstu3.model.Reference; +import org.hl7.fhir.exceptions.FHIRException; + +public class IdentifierBuilder extends BaseBuilder { + + public IdentifierBuilder() { + super(new Identifier()); + } + + public IdentifierBuilder buildUse(Identifier.IdentifierUse use) { + complexProperty.setUse(use); + return this; + } + + public IdentifierBuilder buildUse(String use) throws FHIRException { + complexProperty.setUse(Identifier.IdentifierUse.fromCode(use)); + return this; + } + + public IdentifierBuilder buildType(CodeableConcept type) { + complexProperty.setType(type); + return this; + } + + public IdentifierBuilder buildSystem(String system) { + complexProperty.setSystem(system); + return this; + } + + public IdentifierBuilder buildValue(String value) { + complexProperty.setValue(value); + return this; + } + + public IdentifierBuilder buildPeriod(Period period) { + complexProperty.setPeriod(period); + return this; + } + + public IdentifierBuilder buildAssigner(Reference assigner) { + complexProperty.setAssigner(assigner); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/JavaDateBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/JavaDateBuilder.java new file mode 100644 index 00000000000..2ed1545a8dd --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/JavaDateBuilder.java @@ -0,0 +1,18 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.opencds.cqf.cql.runtime.DateTime; + +import java.util.Date; + +public class JavaDateBuilder extends BaseBuilder { + + public JavaDateBuilder() { + super(new Date()); + } + + public JavaDateBuilder buildFromDateTime(DateTime dateTime) { + org.joda.time.DateTime dt = new org.joda.time.DateTime(dateTime.getPartial()); + complexProperty = dt.toDate(); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/PeriodBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/PeriodBuilder.java new file mode 100644 index 00000000000..b57a9142f77 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/PeriodBuilder.java @@ -0,0 +1,22 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.Period; + +import java.util.Date; + +public class PeriodBuilder extends BaseBuilder { + + public PeriodBuilder() { + super(new Period()); + } + + public PeriodBuilder buildStart(Date start) { + complexProperty.setStart(start); + return this; + } + + public PeriodBuilder buildEnd(Date end) { + complexProperty.setEnd(end); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ReferenceBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ReferenceBuilder.java new file mode 100644 index 00000000000..1d19dce0123 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ReferenceBuilder.java @@ -0,0 +1,26 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.Identifier; +import org.hl7.fhir.dstu3.model.Reference; + +public class ReferenceBuilder extends BaseBuilder { + + public ReferenceBuilder() { + super(new Reference()); + } + + public ReferenceBuilder buildReference(String reference) { + complexProperty.setReference(reference); + return this; + } + + public ReferenceBuilder buildIdentifier(Identifier identifier) { + complexProperty.setIdentifier(identifier); + return this; + } + + public ReferenceBuilder buildDisplay(String display) { + complexProperty.setDisplay(display); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetBuider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetBuider.java new file mode 100644 index 00000000000..545b146d882 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetBuider.java @@ -0,0 +1,47 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.Enumerations; +import org.hl7.fhir.dstu3.model.ValueSet; +import org.hl7.fhir.exceptions.FHIRException; + +public class ValueSetBuider extends BaseBuilder { + + public ValueSetBuider(ValueSet complexProperty) { + super(complexProperty); + } + + public ValueSetBuider buildId(String id) { + complexProperty.setId(id); + return this; + } + + public ValueSetBuider buildUrl(String url) { + complexProperty.setUrl(url); + return this; + } + + public ValueSetBuider buildTitle(String title) { + complexProperty.setTitle(title); + return this; + } + + public ValueSetBuider buildStatus() { + complexProperty.setStatus(Enumerations.PublicationStatus.DRAFT); + return this; + } + + public ValueSetBuider buildStatus(String status) throws FHIRException { + complexProperty.setStatus(Enumerations.PublicationStatus.fromCode(status)); + return this; + } + + public ValueSetBuider buildStatus(Enumerations.PublicationStatus status) { + complexProperty.setStatus(status); + return this; + } + + public ValueSetBuider buildCompose(ValueSet.ValueSetComposeComponent compose) { + complexProperty.setCompose(compose); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetComposeBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetComposeBuilder.java new file mode 100644 index 00000000000..496f4f3669e --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetComposeBuilder.java @@ -0,0 +1,22 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.ValueSet; + +import java.util.List; + +public class ValueSetComposeBuilder extends BaseBuilder { + + public ValueSetComposeBuilder(ValueSet.ValueSetComposeComponent complexProperty) { + super(complexProperty); + } + + public ValueSetComposeBuilder buildIncludes(List includes) { + complexProperty.setInclude(includes); + return this; + } + + public ValueSetComposeBuilder buildIncludes(ValueSet.ConceptSetComponent include) { + complexProperty.addInclude(include); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetIncludesBuilder.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetIncludesBuilder.java new file mode 100644 index 00000000000..02cd69eff71 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/builders/ValueSetIncludesBuilder.java @@ -0,0 +1,37 @@ +package ca.uhn.fhir.jpa.cqf.ruler.builders; + +import org.hl7.fhir.dstu3.model.ValueSet; + +import java.util.List; + +public class ValueSetIncludesBuilder extends BaseBuilder { + + public ValueSetIncludesBuilder(ValueSet.ConceptSetComponent complexProperty) { + super(complexProperty); + } + + public ValueSetIncludesBuilder buildSystem(String system) { + complexProperty.setSystem(system); + return this; + } + + public ValueSetIncludesBuilder buildVersion(String version) { + complexProperty.setVersion(version); + return this; + } + + public ValueSetIncludesBuilder buildConcept(List concepts) { + complexProperty.setConcept(concepts); + return this; + } + + public ValueSetIncludesBuilder buildConcept(ValueSet.ConceptReferenceComponent concept) { + complexProperty.addConcept(concept); + return this; + } + + public ValueSetIncludesBuilder buildConcept(String code, String display) { + complexProperty.addConcept(new ValueSet.ConceptReferenceComponent().setCode(code).setDisplay(display)); + return this; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsCard.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsCard.java new file mode 100644 index 00000000000..1a4810f829e --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsCard.java @@ -0,0 +1,353 @@ +package ca.uhn.fhir.jpa.cqf.ruler.cds; + +import ca.uhn.fhir.context.FhirContext; +import com.google.gson.*; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.json.simple.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Christopher on 5/4/2017. + */ +public class CdsCard { + + private String summary; + private String detail; + private String indicator; + + public boolean hasSummary() { + return this.summary != null && !this.summary.isEmpty(); + } + public String getSummary() { + return this.summary; + } + public CdsCard setSummary(String summary) { + this.summary = summary; + return this; + } + + public boolean hasDetail() { + return this.detail != null && !this.detail.isEmpty(); + } + public String getDetail() { + return this.detail; + } + public CdsCard setDetail(String detail) { + this.detail = detail; + return this; + } + + public boolean hasIndicator() { + return this.indicator != null && !this.indicator.isEmpty(); + } + public String getIndicator() { + return this.detail; + } + public CdsCard setIndicator(String indicator) { + this.indicator = indicator; + return this; + } + + + private Source source; + public static class Source { + private String label; + private String url; + + public boolean hasLabel() { + return this.label != null && !this.label.isEmpty(); + } + public String getLabel() { + return this.label; + } + public CdsCard.Source setLabel(String label) { + this.label = label; + return this; + } + + public boolean hasUrl() { + return this.url != null && !this.url.isEmpty(); + } + public String getUrl() { + return this.url; + } + public CdsCard.Source setUrl(String url) { + this.url = url; + return this; + } + } + public boolean hasSource() { + return source.hasLabel() || source.hasUrl(); + } + public Source getSource() { + return this.source; + } + public CdsCard setSource(Source source) { + this.source = source; + return this; + } + + + private List suggestions; + public static class Suggestions { + private String label; + private String uuid; + private List actions; + + public boolean hasLabel() { + return this.label != null && !this.label.isEmpty(); + } + public String getLabel() { + return this.label; + } + public CdsCard.Suggestions setLabel(String label) { + this.label = label; + return this; + } + + public boolean hasUuid() { + return this.uuid != null && !this.uuid.isEmpty(); + } + public String getUuid() { + return this.uuid; + } + public CdsCard.Suggestions setUuid(String uuid) { + this.uuid = uuid; + return this; + } + + public boolean hasActions() { + return this.actions != null && !this.actions.isEmpty(); + } + public List getActions() { + return this.actions; + } + public CdsCard.Suggestions setActions(List actions) { + this.actions = actions; + return this; + } + + public static class Action { + enum ActionType {create, update, delete} + + private ActionType type; + private String description; + private IBaseResource resource; + + public boolean hasType() { + return this.type != null; + } + public ActionType getType() { + return this.type; + } + public Action setType(ActionType type) { + this.type = type; + return this; + } + + public boolean hasDescription() { + return this.description != null && !this.description.isEmpty(); + } + public String getDescription() { + return this.description; + } + public Action setDescription(String description) { + this.description = description; + return this; + } + + public boolean hasResource() { + return this.resource != null; + } + public IBaseResource getResource() { + return this.resource; + } + public Action setResource(IBaseResource resource) { + this.resource = resource; + return this; + } + } + } + public boolean hasSuggestions() { + return this.suggestions != null && !this.suggestions.isEmpty(); + } + public List getSuggestions() { + return this.suggestions; + } + public CdsCard setSuggestions(List suggestions) { + this.suggestions = suggestions; + return this; + } + + + private List links; + public static class Links { + private String label; + private String url; + private String type; + + public boolean hasLabel() { + return this.label != null && !this.label.isEmpty(); + } + public String getLabel() { + return this.label; + } + public CdsCard.Links setLabel(String label) { + this.label = label; + return this; + } + + public boolean hasUrl() { + return this.url != null && !this.url.isEmpty(); + } + public String getUrl() { + return this.url; + } + public CdsCard.Links setUrl(String url) { + this.url = url; + return this; + } + + public boolean hasType() { + return this.type != null && !this.type.isEmpty(); + } + public String getType() { + return this.type; + } + public CdsCard.Links setType(String type) { + this.type = type; + return this; + } + } + public boolean hasLinks() { + return this.links != null && !this.links.isEmpty(); + } + public List getLinks() { + return this.links; + } + public CdsCard setLinks(List links) { + this.links = links; + return this; + } + + + public CdsCard() { + this.source = new Source(); + this.suggestions = new ArrayList<>(); + this.links = new ArrayList<>(); + } + + public JsonObject toJson() { + JsonObject card = new JsonObject(); + if (hasSummary()) { + card.addProperty("summary", summary); + } + + if (hasIndicator()) { + card.addProperty("indicator", indicator); + } + + if (hasDetail()) { + card.addProperty("detail", detail); + } + + // TODO: Source + + + if (hasSuggestions()) { + JsonArray suggestionArray = new JsonArray(); + for (Suggestions suggestion : getSuggestions()) { + JsonObject suggestionObj = new JsonObject(); + if (suggestion.hasLabel()) { + suggestionObj.addProperty("label", suggestion.getLabel()); + } + if (suggestion.hasUuid()) { + suggestionObj.addProperty("uuid", suggestion.getUuid()); + } + if (suggestion.hasActions()) { + JsonArray actionArray = new JsonArray(); + for (Suggestions.Action action : suggestion.getActions()) { + JsonObject actionObj = new JsonObject(); + if (action.hasDescription()) { + actionObj.addProperty("description", action.getDescription()); + } + if (action.hasType()) { + actionObj.addProperty("type", action.getType().toString()); + } + if (action.hasResource()) { + JsonElement res = new JsonParser().parse(FhirContext.forDstu3().newJsonParser().setPrettyPrint(true).encodeResourceToString(action.getResource())); + actionObj.add("resource", res); + } + actionArray.add(actionObj); + } + suggestionObj.add("actions", actionArray); + } + suggestionArray.add(suggestionObj); + } + card.add("suggestions", suggestionArray); + } + + if (hasLinks()) { + JsonArray linksArray = new JsonArray(); + for (Links linkElement : getLinks()) { + JsonObject link = new JsonObject(); + if (linkElement.hasLabel()) { + link.addProperty("label", linkElement.getLabel()); + } + + if (linkElement.hasUrl()) { + link.addProperty("url", linkElement.getUrl()); + } + + if (linkElement.hasType()) { + link.addProperty("type", linkElement.getType()); + } + linksArray.add(link); + } + card.add("links", linksArray); + } + return card; + } + +// public JSONObject toJson() { +// JSONObject card = new JSONObject(); +// if (hasSummary()) { +// card.put("summary", summary); +// } +// if (hasIndicator()) { +// card.put("indicator", indicator); +// } +// if (hasDetail()) { +// card.put("detail", detail); +// } +// // TODO: Source & Suggestions +// if (hasLinks()) { +// JSONArray linksArray = new JSONArray(); +// for (Links linkElement : getLinks()) { +// JSONObject link = new JSONObject(); +// if (linkElement.hasLabel()) { +// link.put("label", linkElement.getLabel()); +// } +// if (linkElement.hasUrl()) { +// link.put("url", linkElement.getUrl()); +// } +// if (linkElement.hasType()) { +// link.put("type", linkElement.getType()); +// } +// linksArray.add(link); +// } +// card.put("links", linksArray); +// } +// return card; +// } + + public JSONObject returnSuccess() { + JSONObject success = new JSONObject(); + success.put("summary", "Success"); + success.put("indicator", "success"); + success.put("detail", "The MME is within the recommended range."); + return success; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsHooksHelper.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsHooksHelper.java new file mode 100644 index 00000000000..9de320a46fe --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsHooksHelper.java @@ -0,0 +1,70 @@ +package ca.uhn.fhir.jpa.cqf.ruler.cds; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Created by Christopher Schuler on 5/1/2017. + */ +public class CdsHooksHelper { + + public static void DisplayDiscovery(HttpServletResponse response) throws IOException { + response.setContentType("application/json"); + + JSONObject jsonResponse = new JSONObject(); + JSONArray jsonArray = new JSONArray(); + + JSONObject opioidGuidance = new JSONObject(); + opioidGuidance.put("hook", "medication-prescribe"); + opioidGuidance.put("name", "Opioid Morphine Milligram Equivalence (MME) Guidance Service"); + opioidGuidance.put("description", "CDS Service that finds the MME of an opioid medication and provides guidance to the prescriber if the MME exceeds the recommended range."); + opioidGuidance.put("id", "cdc-opioid-guidance"); + + JSONObject prefetchContent = new JSONObject(); + prefetchContent.put("medication", "MedicationOrder?patient={{Patient.id}}&status=active"); + + opioidGuidance.put("prefetch", prefetchContent); + + jsonArray.add(opioidGuidance); + +// JSONObject medicationPrescribe = new JSONObject(); +// medicationPrescribe.put("hook", "medication-prescribe"); +// medicationPrescribe.put("name", "User-defined medication-prescribe service"); +// medicationPrescribe.put("description", "Enables user to define a CDS Hooks service using naming conventions"); +// medicationPrescribe.put("id", "user-medication-prescribe"); +// +// medicationPrescribe.put("prefetch", prefetchContent); +// +// jsonArray.add(medicationPrescribe); +// + JSONObject patientView = new JSONObject(); + patientView.put("hook", "patient-view"); + patientView.put("name", "Zika Virus Intervention"); + patientView.put("description", "Identifies possible Zika exposure and offers suggestions for suggested actions for pregnant patients"); + patientView.put("id", "zika-virus-intervention"); + + prefetchContent = new JSONObject(); + prefetchContent.put("patient", "Patient/{{Patient.id}}"); + patientView.put("prefetch", prefetchContent); + + jsonArray.add(patientView); + + jsonResponse.put("services", jsonArray); + + response.getWriter().println(getPrettyJson(jsonResponse.toJSONString())); + } + + public static String getPrettyJson(String uglyJson) { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + JsonParser parser = new JsonParser(); + JsonElement element = parser.parse(uglyJson); + return gson.toJson(element); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsHooksRequest.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsHooksRequest.java new file mode 100644 index 00000000000..8a5620695a9 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsHooksRequest.java @@ -0,0 +1,158 @@ +package ca.uhn.fhir.jpa.cqf.ruler.cds; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.model.dstu2.resource.Bundle; +import com.google.gson.*; +import ca.uhn.fhir.jpa.cqf.ruler.exceptions.MissingHookException; + +import java.io.IOException; +import java.io.Reader; + +public class CdsHooksRequest { + + private JsonObject requestJson; + + private String hook; + private String hookInstance; + private String fhirServerEndpoint; + + // TODO + //private Object oauth; + + private String redirectEndpoint; + private String userReference; // this is really a Reference (Resource/ID) + private String patientId; + private String encounterId; + private JsonArray context; + private JsonObject prefetch; + + public CdsHooksRequest(Reader cdsHooksRequest) throws IOException { + JsonParser parser = new JsonParser(); + this.requestJson = parser.parse(cdsHooksRequest).getAsJsonObject(); + + this.hook = requestJson.getAsJsonPrimitive("hook").getAsString(); + + if (this.hook == null || this.hook.isEmpty()) { + throw new MissingHookException("The CDS Service call must contain the hook that triggered its initiation."); + } + } + + public String getHook() { + return this.hook; + } + + public String getHookInstance() { + if (hookInstance == null) { + String temp = requestJson.getAsJsonPrimitive("hookInstance").getAsString(); + this.hookInstance = temp == null ? "" : temp; + } + return hookInstance; + } + + public String getFhirServerEndpoint() { + if (fhirServerEndpoint == null) { + String temp = requestJson.getAsJsonPrimitive("fhirServer").getAsString(); + this.fhirServerEndpoint = temp == null || temp.isEmpty() ? "http://measure.eval.kanvix.com/cqf-ruler/baseDstu3" : temp; + } + return fhirServerEndpoint; + } + + public String getRedirectEndpoint() { + if (redirectEndpoint == null) { + String temp = requestJson.getAsJsonPrimitive("redirect").getAsString(); + this.redirectEndpoint = temp == null ? "" : temp; + } + return redirectEndpoint; + } + + public String getUserReference() { + if (userReference == null) { + String temp = requestJson.getAsJsonPrimitive("user").getAsString(); + this.userReference = temp == null ? "" : temp; + } + return userReference; + } + + public String getPatientId() { + if (patientId == null) { + String temp = requestJson.getAsJsonPrimitive("patient").getAsString(); + this.patientId = temp == null ? "" : temp; + } + return patientId; + } + + public String getEncounterId() { + if (encounterId == null) { + String temp = requestJson.getAsJsonPrimitive("encounter").getAsString(); + this.encounterId = temp == null ? "" : temp; + } + return encounterId; + } + + public JsonArray getContext() { + if (context == null) { + JsonArray temp = requestJson.getAsJsonArray("context"); + this.context = temp == null ? new JsonArray() : temp; + } + return context; + } + + /* + + Prefetch format: + "prefetch": { + "medication": { // for medication-prescribe and order-review + "response": {}, + "resources": [] + }, + "diagnosticOrders": { // for order-review + "response": {}, + "resources": [] + }, + "deviceUseRequests": { // for order-review + "response": {}, + "resources": [] + }, + "procedureRequests": { // for order-review + "response": {}, + "resources": [] + }, + "supplyRequests": { // for order-review + "response": {}, + "resources": [] + }, + "patientToGreet": { // for patient-view + "response": {}, + "resource": {} + } + } + + */ + + public JsonObject getPrefetch() { + if (prefetch == null) { + JsonObject temp = requestJson.getAsJsonObject("prefetch"); + this.prefetch = temp == null ? new JsonObject() : temp; + } + return prefetch; + } + + public void setPrefetch(JsonObject prefetch) { + this.prefetch = prefetch; + } + + // Convenience method + // Populates resources array for sub-element of prefetch i.e. "supplyRequests" for order-review hook + // TODO - this won't do for patient-view + public void setPrefetch(Bundle prefetchBundle, String sub) { + JsonObject subJson = new JsonObject(); + JsonArray resources = new JsonArray(); + for (Bundle.Entry entry : prefetchBundle.getEntry()) { + JsonParser parser = new JsonParser(); + JsonObject resource = parser.parse(FhirContext.forDstu2().newJsonParser().encodeResourceToString(entry.getResource())).getAsJsonObject(); + resources.add(resource); + } + subJson.add("resources", resources); + this.prefetch.add(sub, subJson); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsRequestProcessor.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsRequestProcessor.java new file mode 100644 index 00000000000..46ec23fc383 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/CdsRequestProcessor.java @@ -0,0 +1,122 @@ +package ca.uhn.fhir.jpa.cqf.ruler.cds; + +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import ca.uhn.fhir.model.primitive.IdDt; +import org.hl7.fhir.dstu3.model.*; +import org.opencds.cqf.cql.data.fhir.BaseFhirDataProvider; +import org.opencds.cqf.cql.execution.Context; + +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public abstract class CdsRequestProcessor implements Processor { + CdsHooksRequest request; + PlanDefinition planDefinition; + LibraryResourceProvider libraryResourceProvider; + + CdsRequestProcessor(CdsHooksRequest request, PlanDefinition planDefinition, LibraryResourceProvider libraryResourceProvider) { + this.request = request; + this.planDefinition = planDefinition; + this.libraryResourceProvider = libraryResourceProvider; + } + + List resolveActions(Context executionContext) { + List cards = new ArrayList<>(); + + walkAction(executionContext, cards, planDefinition.getAction()); + + return cards; + } + + private void walkAction(Context executionContext, List cards, List actions) { + for (PlanDefinition.PlanDefinitionActionComponent action : actions) { + boolean conditionsMet = true; + for (PlanDefinition.PlanDefinitionActionConditionComponent condition: action.getCondition()) { + if (condition.getKind() == PlanDefinition.ActionConditionKind.APPLICABILITY) { + if (!condition.hasExpression()) { + continue; + } + + Object result = executionContext.resolveExpressionRef(condition.getExpression()).getExpression().evaluate(executionContext); + + if (!(result instanceof Boolean)) { + continue; + } + + if (!(Boolean) result) { + conditionsMet = false; + } + } + } + if (conditionsMet) { + + /* + Cases: + Definition element provides guidance for action + Nested actions + Standardized CQL (when first 2 aren't present) + */ + + if (action.hasDefinition()) { + if (action.getDefinition().getReferenceElement().getResourceType().equals("ActivityDefinition")) { + BaseFhirDataProvider provider = (BaseFhirDataProvider) executionContext.resolveDataProvider(new QName("http://hl7.org/fhir", "")); + Parameters inParams = new Parameters(); + inParams.addParameter().setName("patient").setValue(new StringType(request.getPatientId())); + + Parameters outParams = provider.getFhirClient() + .operation() + .onInstance(new IdDt("ActivityDefinition", action.getDefinition().getReferenceElement().getIdPart())) + .named("$apply") + .withParameters(inParams) + .useHttpGet() + .execute(); + + List response = outParams.getParameter(); + Resource resource = response.get(0).getResource(); + + if (resource == null) { + continue; + } + + // TODO - currently only have suggestions that create resources - implement delete and update. + CdsCard card = new CdsCard(); + card.setIndicator("info"); + CdsCard.Suggestions suggestion = new CdsCard.Suggestions(); + suggestion.setActions( + Collections.singletonList( + new CdsCard.Suggestions.Action() + .setType(CdsCard.Suggestions.Action.ActionType.create) + .setResource(resource) + ) + ); + card.getSuggestions().add(suggestion); + cards.add(card); + } + + else { + // PlanDefinition $apply + // TODO + + // TODO - suggestion to create CarePlan + } + } + + else if (action.hasAction()) { + walkAction(executionContext, cards, action.getAction()); + } + + // TODO - dynamicValues + + else { + CdsCard card = new CdsCard(); + card.setSummary((String) executionContext.resolveExpressionRef("getSummary").getExpression().evaluate(executionContext)); + card.setDetail((String) executionContext.resolveExpressionRef("getDetail").getExpression().evaluate(executionContext)); + card.setIndicator((String) executionContext.resolveExpressionRef("getIndicator").getExpression().evaluate(executionContext)); + cards.add(card); + } + } + } + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/MedicationPrescribeProcessor.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/MedicationPrescribeProcessor.java new file mode 100644 index 00000000000..18ecc9933fb --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/MedicationPrescribeProcessor.java @@ -0,0 +1,121 @@ +package ca.uhn.fhir.jpa.cqf.ruler.cds; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import ca.uhn.fhir.model.dstu2.resource.Bundle; +import ca.uhn.fhir.model.dstu2.resource.MedicationOrder; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.hl7.fhir.dstu3.model.MedicationRequest; +import org.hl7.fhir.dstu3.model.PlanDefinition; +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.instance.model.api.IBaseResource; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibraryLoader; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibrarySourceProvider; +import org.opencds.cqf.cql.data.fhir.BaseFhirDataProvider; +import org.opencds.cqf.cql.data.fhir.FhirDataProviderStu3; +import org.opencds.cqf.cql.execution.Context; +import org.opencds.cqf.cql.execution.LibraryLoader; +import org.opencds.cqf.cql.terminology.fhir.FhirTerminologyProvider; +import ca.uhn.fhir.jpa.cqf.ruler.exceptions.MissingContextException; +import ca.uhn.fhir.jpa.cqf.ruler.helpers.Dstu2ToStu3; + +import java.util.ArrayList; +import java.util.List; + +public class MedicationPrescribeProcessor extends CdsRequestProcessor { + + MedicationRequest contextPrescription; + List activePrescriptions; + + private ModelManager modelManager; + private ModelManager getModelManager() { + if (modelManager == null) { + modelManager = new ModelManager(); + } + return modelManager; + } + + private LibraryManager libraryManager; + private LibraryManager getLibraryManager() { + if (libraryManager == null) { + libraryManager = new LibraryManager(getModelManager()); + libraryManager.getLibrarySourceLoader().clearProviders(); + libraryManager.getLibrarySourceLoader().registerProvider(getLibrarySourceProvider()); + } + return libraryManager; + } + + private LibraryLoader libraryLoader; + private LibraryLoader getLibraryLoader() { + if (libraryLoader == null) { + libraryLoader = new STU3LibraryLoader(libraryResourceProvider, getLibraryManager(), getModelManager()); + } + return libraryLoader; + } + + private STU3LibrarySourceProvider librarySourceProvider; + private STU3LibrarySourceProvider getLibrarySourceProvider() { + if (librarySourceProvider == null) { + librarySourceProvider = new STU3LibrarySourceProvider(libraryResourceProvider); + } + return librarySourceProvider; + } + + public MedicationPrescribeProcessor(CdsHooksRequest request, PlanDefinition planDefinition, LibraryResourceProvider libraryResourceProvider) + throws FHIRException + { + super(request, planDefinition, libraryResourceProvider); + + this.activePrescriptions = new ArrayList<>(); + resolveContextPrescription(); + resolveActivePrescriptions(); + } + + @Override + public List process() { + // TODO - need a better way to determine library id + Library library = getLibraryLoader().load(new org.cqframework.cql.elm.execution.VersionedIdentifier().withId("medication-prescribe")); + + BaseFhirDataProvider dstu3Provider = new FhirDataProviderStu3().setEndpoint(request.getFhirServerEndpoint()); + // TODO - assuming terminology service is same as data provider - not a great assumption... + dstu3Provider.setTerminologyProvider(new FhirTerminologyProvider().withEndpoint(request.getFhirServerEndpoint())); + dstu3Provider.setExpandValueSets(true); + + Context executionContext = new Context(library); + executionContext.registerLibraryLoader(getLibraryLoader()); + executionContext.registerDataProvider("http://hl7.org/fhir", dstu3Provider); + executionContext.setExpressionCaching(true); + executionContext.setParameter(null, "Orders", activePrescriptions); + + return resolveActions(executionContext); + } + + private void resolveContextPrescription() throws FHIRException { + if (request.getContext().size() == 0) { + throw new MissingContextException("The medication-prescribe request requires the context to contain a prescription order."); + } + + String resourceName = request.getContext().get(0).getAsJsonObject().getAsJsonPrimitive("resourceType").getAsString(); + this.contextPrescription = getMedicationRequest(resourceName, FhirContext.forDstu2().newJsonParser().parseResource(request.getContext().get(0).toString())); + } + + private void resolveActivePrescriptions() throws FHIRException { + this.activePrescriptions.add(contextPrescription); // include the context prescription + String resourceName; + Bundle bundle = (Bundle) FhirContext.forDstu2().newJsonParser().parseResource(request.getPrefetch().getAsJsonObject("medication").getAsJsonObject("resource").toString()); + for (Bundle.Entry entry : bundle.getEntry()) { + this.activePrescriptions.add(getMedicationRequest(entry.getResource().getResourceName(), entry.getResource())); + } + } + + private MedicationRequest getMedicationRequest(String resourceName, IBaseResource resource) throws FHIRException { + if (resourceName.equals("MedicationOrder")) { + MedicationOrder order = (MedicationOrder) resource; + return Dstu2ToStu3.resolveMedicationRequest(order); + } + + return (MedicationRequest) resource; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/OpioidGuidanceProcessor.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/OpioidGuidanceProcessor.java new file mode 100644 index 00000000000..8be289f7bb5 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/OpioidGuidanceProcessor.java @@ -0,0 +1,115 @@ +package ca.uhn.fhir.jpa.cqf.ruler.cds; + +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelInfoLoader; +import org.cqframework.cql.cql2elm.ModelInfoProvider; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.hl7.elm.r1.VersionedIdentifier; +import org.hl7.elm_modelinfo.r1.ModelInfo; +import org.hl7.fhir.dstu3.model.PlanDefinition; +import org.hl7.fhir.exceptions.FHIRException; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibraryLoader; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibrarySourceProvider; +import org.opencds.cqf.cql.data.fhir.BaseFhirDataProvider; +import org.opencds.cqf.cql.data.fhir.FhirDataProviderStu3; +import org.opencds.cqf.cql.execution.Context; +import org.opencds.cqf.cql.execution.LibraryLoader; +import ca.uhn.fhir.jpa.cqf.ruler.omtk.OmtkDataProvider; + +import javax.xml.bind.JAXB; +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.List; + +public class OpioidGuidanceProcessor extends MedicationPrescribeProcessor { + + private ModelManager modelManager; + private ModelManager getModelManager() { + if (modelManager == null) { + modelManager = new ModelManager(); + ModelInfoProvider infoProvider = () -> { + Path p = Paths.get("src/main/resources/cds/OMTK-modelinfo-0.1.0.xml").toAbsolutePath(); + return JAXB.unmarshal(new File(p.toString()), ModelInfo.class); + }; + ModelInfoLoader.registerModelInfoProvider(new VersionedIdentifier().withId("OMTK").withVersion("0.1.0"), infoProvider); + } + return modelManager; + } + + private LibraryManager libraryManager; + private LibraryManager getLibraryManager() { + if (libraryManager == null) { + libraryManager = new LibraryManager(getModelManager()); + libraryManager.getLibrarySourceLoader().clearProviders(); + libraryManager.getLibrarySourceLoader().registerProvider(getLibrarySourceProvider()); + } + return libraryManager; + } + + private LibraryLoader libraryLoader; + private LibraryLoader getLibraryLoader() { + if (libraryLoader == null) { + libraryLoader = new STU3LibraryLoader(libraryResourceProvider, getLibraryManager(), getModelManager()); + } + return libraryLoader; + } + + private STU3LibrarySourceProvider librarySourceProvider; + private STU3LibrarySourceProvider getLibrarySourceProvider() { + if (librarySourceProvider == null) { + librarySourceProvider = new STU3LibrarySourceProvider(libraryResourceProvider); + } + return librarySourceProvider; + } + + public OpioidGuidanceProcessor(CdsHooksRequest request, PlanDefinition planDefinition, LibraryResourceProvider libraryResourceProvider) + throws FHIRException + { + super(request, planDefinition, libraryResourceProvider); + } + + @Override + public List process() { + + // read opioid library + Library library = getLibraryLoader().load(new org.cqframework.cql.elm.execution.VersionedIdentifier().withId("OpioidCdsStu3").withVersion("0.1.0")); + + // resolve data providers + // the db file is issued to properly licensed implementers -- see README for more info + String path = Paths.get("src/main/resources/cds/OpioidManagementTerminologyKnowledge.db").toAbsolutePath().toString().replace("\\", "/"); + String connString = "jdbc:sqlite://" + path; + OmtkDataProvider omtkProvider = new OmtkDataProvider(connString); + BaseFhirDataProvider dstu3Provider = new FhirDataProviderStu3().setEndpoint(request.getFhirServerEndpoint()); + + Context executionContext = new Context(library); + executionContext.registerLibraryLoader(getLibraryLoader()); + executionContext.registerDataProvider("http://org.opencds/opioid-cds", omtkProvider); + executionContext.registerDataProvider("http://hl7.org/fhir", dstu3Provider); + executionContext.setExpressionCaching(true); +// executionContext.setEnableTraceLogging(true); + executionContext.setParameter(null, "Orders", activePrescriptions); + + List cards = resolveActions(executionContext); + if (cards.isEmpty()) { + cards.add( + new CdsCard() + .setSummary("Success") + .setDetail("Prescription satisfies recommendation #5 of the cdc opioid guidance.") + .setIndicator("info") + .setLinks( + Collections.singletonList( + new CdsCard.Links() + .setLabel("CDC Recommendations for prescribing opioids") + .setUrl("https://guidelines.gov/summaries/summary/50153/cdc-guideline-for-prescribing-opioids-for-chronic-pain---united-states-2016#420") + ) + ) + ); + } + + return cards; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/OrderReviewProcessor.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/OrderReviewProcessor.java new file mode 100644 index 00000000000..d3a22bbbe9c --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/OrderReviewProcessor.java @@ -0,0 +1,93 @@ +package ca.uhn.fhir.jpa.cqf.ruler.cds; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.hl7.fhir.dstu3.model.PlanDefinition; +import org.hl7.fhir.dstu3.model.ProcedureRequest; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibraryLoader; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibrarySourceProvider; +import org.opencds.cqf.cql.data.fhir.BaseFhirDataProvider; +import org.opencds.cqf.cql.data.fhir.FhirDataProviderStu3; +import org.opencds.cqf.cql.execution.Context; +import org.opencds.cqf.cql.execution.LibraryLoader; +import org.opencds.cqf.cql.terminology.fhir.FhirTerminologyProvider; +import ca.uhn.fhir.jpa.cqf.ruler.exceptions.MissingContextException; + +import java.util.List; + +public class OrderReviewProcessor extends CdsRequestProcessor { + + private ProcedureRequest contextOrder; + + private ModelManager modelManager; + private ModelManager getModelManager() { + if (modelManager == null) { + modelManager = new ModelManager(); + } + return modelManager; + } + + private LibraryManager libraryManager; + private LibraryManager getLibraryManager() { + if (libraryManager == null) { + libraryManager = new LibraryManager(getModelManager()); + libraryManager.getLibrarySourceLoader().clearProviders(); + libraryManager.getLibrarySourceLoader().registerProvider(getLibrarySourceProvider()); + } + return libraryManager; + } + + private LibraryLoader libraryLoader; + private LibraryLoader getLibraryLoader() { + if (libraryLoader == null) { + libraryLoader = new STU3LibraryLoader(libraryResourceProvider, getLibraryManager(), getModelManager()); + } + return libraryLoader; + } + + private STU3LibrarySourceProvider librarySourceProvider; + private STU3LibrarySourceProvider getLibrarySourceProvider() { + if (librarySourceProvider == null) { + librarySourceProvider = new STU3LibrarySourceProvider(libraryResourceProvider); + } + return librarySourceProvider; + } + + public OrderReviewProcessor(CdsHooksRequest request, PlanDefinition planDefinition, LibraryResourceProvider libraryResourceProvider) { + super(request, planDefinition, libraryResourceProvider); + resolveOrder(); + } + + @Override + public List process() { + // TODO - need a better way to determine library id + Library library = getLibraryLoader().load(new org.cqframework.cql.elm.execution.VersionedIdentifier().withId("OrderReview")); + + BaseFhirDataProvider dstu3Provider = new FhirDataProviderStu3().setEndpoint(request.getFhirServerEndpoint()); + // TODO - assuming terminology service is same as data provider - not a great assumption... + dstu3Provider.setTerminologyProvider(new FhirTerminologyProvider().withEndpoint(request.getFhirServerEndpoint())); + dstu3Provider.setExpandValueSets(true); + + Context executionContext = new Context(library); + executionContext.registerLibraryLoader(getLibraryLoader()); + executionContext.registerDataProvider("http://hl7.org/fhir", dstu3Provider); + executionContext.registerTerminologyProvider(dstu3Provider.getTerminologyProvider()); + executionContext.setContextValue("Patient", request.getPatientId()); + executionContext.setParameter(null, "Order", contextOrder); + executionContext.setExpressionCaching(true); + + return resolveActions(executionContext); + } + + private void resolveOrder() { + if (request.getContext().size() == 0) { + throw new MissingContextException("The order-review request requires the context to contain an order."); + } + + // Assuming STU3 here as per the example here: http://cds-hooks.org/#radiology-appropriateness + this.contextOrder = (ProcedureRequest) FhirContext.forDstu3().newJsonParser().parseResource(request.getContext().get(0).toString()); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/PatientViewProcessor.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/PatientViewProcessor.java new file mode 100644 index 00000000000..b4fe748ada5 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/PatientViewProcessor.java @@ -0,0 +1,77 @@ +package ca.uhn.fhir.jpa.cqf.ruler.cds; + +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.hl7.fhir.dstu3.model.PlanDefinition; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibraryLoader; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibrarySourceProvider; +import org.opencds.cqf.cql.data.fhir.BaseFhirDataProvider; +import org.opencds.cqf.cql.data.fhir.FhirDataProviderStu3; +import org.opencds.cqf.cql.execution.Context; +import org.opencds.cqf.cql.execution.LibraryLoader; +import org.opencds.cqf.cql.terminology.fhir.FhirTerminologyProvider; + +import java.util.List; + +public class PatientViewProcessor extends CdsRequestProcessor { + + private ModelManager modelManager; + private ModelManager getModelManager() { + if (modelManager == null) { + modelManager = new ModelManager(); + } + return modelManager; + } + + private LibraryManager libraryManager; + private LibraryManager getLibraryManager() { + if (libraryManager == null) { + libraryManager = new LibraryManager(getModelManager()); + libraryManager.getLibrarySourceLoader().clearProviders(); + libraryManager.getLibrarySourceLoader().registerProvider(getLibrarySourceProvider()); + } + return libraryManager; + } + + private LibraryLoader libraryLoader; + private LibraryLoader getLibraryLoader() { + if (libraryLoader == null) { + libraryLoader = new STU3LibraryLoader(libraryResourceProvider, getLibraryManager(), getModelManager()); + } + return libraryLoader; + } + + private STU3LibrarySourceProvider librarySourceProvider; + private STU3LibrarySourceProvider getLibrarySourceProvider() { + if (librarySourceProvider == null) { + librarySourceProvider = new STU3LibrarySourceProvider(libraryResourceProvider); + } + return librarySourceProvider; + } + + public PatientViewProcessor(CdsHooksRequest request, PlanDefinition planDefinition, LibraryResourceProvider libraryResourceProvider) { + super(request, planDefinition, libraryResourceProvider); + } + + @Override + public List process() { + // TODO - need a better way to determine library id + Library library = getLibraryLoader().load(new org.cqframework.cql.elm.execution.VersionedIdentifier().withId("patient-view")); + + BaseFhirDataProvider dstu3Provider = new FhirDataProviderStu3().setEndpoint(request.getFhirServerEndpoint()); + // TODO - assuming terminology service is same as data provider - not a great assumption... + dstu3Provider.setTerminologyProvider(new FhirTerminologyProvider().withEndpoint(request.getFhirServerEndpoint())); + dstu3Provider.setExpandValueSets(true); + + Context executionContext = new Context(library); + executionContext.registerLibraryLoader(getLibraryLoader()); + executionContext.registerDataProvider("http://hl7.org/fhir", dstu3Provider); + executionContext.registerTerminologyProvider(dstu3Provider.getTerminologyProvider()); + executionContext.setContextValue("Patient", request.getPatientId()); + executionContext.setExpressionCaching(true); + + return resolveActions(executionContext); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/Processor.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/Processor.java new file mode 100644 index 00000000000..7e3b767128a --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/cds/Processor.java @@ -0,0 +1,7 @@ +package ca.uhn.fhir.jpa.cqf.ruler.cds; + +import java.util.List; + +public interface Processor { + List process(); +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/FhirServerConfigDstu3.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/FhirServerConfigDstu3.java new file mode 100644 index 00000000000..29fbfb2435e --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/FhirServerConfigDstu3.java @@ -0,0 +1,137 @@ +package ca.uhn.fhir.jpa.cqf.ruler.config; + +import ca.uhn.fhir.jpa.config.BaseJavaConfigDstu3; +import ca.uhn.fhir.jpa.dao.DaoConfig; +import ca.uhn.fhir.jpa.util.SubscriptionsRequireManualActivationInterceptorDstu3; +import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor; +import ca.uhn.fhir.rest.server.interceptor.LoggingInterceptor; +import ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor; +import org.apache.commons.dbcp2.BasicDataSource; +import org.hibernate.jpa.HibernatePersistenceProvider; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import java.util.Properties; + +/** + * Created by Chris Schuler on 12/11/2016. + */ +@Configuration +@EnableTransactionManagement() +public class FhirServerConfigDstu3 extends BaseJavaConfigDstu3 { + + @Bean() + public DaoConfig daoConfig() { + DaoConfig retVal = new DaoConfig(); +// retVal.setSubscriptionEnabled(true); +// retVal.setSubscriptionPollDelay(5000); +// retVal.setSubscriptionPurgeInactiveAfterMillis(DateUtils.MILLIS_PER_HOUR); + retVal.setAllowMultipleDelete(true); + return retVal; + } + +// PostgreSQL config +// @Bean(destroyMethod = "close") +// public DataSource dataSource() { +// BasicDataSource retVal = new BasicDataSource(); +// retVal.setDriver(new org.postgresql.Driver()); +// retVal.setUrl("jdbc:postgresql://localhost:5432/fhir"); +// retVal.setUsername("hapi"); +// retVal.setPassword("hapi"); +// return retVal; +// } + +// Derby config + @Bean(destroyMethod = "close") + public DataSource dataSource() { + BasicDataSource retVal = new BasicDataSource(); + retVal.setDriver(new org.apache.derby.jdbc.EmbeddedDriver()); + retVal.setUrl("jdbc:derby:directory:target/jpaserver_derby_files;create=true"); + retVal.setUsername(""); + retVal.setPassword(""); + return retVal; + } + + @Bean() + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + LocalContainerEntityManagerFactoryBean retVal = new LocalContainerEntityManagerFactoryBean(); + retVal.setPersistenceUnitName("HAPI_PU"); + retVal.setDataSource(dataSource()); + retVal.setPackagesToScan("ca.uhn.fhir.jpa.entity"); + retVal.setPersistenceProvider(new HibernatePersistenceProvider()); + retVal.setJpaProperties(jpaProperties()); + return retVal; + } + +// PostgreSQL config +// private Properties jpaProperties() { +// Properties extraProperties = new Properties(); +// extraProperties.put("hibernate.dialect", org.hibernate.dialect.PostgreSQL94Dialect.class.getName()); +// extraProperties.put("hibernate.format_sql", "true"); +// extraProperties.put("hibernate.show_sql", "false"); +// extraProperties.put("hibernate.hbm2ddl.auto", "update"); +// extraProperties.put("hibernate.jdbc.batch_size", "20"); +// extraProperties.put("hibernate.cache.use_query_cache", "false"); +// extraProperties.put("hibernate.cache.use_second_level_cache", "false"); +// extraProperties.put("hibernate.cache.use_structured_entries", "false"); +// extraProperties.put("hibernate.cache.use_minimal_puts", "false"); +// extraProperties.put("hibernate.search.default.directory_provider", "filesystem"); +// extraProperties.put("hibernate.search.default.indexBase", "target/lucenefiles"); +// extraProperties.put("hibernate.search.lucene_version", "LUCENE_CURRENT"); +//// extraProperties.put("hibernate.search.default.worker.execution", "async"); +// return extraProperties; +// } + +// Derby config + private Properties jpaProperties() { + Properties extraProperties = new Properties(); + extraProperties.put("hibernate.dialect", org.hibernate.dialect.DerbyTenSevenDialect.class.getName()); + extraProperties.put("hibernate.format_sql", "true"); + extraProperties.put("hibernate.show_sql", "false"); + extraProperties.put("hibernate.hbm2ddl.auto", "update"); + extraProperties.put("hibernate.jdbc.batch_size", "20"); + extraProperties.put("hibernate.cache.use_query_cache", "false"); + extraProperties.put("hibernate.cache.use_second_level_cache", "false"); + extraProperties.put("hibernate.cache.use_structured_entries", "false"); + extraProperties.put("hibernate.cache.use_minimal_puts", "false"); + extraProperties.put("hibernate.search.default.directory_provider", "filesystem"); + extraProperties.put("hibernate.search.default.indexBase", "target/lucenefiles"); + extraProperties.put("hibernate.search.lucene_version", "LUCENE_CURRENT"); +// extraProperties.put("hibernate.search.default.worker.execution", "async"); + return extraProperties; + } + + public IServerInterceptor loggingInterceptor() { + LoggingInterceptor retVal = new LoggingInterceptor(); + retVal.setLoggerName("fhirtest.access"); + retVal.setMessageFormat( + "Path[${servletPath}] Source[${requestHeader.x-forwarded-for}] Operation[${operationType} ${operationName} ${idOrResourceName}] UA[${requestHeader.user-agent}] Params[${requestParameters}] ResponseEncoding[${responseEncodingNoDefault}]"); + retVal.setLogExceptions(true); + retVal.setErrorMessageFormat("ERROR - ${requestVerb} ${requestUrl}"); + return retVal; + } + + @Bean(autowire = Autowire.BY_TYPE) + public IServerInterceptor responseHighlighterInterceptor() { + return new ResponseHighlighterInterceptor(); + } + + @Bean(autowire = Autowire.BY_TYPE) + public IServerInterceptor subscriptionSecurityInterceptor() { + return new SubscriptionsRequireManualActivationInterceptorDstu3(); + } + + @Bean() + public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager retVal = new JpaTransactionManager(); + retVal.setEntityManagerFactory(entityManagerFactory); + return retVal; + } + +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/FhirTesterConfigDstu3.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/FhirTesterConfigDstu3.java new file mode 100644 index 00000000000..089bd874406 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/FhirTesterConfigDstu3.java @@ -0,0 +1,33 @@ +package ca.uhn.fhir.jpa.cqf.ruler.config; + +import ca.uhn.fhir.context.FhirVersionEnum; +import ca.uhn.fhir.to.FhirTesterMvcConfig; +import ca.uhn.fhir.to.TesterConfig; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * Created by Chris Schuler on 12/11/2016. + */ +@Configuration +@Import(FhirTesterMvcConfig.class) +public class FhirTesterConfigDstu3 { + + @Bean + public TesterConfig testerConfig() { + TesterConfig retVal = new TesterConfig(); + retVal + .addServer() + .withId("home") + .withFhirVersion(FhirVersionEnum.DSTU3) + .withBaseUrl("${serverBase}/baseDstu3") + .withName("Local Tester") + .addServer() + .withId("hapi") + .withFhirVersion(FhirVersionEnum.DSTU3) + .withBaseUrl("http://fhirtest.uhn.ca/baseDstu3") + .withName("Public HAPI Test Server"); + return retVal; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/STU3LibraryLoader.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/STU3LibraryLoader.java new file mode 100644 index 00000000000..25a3b8b75f1 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/STU3LibraryLoader.java @@ -0,0 +1,108 @@ +package ca.uhn.fhir.jpa.cqf.ruler.config; + +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import org.cqframework.cql.cql2elm.CqlTranslator; +import org.cqframework.cql.cql2elm.CqlTranslatorException; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.cqframework.cql.elm.execution.VersionedIdentifier; +import org.hl7.fhir.dstu3.model.IdType; +import org.opencds.cqf.cql.execution.LibraryLoader; + +import javax.xml.bind.JAXBException; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import static ca.uhn.fhir.jpa.cqf.ruler.helpers.LibraryHelper.errorsToString; +import static ca.uhn.fhir.jpa.cqf.ruler.helpers.LibraryHelper.readLibrary; +import static ca.uhn.fhir.jpa.cqf.ruler.helpers.LibraryHelper.translateLibrary; + +/** + * Created by Christopher on 1/11/2017. + */ +public class STU3LibraryLoader implements LibraryLoader { + + private LibraryManager libraryManager; + private ModelManager modelManager; + private LibraryResourceProvider provider; + private Map libraries = new HashMap<>(); + + public Map getLibraries() { + return this.libraries; + } + + public STU3LibraryLoader(LibraryResourceProvider provider, LibraryManager libraryManager, ModelManager modelManager) { + this.libraryManager = libraryManager; + this.modelManager = modelManager; + this.provider = provider; + } + + private Library resolveLibrary(VersionedIdentifier libraryIdentifier) { + if (libraryIdentifier == null) { + throw new IllegalArgumentException("Library identifier is null."); + } + + if (libraryIdentifier.getId() == null) { + throw new IllegalArgumentException("Library identifier id is null."); + } + + Library library = libraries.get(libraryIdentifier.getId()); + if (library != null && libraryIdentifier.getVersion() != null + && !libraryIdentifier.getVersion().equals(library.getIdentifier().getVersion())) { + throw new IllegalArgumentException(String.format("Could not load library %s, version %s because version %s is already loaded.", + libraryIdentifier.getId(), libraryIdentifier.getVersion(), library.getIdentifier().getVersion())); + } + else { + library = loadLibrary(libraryIdentifier); + libraries.put(libraryIdentifier.getId(), library); + } + + return library; + } + + private Library loadLibrary(VersionedIdentifier libraryIdentifier) { + IdType id = new IdType(libraryIdentifier.getId()); + org.hl7.fhir.dstu3.model.Library library = provider.getDao().read(id); + + InputStream is = null; + for (org.hl7.fhir.dstu3.model.Attachment content : library.getContent()) { + is = new ByteArrayInputStream(content.getData()); + if (content.getContentType().equals("application/elm+xml")) { + return readLibrary(is); + } + else if (content.getContentType().equals("text/cql")) { + return translateLibrary(is, libraryManager, modelManager); + } + } + + org.hl7.elm.r1.VersionedIdentifier identifier = new org.hl7.elm.r1.VersionedIdentifier() + .withId(libraryIdentifier.getId()) + .withSystem(libraryIdentifier.getSystem()) + .withVersion(libraryIdentifier.getVersion()); + + ArrayList errors = new ArrayList<>(); + org.hl7.elm.r1.Library translatedLibrary = libraryManager.resolveLibrary(identifier, errors).getLibrary(); + + if (errors.size() > 0) { + throw new IllegalArgumentException(errorsToString(errors)); + } + + try { + return readLibrary(new ByteArrayInputStream(CqlTranslator.fromStream(is == null ? new ByteArrayInputStream(new byte[]{}) : is, modelManager, libraryManager).convertToXml(translatedLibrary).getBytes(StandardCharsets.UTF_8))); + } catch (JAXBException | IOException e) { + throw new IllegalArgumentException(String.format("Errors occurred translating library %s%s.", + identifier.getId(), identifier.getVersion() != null ? ("-" + identifier.getVersion()) : "")); + } + } + + @Override + public Library load(VersionedIdentifier versionedIdentifier) { + return resolveLibrary(versionedIdentifier); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/STU3LibrarySourceProvider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/STU3LibrarySourceProvider.java new file mode 100644 index 00000000000..720778dd98f --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/config/STU3LibrarySourceProvider.java @@ -0,0 +1,35 @@ +package ca.uhn.fhir.jpa.cqf.ruler.config; + +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import org.cqframework.cql.cql2elm.LibrarySourceProvider; +import org.hl7.elm.r1.VersionedIdentifier; +import org.hl7.fhir.dstu3.model.IdType; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +/** + * Created by Christopher on 1/12/2017. + */ +public class STU3LibrarySourceProvider implements LibrarySourceProvider { + + private LibraryResourceProvider provider; + + public STU3LibrarySourceProvider(LibraryResourceProvider provider) { + this.provider = provider; + } + + @Override + public InputStream getLibrarySource(VersionedIdentifier versionedIdentifier) { + IdType id = new IdType(versionedIdentifier.getId()); + org.hl7.fhir.dstu3.model.Library lib = provider.getDao().read(id); + for (org.hl7.fhir.dstu3.model.Attachment content : lib.getContent()) { + if (content.getContentType().equals("text/cql")) { + return new ByteArrayInputStream(content.getData()); + } + } + + throw new IllegalArgumentException(String.format("Library %s%s does not contain CQL source content.", versionedIdentifier.getId(), + versionedIdentifier.getVersion() != null ? ("-" + versionedIdentifier.getVersion()) : "")); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/ActivityDefinitionApplyException.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/ActivityDefinitionApplyException.java new file mode 100644 index 00000000000..bc7412dfad3 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/ActivityDefinitionApplyException.java @@ -0,0 +1,8 @@ +package ca.uhn.fhir.jpa.cqf.ruler.exceptions; + +public class ActivityDefinitionApplyException extends RuntimeException { + + public ActivityDefinitionApplyException(String message) { + super(message); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/InvalidHookException.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/InvalidHookException.java new file mode 100644 index 00000000000..a6eb6c0d295 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/InvalidHookException.java @@ -0,0 +1,9 @@ +package ca.uhn.fhir.jpa.cqf.ruler.exceptions; + +public class InvalidHookException extends RuntimeException { + + public InvalidHookException(String message) { + super(message); + } + +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/MissingContextException.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/MissingContextException.java new file mode 100644 index 00000000000..ef2ecffcbc9 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/MissingContextException.java @@ -0,0 +1,9 @@ +package ca.uhn.fhir.jpa.cqf.ruler.exceptions; + +public class MissingContextException extends RuntimeException { + + public MissingContextException(String message) { + super(message); + } + +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/MissingHookException.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/MissingHookException.java new file mode 100644 index 00000000000..de4e9e3fa5b --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/exceptions/MissingHookException.java @@ -0,0 +1,9 @@ +package ca.uhn.fhir.jpa.cqf.ruler.exceptions; + +public class MissingHookException extends RuntimeException { + + public MissingHookException(String message) { + super(message); + } + +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/DateHelper.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/DateHelper.java new file mode 100644 index 00000000000..bc8dd0ac969 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/DateHelper.java @@ -0,0 +1,46 @@ +package ca.uhn.fhir.jpa.cqf.ruler.helpers; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +public class DateHelper { + + // Helper class to resolve period dates + public static Date resolveRequestDate(String date, boolean start) { + // split it up - support dashes or slashes + String[] dissect = date.contains("-") ? date.split("-") : date.split("/"); + List dateVals = new ArrayList<>(); + for (String dateElement : dissect) { + dateVals.add(Integer.parseInt(dateElement)); + } + + if (dateVals.isEmpty()) { + throw new IllegalArgumentException("Invalid date"); + } + + // for now support dates up to day precision + Calendar calendar = Calendar.getInstance(); + calendar.clear(); + calendar.set(Calendar.YEAR, dateVals.get(0)); + if (dateVals.size() > 1) { + // java.util.Date months are zero based, hence the negative 1 -- 2014-01 == February 2014 + calendar.set(Calendar.MONTH, dateVals.get(1) - 1); + } + if (dateVals.size() > 2) + calendar.set(Calendar.DAY_OF_MONTH, dateVals.get(2)); + else { + if (start) { + calendar.set(Calendar.DAY_OF_MONTH, 1); + } + else { + // get last day of month for end period + calendar.add(Calendar.MONTH, 1); + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.add(Calendar.DATE, -1); + } + } + return calendar.getTime(); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/Dstu2ToStu3.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/Dstu2ToStu3.java new file mode 100644 index 00000000000..9de6acbfce3 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/Dstu2ToStu3.java @@ -0,0 +1,84 @@ +package ca.uhn.fhir.jpa.cqf.ruler.helpers; + +import ca.uhn.fhir.model.dstu2.composite.CodeableConceptDt; +import ca.uhn.fhir.model.dstu2.composite.CodingDt; +import ca.uhn.fhir.model.dstu2.composite.SimpleQuantityDt; +import ca.uhn.fhir.model.dstu2.resource.MedicationOrder; +import ca.uhn.fhir.model.primitive.BooleanDt; +import org.hl7.fhir.dstu3.model.*; +import org.hl7.fhir.exceptions.FHIRException; + +import java.util.ArrayList; +import java.util.List; + +public class Dstu2ToStu3 { + + // MedicationRequest + public static MedicationRequest resolveMedicationRequest(MedicationOrder order) throws FHIRException { + /* + * Required fields: + * MedicationOrder -> MedicationRequest + * medication -> medication + * dosageInstruction (Backbone) -> Dosage (Element) + */ + return new MedicationRequest() + .setStatus(MedicationRequest.MedicationRequestStatus.fromCode(order.getStatus())) + .setMedication(convertToCodeableConcept((CodeableConceptDt) order.getMedication())) + .setDosageInstruction(convertToDosage(order.getDosageInstruction())); + } + + private static CodeableConcept convertToCodeableConcept(CodeableConceptDt conceptDt) { + CodeableConcept concept = new CodeableConcept().setText(conceptDt.getText() == null ? "" : conceptDt.getText()); + concept.setId(conceptDt.getElementSpecificId()); + List codes = new ArrayList<>(); + for (CodingDt code : conceptDt.getCoding()) { + codes.add(new Coding() + .setCode(code.getCode()) + .setSystem(code.getSystem()) + .setDisplay(code.getDisplay()) + .setVersion(code.getVersion()) + ); + } + return concept.setCoding(codes); + } + + private static List convertToDosage(List instructions) throws FHIRException { + List dosages = new ArrayList<>(); + + for (MedicationOrder.DosageInstruction dosageInstruction : instructions) { + Dosage dosage = new Dosage(); + dosage.setText(dosageInstruction.getText()); + dosage.setAsNeeded(dosageInstruction.getAsNeeded() == null ? new BooleanType(true) : new BooleanType(((BooleanDt) dosageInstruction.getAsNeeded()).getValue())); + + + Integer frequency = dosageInstruction.getTiming().getRepeat().getFrequency(); + Integer frequencyMax = dosageInstruction.getTiming().getRepeat().getFrequencyMax(); + + Timing.TimingRepeatComponent repeat = new Timing.TimingRepeatComponent(); + if (frequency != null) { + repeat.setFrequency(frequency); + } + if (frequencyMax != null) { + repeat.setFrequencyMax(frequencyMax); + } + repeat.setPeriod(dosageInstruction.getTiming().getRepeat().getPeriod()) + .setPeriodUnit(Timing.UnitsOfTime.fromCode(dosageInstruction.getTiming().getRepeat().getPeriodUnits())); + + Timing timing = new Timing(); + timing.setRepeat(repeat); + dosage.setTiming(timing); + + SimpleQuantityDt quantityDt = (SimpleQuantityDt) dosageInstruction.getDose(); + dosage.setDose(new SimpleQuantity() + .setValue(quantityDt.getValue()) + .setUnit(quantityDt.getUnit()) + .setCode(quantityDt.getCode()) + .setSystem(quantityDt.getSystem()) + ); + + dosages.add(dosage); + } + + return dosages; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/FhirMeasureBundler.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/FhirMeasureBundler.java new file mode 100644 index 00000000000..6d7b8831d59 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/FhirMeasureBundler.java @@ -0,0 +1,40 @@ +package ca.uhn.fhir.jpa.cqf.ruler.helpers; + +import org.opencds.cqf.cql.execution.Context; +import org.hl7.fhir.dstu3.model.Bundle; +import org.hl7.fhir.dstu3.model.Resource; + +/** + * Created by Bryn on 5/7/2016. + */ +public class FhirMeasureBundler { + // Adds the resources returned from the given expressions to a bundle + public Bundle bundle(Context context, String... expressionNames) { + Bundle bundle = new Bundle(); + bundle.setType(Bundle.BundleType.COLLECTION); + for (String expressionName : expressionNames) { + Object result = context.resolveExpressionRef(expressionName).evaluate(context); + for (Object element : (Iterable)result) { + Bundle.BundleEntryComponent entry = new Bundle.BundleEntryComponent(); + entry.setResource((Resource)element); + entry.setFullUrl(((Resource)element).getId()); + bundle.getEntry().add(entry); + } + } + + return bundle; + } + + public Bundle bundle(Iterable resources) { + Bundle bundle = new Bundle(); + bundle.setType(Bundle.BundleType.COLLECTION); + for (Resource resource : resources) { + Bundle.BundleEntryComponent entry = new Bundle.BundleEntryComponent(); + entry.setResource(resource); + entry.setFullUrl(resource.getId()); + bundle.getEntry().add(entry); + } + + return bundle; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/FhirMeasureEvaluator.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/FhirMeasureEvaluator.java new file mode 100644 index 00000000000..b43317385e4 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/FhirMeasureEvaluator.java @@ -0,0 +1,177 @@ +package ca.uhn.fhir.jpa.cqf.ruler.helpers; + +import org.hl7.fhir.dstu3.model.*; +import org.opencds.cqf.cql.execution.Context; +import org.opencds.cqf.cql.runtime.DateTime; +import org.opencds.cqf.cql.runtime.Interval; + +import java.util.*; + + +/** + * Created by Bryn on 5/7/2016. + */ +public class FhirMeasureEvaluator { + + private MeasureReport resolveGroupings(MeasureReport report, Measure measure, Context context) + { + HashMap resources = new HashMap<>(); + + // for each measure group + for (Measure.MeasureGroupComponent group : measure.getGroup()) { + MeasureReport.MeasureReportGroupComponent reportGroup = new MeasureReport.MeasureReportGroupComponent(); + // TODO: Do I need to do this copy? Will HAPI FHIR do this automatically? + reportGroup.setIdentifier(group.getIdentifier().copy()); + report.getGroup().add(reportGroup); + for (Measure.MeasureGroupPopulationComponent population : group.getPopulation()) { + // evaluate the criteria expression, should return true/false, translate to 0/1 for report + Object result = context.resolveExpressionRef(population.getCriteria()).evaluate(context); + int count = 0; + if (result instanceof Boolean) { + count = (Boolean)result ? 1 : 0; + } + else if (result instanceof Iterable) { + for (Object item : (Iterable)result) { + count++; + if (item instanceof Resource) { + resources.put(((Resource)item).getId(), (Resource)item); + } + } + } + MeasureReport.MeasureReportGroupPopulationComponent populationReport = new MeasureReport.MeasureReportGroupPopulationComponent(); + populationReport.setCount(count); + populationReport.setCode(population.getCode()); + + reportGroup.getPopulation().add(populationReport); + } + } + + ArrayList expressionNames = new ArrayList<>(); + // HACK: Hijacking Supplemental data to specify the evaluated resources + // In reality, this should be specified explicitly, but I'm not sure what else to do here.... + for (Measure.MeasureSupplementalDataComponent supplementalData : measure.getSupplementalData()) { + expressionNames.add(supplementalData.getCriteria()); + } + + // TODO: Need to return both the MeasureReport and the EvaluatedResources Bundle + FhirMeasureBundler bundler = new FhirMeasureBundler(); + //String[] expressionNameArray = new String[expressionNames.size()]; + //expressionNameArray = expressionNames.toArray(expressionNameArray); + //org.hl7.fhir.dstu3.model.Bundle evaluatedResources = bundler.bundle(context, expressionNameArray); + org.hl7.fhir.dstu3.model.Bundle evaluatedResources = bundler.bundle(resources.values()); + evaluatedResources.setId(UUID.randomUUID().toString()); + //String jsonString = fhirClient.getFhirContext().newJsonParser().encodeResourceToString(evaluatedResources); + //ca.uhn.fhir.rest.api.MethodOutcome result = fhirClient.create().resource(evaluatedResources).execute(); + report.setEvaluatedResources(new Reference('#' + evaluatedResources.getId())); + report.addContained(evaluatedResources); + return report; + } + + // Patient Evaluation + public MeasureReport evaluate(Context context, Measure measure, Patient patient, Date periodStart, Date periodEnd) { + MeasureReport report = new MeasureReport(); + report.setMeasure(new Reference(measure)); + report.setPatient(new Reference(patient)); + Period reportPeriod = new Period(); + reportPeriod.setStart(periodStart); + reportPeriod.setEnd(periodEnd); + report.setPeriod(reportPeriod); + report.setType(MeasureReport.MeasureReportType.INDIVIDUAL); + + Interval measurementPeriod = new Interval(DateTime.fromJavaDate(periodStart), true, DateTime.fromJavaDate(periodEnd), true); + context.setParameter(null, "Measurement Period", measurementPeriod); + + return resolveGroupings(report, measure, context); + } + + public MeasureReport evaluate(Context context, Measure measure, Patient patient, Interval measurementPeriod) { + return evaluate(context, measure, patient, (Date)measurementPeriod.getStart(), (Date)measurementPeriod.getEnd()); + } + + // Population evaluation +// public MeasureReport evaluate(Context context, Measure measure, List patients, +// Interval measurementPeriod, MeasureReport.MeasureReportType type) +// { +// MeasureReport report = new MeasureReport(); +// report.setMeasure(new Reference(measure)); +// Period reportPeriod = new Period(); +// reportPeriod.setStart((Date) measurementPeriod.getStart()); +// reportPeriod.setEnd((Date) measurementPeriod.getEnd()); +// report.setPeriod(reportPeriod); +// report.setType(type); +// +// return resolveGroupings(report, measure, context, patients); +// } + + public MeasureReport evaluate(Context context, Measure measure, List population, + Interval measurementPeriod, MeasureReport.MeasureReportType type) + { + MeasureReport report = new MeasureReport(); + report.setMeasure(new Reference(measure)); + Period reportPeriod = new Period(); + reportPeriod.setStart((Date) measurementPeriod.getStart()); + reportPeriod.setEnd((Date) measurementPeriod.getEnd()); + report.setPeriod(reportPeriod); + report.setType(type); + + context.setParameter(null, "Measurement Period", measurementPeriod); + + HashMap resources = new HashMap<>(); + + // for each measure group + for (Measure.MeasureGroupComponent group : measure.getGroup()) { + MeasureReport.MeasureReportGroupComponent reportGroup = new MeasureReport.MeasureReportGroupComponent(); + reportGroup.setIdentifier(group.getIdentifier()); + report.getGroup().add(reportGroup); + + for (Measure.MeasureGroupPopulationComponent pop : group.getPopulation()) { + int count = 0; + // Worried about performance here with big populations... + for (Patient patient : population) { + context.setContextValue("Patient", patient); + Object result = context.resolveExpressionRef(pop.getCriteria()).evaluate(context); + if (result instanceof Boolean) { + count += (Boolean) result ? 1 : 0; + } + else if (result instanceof Iterable) { + for (Object item : (Iterable) result) { + count++; + if (item instanceof Resource) { + resources.put(((Resource) item).getId(), (Resource) item); + } + } + } + } + MeasureReport.MeasureReportGroupPopulationComponent populationReport = new MeasureReport.MeasureReportGroupPopulationComponent(); + populationReport.setCount(count); + populationReport.setCode(pop.getCode()); + + /* + TODO - it is a reference to a list... + Probably want to create the list and POST it, then include a reference to it. + */ +// if (patients != null) { +// ListResource list = new ListResource(); +// populationReport.setPatients(); +// } + + reportGroup.getPopulation().add(populationReport); + } + + } + + ArrayList expressionNames = new ArrayList<>(); + // HACK: Hijacking Supplemental data to specify the evaluated resources + // In reality, this should be specified explicitly, but I'm not sure what else to do here.... + for (Measure.MeasureSupplementalDataComponent supplementalData : measure.getSupplementalData()) { + expressionNames.add(supplementalData.getCriteria()); + } + + FhirMeasureBundler bundler = new FhirMeasureBundler(); + org.hl7.fhir.dstu3.model.Bundle evaluatedResources = bundler.bundle(resources.values()); + evaluatedResources.setId(UUID.randomUUID().toString()); + report.setEvaluatedResources(new Reference('#' + evaluatedResources.getId())); + report.addContained(evaluatedResources); + return report; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/LibraryHelper.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/LibraryHelper.java new file mode 100644 index 00000000000..95376225c11 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/LibraryHelper.java @@ -0,0 +1,81 @@ +package ca.uhn.fhir.jpa.cqf.ruler.helpers; + +import org.cqframework.cql.cql2elm.CqlTranslator; +import org.cqframework.cql.cql2elm.CqlTranslatorException; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.cqframework.cql.elm.tracking.TrackBack; +import org.opencds.cqf.cql.execution.CqlLibraryReader; + +import javax.xml.bind.JAXBException; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +/** + * Created by Christopher on 1/11/2017. + */ +public class LibraryHelper { + + public static Library readLibrary(InputStream xmlStream) { + try { + return CqlLibraryReader.read(xmlStream); + } catch (IOException | JAXBException e) { + throw new IllegalArgumentException("Error encountered while reading ELM xml: " + e.getMessage()); + } + } + + public static String errorsToString(Iterable exceptions) { + ArrayList errors = new ArrayList<>(); + for (CqlTranslatorException error : exceptions) { + TrackBack tb = error.getLocator(); + String lines = tb == null ? "[n/a]" : String.format("%s[%d:%d, %d:%d]", + (tb.getLibrary() != null ? tb.getLibrary().getId() + (tb.getLibrary().getVersion() != null + ? ("-" + tb.getLibrary().getVersion()) : "") : ""), + tb.getStartLine(), tb.getStartChar(), tb.getEndLine(), tb.getEndChar()); + errors.add(lines + error.getMessage()); + } + + return errors.toString(); + } + + public static CqlTranslator getTranslator(String cql, LibraryManager libraryManager, ModelManager modelManager) { + return getTranslator(new ByteArrayInputStream(cql.getBytes(StandardCharsets.UTF_8)), libraryManager, modelManager); + } + + public static CqlTranslator getTranslator(InputStream cqlStream, LibraryManager libraryManager, ModelManager modelManager) { + ArrayList options = new ArrayList<>(); + options.add(CqlTranslator.Options.EnableDateRangeOptimization); + options.add(CqlTranslator.Options.EnableAnnotations); + options.add(CqlTranslator.Options.EnableDetailedErrors); + CqlTranslator translator; + try { + translator = CqlTranslator.fromStream(cqlStream, modelManager, libraryManager, + options.toArray(new CqlTranslator.Options[options.size()])); + } catch (IOException e) { + throw new IllegalArgumentException(String.format("Errors occurred translating library: %s", e.getMessage())); + } + + if (translator.getErrors().size() > 0) { + throw new IllegalArgumentException(errorsToString(translator.getErrors())); + } + + return translator; + } + + public static Library translateLibrary(String cql, LibraryManager libraryManager, ModelManager modelManager) { + return translateLibrary(new ByteArrayInputStream(cql.getBytes(StandardCharsets.UTF_8)), libraryManager, modelManager); + } + + public static Library translateLibrary(InputStream cqlStream, LibraryManager libraryManager, ModelManager modelManager) { + CqlTranslator translator = getTranslator(cqlStream, libraryManager, modelManager); + return readLibrary(new ByteArrayInputStream(translator.toXml().getBytes(StandardCharsets.UTF_8))); + } + + public static Library translateLibrary(CqlTranslator translator) { + return readLibrary(new ByteArrayInputStream(translator.toXml().getBytes(StandardCharsets.UTF_8))); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/XlsxToValueSet.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/XlsxToValueSet.java new file mode 100644 index 00000000000..c9c07535e4a --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/helpers/XlsxToValueSet.java @@ -0,0 +1,211 @@ +package ca.uhn.fhir.jpa.cqf.ruler.helpers; + +import ca.uhn.fhir.context.FhirContext; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.hl7.fhir.dstu3.model.*; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class XlsxToValueSet { + + // Default indexes and output directory path + private static boolean valueSet = true; + private static int startLine = 0; + private static int oidCol = 0; + private static int systemCol = 1; + private static int versionCol = 2; + private static int codeCol = 3; + private static int displayCol = 4; + + private static int urlCol = 1; + + private static String outDir = "src/main/resources/valuesets/"; + + private static final String validFlags = "-b (line to start conversion)\n-o (oid column index)\n-s (code system column index)\n-v (version column index)\n-c (code column index)\n-d (display column index)\n-u (url column index) only used for CodeSystem conversion"; + + private static Map valuesets = new HashMap<>(); + private static Map codeSystems = new HashMap<>(); + + private static void populateOidVs(String oid) { + ValueSet vs = new ValueSet(); + vs.setId(oid); + vs.setStatus(Enumerations.PublicationStatus.DRAFT); + valuesets.put(oid, vs); + } + + private static void populateOidCs(String oid) { + CodeSystem cs = new CodeSystem(); + cs.setId(oid); + cs.setStatus(Enumerations.PublicationStatus.DRAFT); + cs.setContent(CodeSystem.CodeSystemContentMode.EXAMPLE); + codeSystems.put(oid, cs); + } + + private static String getNextCellString(Cell cell) { + cell.setCellType(CellType.STRING); + return cell.getStringCellValue(); + } + + // default format: oid ... system ... version ... code ... display + private static void resolveRowVs(Row row) { + String oid = getNextCellString(row.getCell(oidCol)); + + if (!valuesets.containsKey(oid)) { + populateOidVs(oid); + } + + String system = getNextCellString(row.getCell(systemCol)); + String version = getNextCellString(row.getCell(versionCol)); + String code = getNextCellString(row.getCell(codeCol)); + String display = getNextCellString(row.getCell(displayCol)); + + ValueSet.ValueSetComposeComponent vscc = valuesets.get(oid).getCompose(); + ValueSet.ConceptSetComponent component = new ValueSet.ConceptSetComponent(); + component.setSystem(system).setVersion(version); + component.addConcept(new ValueSet.ConceptReferenceComponent().setCode(code).setDisplay(display)); + vscc.addInclude(component); + } + + // default format: oid ... url ... version ... code ... display + private static void resolveRowCs(Row row) { + String oid = getNextCellString(row.getCell(oidCol)); + + if (!codeSystems.containsKey(oid)) { + populateOidCs(oid); + } + + String url = getNextCellString(row.getCell(urlCol)); + String version = getNextCellString(row.getCell(versionCol)); + String code = getNextCellString(row.getCell(codeCol)); + String display = getNextCellString(row.getCell(displayCol)); + + CodeSystem cs = codeSystems.get(oid); + cs.setUrl(url).setVersion(version); + cs.getConcept().add(new CodeSystem.ConceptDefinitionComponent().setCode(code).setDisplay(display)); + } + + private static Bundle valuesetBundle() { + Bundle temp = new Bundle(); + for (String key : valuesets.keySet()) + temp.addEntry(new Bundle.BundleEntryComponent().setResource(valuesets.get(key))); + + return temp; + } + + private static Bundle codesystemBundle() { + Bundle temp = new Bundle(); + for (String key : codeSystems.keySet()) + temp.addEntry(new Bundle.BundleEntryComponent().setResource(codeSystems.get(key))); + + return temp; + } + + // library function use + public static Bundle convertCs(Workbook workbook, String[] args) { + resolveArgs(args); + Iterator rowIterator = workbook.getSheetAt(0).iterator(); + + int currentRow = 0; + while (currentRow++ != startLine) { + rowIterator.next(); + } + + while (rowIterator.hasNext()) { + resolveRowCs(rowIterator.next()); + } + + return codesystemBundle(); + } + + public static Bundle convertCs(String[] args) { + return convertCs(getWorkbook(args[0]), args); + } + + public static Bundle convertVs(Workbook workbook, String[] args) { + resolveArgs(args); + Iterator rowIterator = workbook.getSheetAt(0).iterator(); + + int currentRow = 0; + while (currentRow++ != startLine) { + rowIterator.next(); + } + + while (rowIterator.hasNext()) { + resolveRowVs(rowIterator.next()); + } + + return valuesetBundle(); + } + + public static Bundle convertVs(String[] args) { + return convertVs(getWorkbook(args[0]), args); + } + + public static Workbook getWorkbook(String workbookPath) { + Workbook workbook = null; + try { + FileInputStream spreadsheetStream = new FileInputStream(new File(workbookPath)); + workbook = new XSSFWorkbook(spreadsheetStream); + + } catch (IOException e) { + e.printStackTrace(); + } + return workbook; + } + + private static void resolveArgs(String[] args) { + for (String arg : args) { + String[] flagAndValue = arg.split("="); + + switch (flagAndValue[0]) { + case "-b": startLine = Integer.parseInt(flagAndValue[1]); break; + case "-o": oidCol = Integer.parseInt(flagAndValue[1]); break; + case "-s": systemCol = Integer.parseInt(flagAndValue[1]); break; + case "-v": versionCol = Integer.parseInt(flagAndValue[1]); break; + case "-c": codeCol = Integer.parseInt(flagAndValue[1]); break; + case "-d": displayCol = Integer.parseInt(flagAndValue[1]); break; + case "-u": urlCol = Integer.parseInt(flagAndValue[1]); break; + case "-outDir": outDir = flagAndValue[1]; break; + case "-cs": valueSet = false; break; + default: + if (flagAndValue[0].startsWith("-")) { + throw new IllegalArgumentException(String.format("Invalid flag: %s\n%s", flagAndValue[0], validFlags)); + } + break; + } + } + } + + public static void main(String[] args) throws IOException { + if (args.length < 1) { + System.err.println("Path to excel file is required"); + return; + } + + if (args.length > 1) { + resolveArgs(args); + } + + Bundle temp = valueSet ? convertVs(args) : convertCs(args); + FhirContext context = FhirContext.forDstu3(); + for (Bundle.BundleEntryComponent component : temp.getEntry()) { + File f = new File(outDir + component.getResource().getId() + ".json"); + if (f.createNewFile()) { + PrintWriter writer = new PrintWriter(f); + writer.println(context.newJsonParser().setPrettyPrint(true).encodeResourceToString(component.getResource())); + writer.println(); + writer.close(); + } + } + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkDataProvider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkDataProvider.java new file mode 100644 index 00000000000..1f554cf0a30 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkDataProvider.java @@ -0,0 +1,157 @@ +package ca.uhn.fhir.jpa.cqf.ruler.omtk; + +import org.opencds.cqf.cql.data.DataProvider; +import org.opencds.cqf.cql.runtime.Code; +import org.opencds.cqf.cql.runtime.Interval; + +import java.math.BigDecimal; +import java.sql.DriverManager; +import java.sql.SQLException; + +/** + * Created by Bryn on 4/24/2017. + */ +public class OmtkDataProvider implements DataProvider { + + public static final String RXNORM = "http://www.nlm.nih.gov/research/umls/rxnorm"; + + public OmtkDataProvider(String connectionString) { + if (connectionString == null) { + throw new IllegalArgumentException("connectionString is null"); + } + + this.connectionString = connectionString; + } + + private String connectionString; + + private java.sql.Connection connection; + private java.sql.Connection getConnection() { + if (connection == null) { + connection = getNewConnection(); + } + + try { + if (!connection.isValid(0)) { + connection = getNewConnection(); + } + } catch (SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + + return connection; + } + + private java.sql.Connection getNewConnection() { + try { + return DriverManager.getConnection(connectionString); + } catch (SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + @Override + public Iterable retrieve(String context, Object contextValue, String dataType, String templateId, + String codePath, Iterable codes, String valueSet, String datePath, + String dateLowPath, String dateHighPath, Interval dateRange) { + + java.sql.Statement statement = null; + try { + statement = getConnection().createStatement(); + + // TODO: Construct the SELECT statement based on the code path + // TODO: Throw an error if an attempt is made to limit based on date range + StringBuilder select = new StringBuilder(); + select.append(String.format("SELECT * FROM %s", dataType)); + if (codePath != null) { + StringBuilder codeList = new StringBuilder(); + boolean plural = false; + for (Code code : codes) { + if (codeList.length() > 0) { + codeList.append(", "); + plural = true; + } + codeList.append(code.getCode()); // TODO: Need to handle the case when code is a string type... + } + + if (plural) { + select.append(String.format(" WHERE %s IN ( %s )", codePath, codeList.toString())); + } + else { + select.append(String.format(" WHERE %S = %s", codePath, codeList.toString())); + } + } + + if (datePath != null) { + throw new UnsupportedOperationException("OmtkDataProvider does not support filtering by date range."); + } + + java.sql.ResultSet rs = statement.executeQuery(select.toString()); + return new OmtkDataWrapper(rs); + } catch (SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + @Override + public String getPackageName() { + return "ca.uhn.fhir.jpaca.uhn.fhir.jpa.cqf.ruler.omtk"; + } + + @Override + public void setPackageName(String s) { + + } + + @Override + public Object resolvePath(Object target, String path) { + if (target == null) { + return null; + } + + if (target instanceof OmtkRow) { + OmtkRow row = (OmtkRow)target; + return mapType(row.getValue(path), path); + } + + throw new UnsupportedOperationException(String.format("Could not retrieve value of property %s from object of type %s.", + path, target.getClass().getName())); + } + + @Override + public Class resolveType(String typeName) { + throw new UnsupportedOperationException("OmtkProvider does not support write."); + } + + @Override + public Class resolveType(Object o) { + throw new UnsupportedOperationException("OmtkProvider does not support write."); + } + + @Override + public Object createInstance(String s) { + throw new UnsupportedOperationException("OmtkProvider does not support write."); + } + + @Override + public void setValue(Object target, String path, Object value) { + throw new UnsupportedOperationException("OmtkProvider does not support write."); + } + + private Object mapType(Object type, String path) { + // not all integers are codes + if (path.equals("STRENGTH_VALUE")) { + return new BigDecimal(type.toString()); + } + + if (type instanceof Double) { + return new BigDecimal((Double) type); + } + + else if (type instanceof Integer) { + return new Code().withCode(type.toString()).withSystem("http://www.nlm.nih.gov/research/umls/rxnorm"); + } + + return type; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkDataWrapper.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkDataWrapper.java new file mode 100644 index 00000000000..098e921546a --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkDataWrapper.java @@ -0,0 +1,124 @@ +package ca.uhn.fhir.jpa.cqf.ruler.omtk; + +import org.opencds.cqf.cql.runtime.Code; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Iterator; +import java.util.NoSuchElementException; + +/** + * Created by Bryn on 4/24/2017. + */ +public class OmtkDataWrapper implements Iterable { + + // TODO: Lifecycle management.... assuming GC for now + private ResultSet rs; + + public OmtkDataWrapper(ResultSet rs) { + if (rs == null) { + throw new IllegalArgumentException("rs is null"); + } + + this.rs = rs; + } + + /** + * Returns an iterator over elements of type {@code T}. + * + * @return an Iterator. + */ + @Override + public Iterator iterator() { + return new OmtkDataWrapperIterator(); + } + + private class OmtkDataWrapperIterator implements Iterator { + public OmtkDataWrapperIterator() { + try { + hasNext = rs.next(); + } catch (SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + private boolean hasNext = false; + + /** + * Returns {@code true} if the iteration has more elements. + * (In other words, returns {@code true} if {@link #next} would + * return an element rather than throwing an exception.) + * + * @return {@code true} if the iteration has more elements + */ + @Override + public boolean hasNext() { + return hasNext; + } + + /** + * Returns the next element in the iteration. + * + * @return the next element in the iteration + * @throws NoSuchElementException if the iteration has no more elements + */ + @Override + public Object next() { + if (!hasNext) { + throw new NoSuchElementException(); + } + + Object result = getRowData(); + try { + hasNext = rs.next(); + } catch (SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + return result; + } + + /** + * Removes from the underlying collection the last element returned + * by this iterator (optional operation). This method can be called + * only once per call to {@link #next}. The behavior of an iterator + * is unspecified if the underlying collection is modified while the + * iteration is in progress in any way other than by calling this + * method. + * + * @throws UnsupportedOperationException if the {@code remove} + * operation is not supported by this iterator + * @throws IllegalStateException if the {@code next} method has not + * yet been called, or the {@code remove} method has already + * been called after the last call to the {@code next} + * method + * @implSpec The default implementation throws an instance of + * {@link UnsupportedOperationException} and performs no other action. + */ + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + private Object getRowData() { + try { + java.sql.ResultSetMetaData metadata = rs.getMetaData(); + + OmtkRow row = new OmtkRow(); + + for (int i = 1; i <= metadata.getColumnCount(); i++) { + if (metadata.getColumnName(i).endsWith("_RXCUI")) { + row.setValue(metadata.getColumnName(i), new Code().withCode(((Integer)rs.getInt(i)).toString()) + .withSystem(OmtkDataProvider.RXNORM)); + } + row.setValue(metadata.getColumnName(i), rs.getObject(i)); + } + + return row; + } + catch (SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkRow.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkRow.java new file mode 100644 index 00000000000..4b7f2b1018f --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/omtk/OmtkRow.java @@ -0,0 +1,21 @@ +package ca.uhn.fhir.jpa.cqf.ruler.omtk; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by Bryn on 4/24/2017. + */ +public class OmtkRow { + + private Map data = new HashMap(); + + public Object getValue(String key) { + return data.get(key); + } + + public void setValue(String key, Object value) { + data.put(key, value); + } + +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/CqlExecutionProvider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/CqlExecutionProvider.java new file mode 100644 index 00000000000..b83e54b78c4 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/CqlExecutionProvider.java @@ -0,0 +1,148 @@ +package ca.uhn.fhir.jpa.cqf.ruler.providers; + +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import ca.uhn.fhir.rest.server.IResourceProvider; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; +import org.hl7.fhir.dstu3.model.*; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibraryLoader; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibrarySourceProvider; +import org.opencds.cqf.cql.data.fhir.FhirDataProviderStu3; +import org.opencds.cqf.cql.execution.Context; +import org.opencds.cqf.cql.execution.LibraryLoader; +import ca.uhn.fhir.jpa.cqf.ruler.helpers.LibraryHelper; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created by Bryn on 1/16/2017. + */ +public class CqlExecutionProvider { + private JpaDataProvider provider; + + public CqlExecutionProvider(Collection providers) { + this.provider = new JpaDataProvider(providers); + } + + private ModelManager modelManager; + private ModelManager getModelManager() { + if (modelManager == null) { + modelManager = new ModelManager(); + } + return modelManager; + } + + private LibraryManager libraryManager; + private LibraryManager getLibraryManager() { + if (libraryManager == null) { + libraryManager = new LibraryManager(getModelManager()); + libraryManager.getLibrarySourceLoader().clearProviders(); + libraryManager.getLibrarySourceLoader().registerProvider(getLibrarySourceProvider()); + } + return libraryManager; + } + + private LibraryLoader libraryLoader; + private LibraryLoader getLibraryLoader() { + if (libraryLoader == null) { + libraryLoader = new STU3LibraryLoader(getLibraryResourceProvider(), getLibraryManager(), getModelManager()); + } + return libraryLoader; + } + + private STU3LibrarySourceProvider librarySourceProvider; + private STU3LibrarySourceProvider getLibrarySourceProvider() { + if (librarySourceProvider == null) { + librarySourceProvider = new STU3LibrarySourceProvider(getLibraryResourceProvider()); + } + return librarySourceProvider; + } + + private LibraryResourceProvider getLibraryResourceProvider() { + return (LibraryResourceProvider)provider.resolveResourceProvider("Library"); + } + + public static Iterable getLibraryReferences(DomainResource instance) { + List references = new ArrayList<>(); + + if (instance instanceof ActivityDefinition) { + references.addAll(((ActivityDefinition)instance).getLibrary()); + } + + else if (instance instanceof PlanDefinition) { + references.addAll(((PlanDefinition)instance).getLibrary()); + } + + else if (instance instanceof Measure) { + references.addAll(((Measure)instance).getLibrary()); + } + + for (Extension extension : instance.getExtensionsByUrl("http://hl7.org/fhir/StructureDefinition/cqif-library")) + { + Type value = extension.getValue(); + + if (value instanceof Reference) { + references.add((Reference)value); + } + + else { + throw new RuntimeException("Library extension does not have a value of type reference"); + } + } + + return references; + } + + private String buildIncludes(Iterable references) { + StringBuilder builder = new StringBuilder(); + for (Reference reference : references) { + + if (builder.length() > 0) { + builder.append(" "); + } + + // TODO: Would be nice not to have to resolve the reference here and just be able to specify the include... + Library library = getLibraryResourceProvider().getDao().read(new IdType(reference.getReference())); + builder.append("include "); + + // TODO: This assumes the libraries resource id is the same as the library name, need to work this out better + builder.append(library.getIdElement().getIdPart()); + + if (library.getVersion() != null) { + builder.append(" version '"); + builder.append(library.getVersion()); + builder.append("'"); + } + + builder.append(" called "); + builder.append(library.getIdElement().getIdPart()); + } + + return builder.toString(); + } + + /* Evaluates the given CQL expression in the context of the given resource */ + /* If the resource has a library extension, or a library element, that library is loaded into the context for the expression */ + public Object evaluateInContext(DomainResource instance, String cql, String patientId) { + Iterable libraries = getLibraryReferences(instance); + + // Provide the instance as the value of the '%context' parameter, as well as the value of a parameter named the same as the resource + // This enables expressions to access the resource by root, as well as through the %context attribute + String source = String.format("library LocalLibrary using FHIR version '3.0.0' include FHIRHelpers version '3.0.0' called FHIRHelpers %s parameter %s %s parameter \"%%context\" %s define Expression: %s", + buildIncludes(libraries), instance.fhirType(), instance.fhirType(), instance.fhirType(), cql); +// String source = String.format("library LocalLibrary using FHIR version '1.8' include FHIRHelpers version '1.8' called FHIRHelpers %s parameter %s %s parameter \"%%context\" %s define Expression: %s", +// buildIncludes(libraries), instance.fhirType(), instance.fhirType(), instance.fhirType(), cql); + + org.cqframework.cql.elm.execution.Library library = LibraryHelper.translateLibrary(source, getLibraryManager(), getModelManager()); + Context context = new Context(library); + context.setParameter(null, instance.fhirType(), instance); + context.setParameter(null, "%context", instance); + context.setExpressionCaching(true); + context.registerLibraryLoader(getLibraryLoader()); + context.setContextValue("Patient", patientId); + context.registerDataProvider("http://hl7.org/fhir", new FhirDataProviderStu3().setEndpoint("http://localhost:8080/cqf-ruler/baseDstu3")); + return context.resolveExpressionRef("Expression").evaluate(context); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRActivityDefinitionResourceProvider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRActivityDefinitionResourceProvider.java new file mode 100644 index 00000000000..ae36d7d6d46 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRActivityDefinitionResourceProvider.java @@ -0,0 +1,462 @@ +package ca.uhn.fhir.jpa.cqf.ruler.providers; + +import ca.uhn.fhir.jpa.dao.SearchParameterMap; +import ca.uhn.fhir.jpa.provider.dstu3.JpaResourceProviderDstu3; +import ca.uhn.fhir.model.api.Include; +import ca.uhn.fhir.model.api.annotation.Description; +import ca.uhn.fhir.rest.annotation.*; +import ca.uhn.fhir.rest.api.SortSpec; +import ca.uhn.fhir.rest.api.server.IBundleProvider; +import ca.uhn.fhir.rest.api.server.RequestDetails; +import ca.uhn.fhir.rest.param.*; +import ca.uhn.fhir.rest.server.IResourceProvider; +import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import org.hl7.fhir.dstu3.model.*; +import org.hl7.fhir.exceptions.FHIRException; +import ca.uhn.fhir.jpa.cqf.ruler.exceptions.ActivityDefinitionApplyException; + +import java.util.*; + +/** + * Created by Bryn on 1/16/2017. + */ +public class FHIRActivityDefinitionResourceProvider extends JpaResourceProviderDstu3 { + + private JpaDataProvider provider; + private CqlExecutionProvider executionProvider; + + public FHIRActivityDefinitionResourceProvider(Collection providers) { + this.provider = new JpaDataProvider(providers); + this.executionProvider = new CqlExecutionProvider(providers); + } + + @Operation(name = "$apply", idempotent = true) + public Resource apply(@IdParam IdType theId, @RequiredParam(name="patient") String patientId, + @OptionalParam(name="encounter") String encounterId, + @OptionalParam(name="practitioner") String practitionerId, + @OptionalParam(name="organization") String organizationId, + @OptionalParam(name="userType") String userType, + @OptionalParam(name="userLanguage") String userLanguage, + @OptionalParam(name="userTaskContext") String userTaskContext, + @OptionalParam(name="setting") String setting, + @OptionalParam(name="settingContext") String settingContext) + throws InternalErrorException, FHIRException, ClassNotFoundException, IllegalAccessException, + InstantiationException, ActivityDefinitionApplyException + { + ActivityDefinition activityDefinition = this.getDao().read(theId); + + Resource result = null; + try { + // This is a little hacky... + result = (Resource) Class.forName("org.hl7.fhir.dstu3.model." + activityDefinition.getKind().toCode()).newInstance(); + } + catch (Exception e) { + e.printStackTrace(); + throw new FHIRException("Could not find org.hl7.fhir.dstu3.model." + activityDefinition.getKind().toCode()); + } + + switch (result.fhirType()) { + case "ProcedureRequest": + result = resolveProcedureRequest(activityDefinition, patientId, practitionerId, organizationId); + break; + + case "MedicationRequest": + result = resolveMedicationRequest(activityDefinition, patientId); + break; + + case "SupplyRequest": + result = resolveSupplyRequest(activityDefinition, practitionerId, organizationId); + break; + + case "Procedure": + result = resolveProcedure(activityDefinition, patientId); + break; + + case "DiagnosticReport": + result = resolveDiagnosticReport(activityDefinition, patientId); + break; + + case "Communication": + result = resolveCommunication(activityDefinition, patientId); + break; + } + + // TODO: Apply expression extensions on any element? + + for (ActivityDefinition.ActivityDefinitionDynamicValueComponent dynamicValue : activityDefinition.getDynamicValue()) + { + if (dynamicValue.getExpression() != null) { + /* + TODO: Passing the activityDefinition as context here because that's what will have the libraries, + but perhaps the "context" here should be the result resource? + */ + Object value = + executionProvider.evaluateInContext(activityDefinition, dynamicValue.getExpression(), patientId); + + // TODO need to verify type... yay + if (value instanceof Boolean) { + value = new BooleanType((Boolean) value); + } + this.provider.setValue(result, dynamicValue.getPath(), value); + } + } + + return result; + } + + private ProcedureRequest resolveProcedureRequest(ActivityDefinition activityDefinition, String patientId, + String practitionerId, String organizationId) + throws ActivityDefinitionApplyException + { + // status, intent, code, and subject are required + ProcedureRequest procedureRequest = new ProcedureRequest(); + procedureRequest.setStatus(ProcedureRequest.ProcedureRequestStatus.DRAFT); + procedureRequest.setIntent(ProcedureRequest.ProcedureRequestIntent.ORDER); + procedureRequest.setSubject(new Reference(patientId)); + + if (practitionerId != null) { + procedureRequest.setRequester( + new ProcedureRequest.ProcedureRequestRequesterComponent() + .setAgent(new Reference(practitionerId)) + ); + } + + else if (organizationId != null) { + procedureRequest.setRequester( + new ProcedureRequest.ProcedureRequestRequesterComponent() + .setAgent(new Reference(organizationId)) + ); + } + + if (activityDefinition.hasExtension()) { + procedureRequest.setExtension(activityDefinition.getExtension()); + } + + if (activityDefinition.hasCode()) { + procedureRequest.setCode(activityDefinition.getCode()); + } + + // code can be set as a dynamicValue + else if (!activityDefinition.hasCode() && !activityDefinition.hasDynamicValue()) { + throw new ActivityDefinitionApplyException("Missing required code property"); + } + + if (activityDefinition.hasBodySite()) { + procedureRequest.setBodySite( activityDefinition.getBodySite()); + } + + if (activityDefinition.hasProduct()) { + throw new ActivityDefinitionApplyException("Product does not map to "+activityDefinition.getKind()); + } + + if (activityDefinition.hasDosage()) { + throw new ActivityDefinitionApplyException("Dosage does not map to "+activityDefinition.getKind()); + } + + return procedureRequest; + } + + private MedicationRequest resolveMedicationRequest(ActivityDefinition activityDefinition, String patientId) + throws ActivityDefinitionApplyException + { + // intent, medication, and subject are required + MedicationRequest medicationRequest = new MedicationRequest(); + medicationRequest.setIntent(MedicationRequest.MedicationRequestIntent.ORDER); + medicationRequest.setSubject(new Reference(patientId)); + + if (activityDefinition.hasProduct()) { + medicationRequest.setMedication( activityDefinition.getProduct()); + } + + else { + throw new ActivityDefinitionApplyException("Missing required product property"); + } + + if (activityDefinition.hasDosage()) { + medicationRequest.setDosageInstruction( activityDefinition.getDosage()); + } + + if (activityDefinition.hasBodySite()) { + throw new ActivityDefinitionApplyException("Bodysite does not map to " + activityDefinition.getKind()); + } + + if (activityDefinition.hasCode()) { + throw new ActivityDefinitionApplyException("Code does not map to " + activityDefinition.getKind()); + } + + if (activityDefinition.hasQuantity()) { + throw new ActivityDefinitionApplyException("Quantity does not map to " + activityDefinition.getKind()); + } + + return medicationRequest; + } + + private SupplyRequest resolveSupplyRequest(ActivityDefinition activityDefinition, String practionerId, + String organizationId) throws ActivityDefinitionApplyException + { + SupplyRequest supplyRequest = new SupplyRequest(); + + if (practionerId != null) { + supplyRequest.setRequester( + new SupplyRequest.SupplyRequestRequesterComponent() + .setAgent(new Reference(practionerId)) + ); + } + + if (organizationId != null) { + supplyRequest.setRequester( + new SupplyRequest.SupplyRequestRequesterComponent() + .setAgent(new Reference(organizationId)) + ); + } + + if (activityDefinition.hasQuantity()){ + supplyRequest.setOrderedItem( + new SupplyRequest.SupplyRequestOrderedItemComponent() + .setQuantity( activityDefinition.getQuantity()) + ); + } + + else { + throw new ActivityDefinitionApplyException("Missing required orderedItem.quantity property"); + } + + if (activityDefinition.hasCode()) { + supplyRequest.getOrderedItem().setItem(activityDefinition.getCode()); + } + + if (activityDefinition.hasProduct()) { + throw new ActivityDefinitionApplyException("Product does not map to "+activityDefinition.getKind()); + } + + if (activityDefinition.hasDosage()) { + throw new ActivityDefinitionApplyException("Dosage does not map to "+activityDefinition.getKind()); + } + + if (activityDefinition.hasBodySite()) { + throw new ActivityDefinitionApplyException("Bodysite does not map to "+activityDefinition.getKind()); + } + + return supplyRequest; + } + + private Procedure resolveProcedure(ActivityDefinition activityDefinition, String patientId) { + Procedure procedure = new Procedure(); + + // TODO - set the appropriate status + procedure.setStatus(Procedure.ProcedureStatus.UNKNOWN); + procedure.setSubject(new Reference(patientId)); + + if (activityDefinition.hasCode()) { + procedure.setCode(activityDefinition.getCode()); + } + + if (activityDefinition.hasBodySite()) { + procedure.setBodySite(activityDefinition.getBodySite()); + } + + return procedure; + } + + private DiagnosticReport resolveDiagnosticReport(ActivityDefinition activityDefinition, String patientId) { + DiagnosticReport diagnosticReport = new DiagnosticReport(); + + diagnosticReport.setStatus(DiagnosticReport.DiagnosticReportStatus.UNKNOWN); + diagnosticReport.setSubject(new Reference(patientId)); + + if (activityDefinition.hasCode()) { + diagnosticReport.setCode(activityDefinition.getCode()); + } + + else { + throw new ActivityDefinitionApplyException("Missing required ActivityDefinition.code property for DiagnosticReport"); + } + + if (activityDefinition.hasRelatedArtifact()) { + List presentedFormAttachments = new ArrayList<>(); + for (RelatedArtifact artifact : activityDefinition.getRelatedArtifact()) { + Attachment attachment = new Attachment(); + + if (artifact.hasUrl()) { + attachment.setUrl(artifact.getUrl()); + } + + if (artifact.hasDisplay()) { + attachment.setTitle(artifact.getDisplay()); + } + presentedFormAttachments.add(attachment); + } + diagnosticReport.setPresentedForm(presentedFormAttachments); + } + + return diagnosticReport; + } + + private Communication resolveCommunication(ActivityDefinition activityDefinition, String patientId) { + Communication communication = new Communication(); + + communication.setStatus(Communication.CommunicationStatus.UNKNOWN); + communication.setSubject(new Reference(patientId)); + + if (activityDefinition.hasCode()) { + communication.setReasonCode(Collections.singletonList(activityDefinition.getCode())); + } + + if (activityDefinition.hasRelatedArtifact()) { + for (RelatedArtifact artifact : activityDefinition.getRelatedArtifact()) { + if (artifact.hasUrl()) { + Attachment attachment = new Attachment().setUrl(artifact.getUrl()); + if (artifact.hasDisplay()) { + attachment.setTitle(artifact.getDisplay()); + } + + Communication.CommunicationPayloadComponent payload = new Communication.CommunicationPayloadComponent(); + payload.setContent(artifact.hasDisplay() ? attachment.setTitle(artifact.getDisplay()) : attachment); + communication.setPayload(Collections.singletonList(payload)); + } + + // TODO - other relatedArtifact types + } + } + + return communication; + } + + @Search(allowUnknownParams=true) + public IBundleProvider search( + javax.servlet.http.HttpServletRequest theServletRequest, + RequestDetails theRequestDetails, + @Description(shortDefinition="Search the contents of the resource's data using a fulltext search") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_CONTENT) + StringAndListParam theFtContent, + @Description(shortDefinition="Search the contents of the resource's narrative using a fulltext search") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_TEXT) + StringAndListParam theFtText, + @Description(shortDefinition="Search for resources which have the given tag") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_TAG) + TokenAndListParam theSearchForTag, + @Description(shortDefinition="Search for resources which have the given security labels") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_SECURITY) + TokenAndListParam theSearchForSecurity, + @Description(shortDefinition="Search for resources which have the given profile") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE) + UriAndListParam theSearchForProfile, + @Description(shortDefinition="Return resources linked to by the given target") + @OptionalParam(name="_has") + HasAndListParam theHas, + @Description(shortDefinition="The ID of the resource") + @OptionalParam(name="_id") + TokenAndListParam the_id, + @Description(shortDefinition="The language of the resource") + @OptionalParam(name="_language") + StringAndListParam the_language, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="composed-of", targetTypes={ } ) + ReferenceAndListParam theComposed_of, + @Description(shortDefinition="The activity definition publication date") + @OptionalParam(name="date") + DateRangeParam theDate, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="depends-on", targetTypes={ } ) + ReferenceAndListParam theDepends_on, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="derived-from", targetTypes={ } ) + ReferenceAndListParam theDerived_from, + @Description(shortDefinition="The description of the activity definition") + @OptionalParam(name="description") + StringAndListParam theDescription, + @Description(shortDefinition="The time during which the activity definition is intended to be in use") + @OptionalParam(name="effective") + DateRangeParam theEffective, + @Description(shortDefinition="External identifier for the activity definition") + @OptionalParam(name="identifier") + TokenAndListParam theIdentifier, + @Description(shortDefinition="Intended jurisdiction for the activity definition") + @OptionalParam(name="jurisdiction") + TokenAndListParam theJurisdiction, + @Description(shortDefinition="Computationally friendly name of the activity definition") + @OptionalParam(name="name") + StringAndListParam theName, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="predecessor", targetTypes={ } ) + ReferenceAndListParam thePredecessor, + @Description(shortDefinition="Name of the publisher of the activity definition") + @OptionalParam(name="publisher") + StringAndListParam thePublisher, + @Description(shortDefinition="The current status of the activity definition") + @OptionalParam(name="status") + TokenAndListParam theStatus, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="successor", targetTypes={ } ) + ReferenceAndListParam theSuccessor, + @Description(shortDefinition="The human-friendly name of the activity definition") + @OptionalParam(name="title") + StringAndListParam theTitle, + @Description(shortDefinition="Topics associated with the module") + @OptionalParam(name="topic") + TokenAndListParam theTopic, + @Description(shortDefinition="The uri that identifies the activity definition") + @OptionalParam(name="url") + UriAndListParam theUrl, + @Description(shortDefinition="The business version of the activity definition") + @OptionalParam(name="version") + TokenAndListParam theVersion, + @RawParam + Map> theAdditionalRawParams, + @IncludeParam(reverse=true) + Set theRevIncludes, + @Description(shortDefinition="Only return resources which were last updated as specified by the given range") + @OptionalParam(name="_lastUpdated") + DateRangeParam theLastUpdated, + @IncludeParam(allow= { + "ActivityDefinition:composed-of" , "ActivityDefinition:depends-on" , "ActivityDefinition:derived-from" , "ActivityDefinition:predecessor" , "ActivityDefinition:successor" , "ActivityDefinition:composed-of" , "ActivityDefinition:depends-on" , "ActivityDefinition:derived-from" , "ActivityDefinition:predecessor" , "ActivityDefinition:successor" , "ActivityDefinition:composed-of" , "ActivityDefinition:depends-on" , "ActivityDefinition:derived-from" , "ActivityDefinition:predecessor" , "ActivityDefinition:successor" , "ActivityDefinition:composed-of" , "ActivityDefinition:depends-on" , "ActivityDefinition:derived-from" , "ActivityDefinition:predecessor" , "ActivityDefinition:successor" , "ActivityDefinition:composed-of" , "ActivityDefinition:depends-on" , "ActivityDefinition:derived-from" , "ActivityDefinition:predecessor" , "ActivityDefinition:successor" , "*" + }) + Set theIncludes, + @Sort + SortSpec theSort, + @ca.uhn.fhir.rest.annotation.Count + Integer theCount + ) { + startRequest(theServletRequest); + try { + SearchParameterMap paramMap = new SearchParameterMap(); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_CONTENT, theFtContent); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_TEXT, theFtText); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_TAG, theSearchForTag); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_SECURITY, theSearchForSecurity); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE, theSearchForProfile); + paramMap.add("_has", theHas); + paramMap.add("_id", the_id); + paramMap.add("_language", the_language); + paramMap.add("composed-of", theComposed_of); + paramMap.add("date", theDate); + paramMap.add("depends-on", theDepends_on); + paramMap.add("derived-from", theDerived_from); + paramMap.add("description", theDescription); + paramMap.add("effective", theEffective); + paramMap.add("identifier", theIdentifier); + paramMap.add("jurisdiction", theJurisdiction); + paramMap.add("name", theName); + paramMap.add("predecessor", thePredecessor); + paramMap.add("publisher", thePublisher); + paramMap.add("status", theStatus); + paramMap.add("successor", theSuccessor); + paramMap.add("title", theTitle); + paramMap.add("topic", theTopic); + paramMap.add("url", theUrl); + paramMap.add("version", theVersion); + paramMap.setRevIncludes(theRevIncludes); + paramMap.setLastUpdated(theLastUpdated); + paramMap.setIncludes(theIncludes); + paramMap.setSort(theSort); + paramMap.setCount(theCount); +// paramMap.setRequestDetails(theRequestDetails); + + getDao().translateRawParameters(theAdditionalRawParams, paramMap); + + return getDao().search(paramMap, theRequestDetails); + } finally { + endRequest(theServletRequest); + } + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRMeasureResourceProvider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRMeasureResourceProvider.java new file mode 100644 index 00000000000..3ba3174c730 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRMeasureResourceProvider.java @@ -0,0 +1,494 @@ +package ca.uhn.fhir.jpa.cqf.ruler.providers; + +import ca.uhn.fhir.jpa.dao.SearchParameterMap; +import ca.uhn.fhir.jpa.provider.dstu3.JpaResourceProviderDstu3; +import ca.uhn.fhir.jpa.rp.dstu3.CodeSystemResourceProvider; +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import ca.uhn.fhir.jpa.rp.dstu3.PatientResourceProvider; +import ca.uhn.fhir.jpa.rp.dstu3.ValueSetResourceProvider; +import ca.uhn.fhir.model.api.Include; +import ca.uhn.fhir.model.api.annotation.Description; +import ca.uhn.fhir.rest.annotation.*; +import ca.uhn.fhir.rest.api.SortSpec; +import ca.uhn.fhir.rest.api.server.IBundleProvider; +import ca.uhn.fhir.rest.api.server.RequestDetails; +import ca.uhn.fhir.rest.param.*; +import ca.uhn.fhir.rest.server.IResourceProvider; +import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.cqframework.cql.elm.execution.VersionedIdentifier; +import org.hl7.fhir.dstu3.model.*; +import org.hl7.fhir.exceptions.FHIRException; +import org.hl7.fhir.instance.model.api.IBaseResource; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibraryLoader; +import ca.uhn.fhir.jpa.cqf.ruler.config.STU3LibrarySourceProvider; +import org.opencds.cqf.cql.execution.Context; +import org.opencds.cqf.cql.execution.LibraryLoader; +import org.opencds.cqf.cql.runtime.Interval; +import org.opencds.cqf.cql.terminology.TerminologyProvider; +import org.opencds.cqf.cql.terminology.fhir.FhirTerminologyProvider; +import ca.uhn.fhir.jpa.cqf.ruler.helpers.DateHelper; +import ca.uhn.fhir.jpa.cqf.ruler.helpers.FhirMeasureEvaluator; + +import java.util.*; + +/* + IN periodStart 1..1 date + The start of the measurement period. In keeping with the semantics of the date parameter used in the FHIR search operation, the period will start at the beginning of the period implied by the supplied timestamp. E.g. a value of 2014 would set the period start to be 2014-01-01T00:00:00 inclusive + + IN periodEnd 1..1 date + The end of the measurement period. The period will end at the end of the period implied by the supplied timestamp. E.g. a value of 2014 would set the period end to be 2014-12-31T23:59:59 inclusive + + IN measure 0..1 Reference + The measure to evaluate. This parameter is only required when the operation is invoked on the resource type, it is not used when invoking the operation on a Measure instance + + IN reportType 0..1 code + The type of measure report, patient, patient-list, or population. If not specified, a default value of patient will be used if the patient parameter is supplied, otherwise, population will be used + + IN patient 0..1 Reference + Patient to evaluate against. If not specified, the measure will be evaluated for all patients that meet the requirements of the measure. If specified, only the referenced patient will be evaluated + + IN practitioner 0..1 Reference + Practitioner to evaluate. If specified, the measure will be evaluated only for patients whose primary practitioner is the identified practitioner + + IN lastReceivedOn 0..1 dateTime + The date the results of this measure were last received. This parameter is only valid for patient-level reports and is used to indicate when the last time a result for this patient was received. This information can be used to limit the set of resources returned for a patient-level report + + OUT return 1..1 MeasureReport + The results of the measure calculation. See the MeasureReport resource for a complete description of the output of this operation +*/ + +public class FHIRMeasureResourceProvider extends JpaResourceProviderDstu3 { + + private JpaDataProvider provider; + private TerminologyProvider terminologyProvider; + + private Context context; + private Interval measurementPeriod; + private MeasureReport report = new MeasureReport(); + private FhirMeasureEvaluator evaluator = new FhirMeasureEvaluator(); + + public FHIRMeasureResourceProvider(Collection providers) { + this.provider = new JpaDataProvider(providers); + } + + private LibraryResourceProvider getLibraryResourceProvider() { + return (LibraryResourceProvider)provider.resolveResourceProvider("Library"); + } + + private ModelManager modelManager; + private ModelManager getModelManager() { + if (modelManager == null) { + modelManager = new ModelManager(); + } + return modelManager; + } + + private LibraryManager libraryManager; + private LibraryManager getLibraryManager() { + if (libraryManager == null) { + libraryManager = new LibraryManager(getModelManager()); + libraryManager.getLibrarySourceLoader().clearProviders(); + libraryManager.getLibrarySourceLoader().registerProvider(getLibrarySourceProvider()); + } + return libraryManager; + } + + private LibraryLoader libraryLoader; + private LibraryLoader getLibraryLoader() { + if (libraryLoader == null) { + libraryLoader = new STU3LibraryLoader(getLibraryResourceProvider(), getLibraryManager(), getModelManager()); + } + return libraryLoader; + } + + private STU3LibrarySourceProvider librarySourceProvider; + private STU3LibrarySourceProvider getLibrarySourceProvider() { + if (librarySourceProvider == null) { + librarySourceProvider = new STU3LibrarySourceProvider(getLibraryResourceProvider()); + } + return librarySourceProvider; + } + + /* + This is not "pure" FHIR. + The "source", "user", "pass", and "primaryLibraryName" parameters were added to simplify the operation. + */ + @Operation(name = "$evaluate", idempotent = true) + public MeasureReport evaluateMeasure( + @IdParam IdType theId, + @OptionalParam(name="reportType") String reportType, + @OptionalParam(name="patient") String patientId, + @OptionalParam(name="practitioner") String practitioner, + @OptionalParam(name="lastReceivedOn") String lastReceivedOn, + @RequiredParam(name="startPeriod") String startPeriod, + @RequiredParam(name="endPeriod") String endPeriod, + @OptionalParam(name="source") String source, + @OptionalParam(name="user") String user, + @OptionalParam(name="pass") String pass, + @OptionalParam(name="primaryLibraryName") String primaryLibraryName) throws InternalErrorException, FHIRException + { + Measure measure = this.getDao().read(theId); + + // load libraries referenced in measure + // TODO: need better way to determine primary library + // - for now using a name convention: -library or primaryLibraryName param + Library primary = null; + for (Reference ref : measure.getLibrary()) { + VersionedIdentifier vid = new VersionedIdentifier().withId(ref.getReference()); + Library temp = getLibraryLoader().load(vid); + + if (vid.getId().equals(measure.getIdElement().getIdPart() + "-logic") + || vid.getId().equals("Library/" + measure.getIdElement().getIdPart() + "-logic") + || (primaryLibraryName != null && temp.getIdentifier().getId().equals(primaryLibraryName))) + { + primary = temp; + context = new Context(primary); + } + } + if (primary == null) { + throw new IllegalArgumentException( + "Primary library not found.\nFollow the naming conventions -library or specify primary library in request." + ); + } + if (((STU3LibraryLoader)getLibraryLoader()).getLibraries().isEmpty()) { + throw new IllegalArgumentException(String.format("Could not load library source for libraries referenced in %s measure.", measure.getId())); + } + + // Prep - defining the context, measurementPeriod, terminology provider, and data provider + context.registerLibraryLoader(getLibraryLoader()); + measurementPeriod = + new Interval( + DateHelper.resolveRequestDate(startPeriod, true), true, + DateHelper.resolveRequestDate(endPeriod, false), true + ); + + if (source == null) { + JpaResourceProviderDstu3 vs = (ValueSetResourceProvider) provider.resolveResourceProvider("ValueSet"); + JpaResourceProviderDstu3 cs = (CodeSystemResourceProvider) provider.resolveResourceProvider("CodeSystem"); + terminologyProvider = new JpaTerminologyProvider(vs, cs); + } + else { + terminologyProvider = user == null || pass == null ? new FhirTerminologyProvider().withEndpoint(source) + : new FhirTerminologyProvider().withBasicAuth(user, pass).withEndpoint(source); + } + provider.setTerminologyProvider(terminologyProvider); + provider.setExpandValueSets(true); + context.registerDataProvider("http://hl7.org/fhir", provider); + + // determine the report type (patient, patient-list, or population (summary)) + if (reportType != null) { + switch (reportType) { + case "patient": return evaluatePatientMeasure(measure, patientId); + case "patient-list": return evaluatePatientListMeasure(measure, practitioner); + case "population": return evaluatePopulationMeasure(measure); + case "summary": return evaluatePopulationMeasure(measure); + default: + throw new IllegalArgumentException("Invalid report type " + reportType); + } + } + + // default behavior + else { + if (patientId != null) return evaluatePatientMeasure(measure, patientId); + if (practitioner != null) return evaluatePatientListMeasure(measure, practitioner); + return evaluatePopulationMeasure(measure); + } + } + + private void validateReport() { + if (report == null) { + throw new InternalErrorException("MeasureReport is null"); + } + + if (report.getEvaluatedResources() == null) { + throw new InternalErrorException("EvaluatedResources is null"); + } + } + + private MeasureReport evaluatePatientMeasure(Measure measure, String patientId) { + if (patientId == null) { + throw new IllegalArgumentException("Patient id must be provided for patient type measure evaluation"); + } + + Patient patient = ((PatientResourceProvider) provider.resolveResourceProvider("Patient")).getDao().read(new IdType(patientId)); + if (patient == null) { + throw new InternalErrorException("Patient is null"); + } + + context.setContextValue("Patient", patientId); + + report = evaluator.evaluate(context, measure, patient, measurementPeriod); + validateReport(); + return report; + } + + private MeasureReport evaluatePatientListMeasure(Measure measure, String practitioner) { + SearchParameterMap map = new SearchParameterMap(); + map.add("general-practitioner", new ReferenceParam(practitioner)); + IBundleProvider patientProvider = ((PatientResourceProvider) provider.resolveResourceProvider("Patient")).getDao().search(map); + List patientList = patientProvider.getResources(0, patientProvider.size()); + + if (patientList.isEmpty()) { + throw new IllegalArgumentException("No patients were found with practitioner reference " + practitioner); + } + + List patients = new ArrayList<>(); + patientList.forEach(x -> patients.add((Patient) x)); + +// context.setContextValue("Population", patients); + + report = evaluator.evaluate(context, measure, patients, measurementPeriod, MeasureReport.MeasureReportType.PATIENTLIST); + validateReport(); + return report; + } + + private MeasureReport evaluatePopulationMeasure(Measure measure) { + IBundleProvider patientProvider = ((PatientResourceProvider) provider.resolveResourceProvider("Patient")).getDao().search(new SearchParameterMap()); + List population = patientProvider.getResources(0, patientProvider.size()); + + if (population.isEmpty()) { + throw new IllegalArgumentException("No patients were found in the data provider at endpoint " + provider.getEndpoint()); + } + + List patients = new ArrayList<>(); + population.forEach(x -> patients.add((Patient) x)); + + report = evaluator.evaluate(context, measure, patients, measurementPeriod, MeasureReport.MeasureReportType.SUMMARY); + validateReport(); + return report; + } + + @Operation(name = "$data-requirements", idempotent = true) + public org.hl7.fhir.dstu3.model.Library dataRequirements(@IdParam IdType theId, + @RequiredParam(name="startPeriod") String startPeriod, + @RequiredParam(name="endPeriod") String endPeriod) + throws InternalErrorException, FHIRException + { + Measure measure = this.getDao().read(theId); + + // NOTE: This assumes there is only one library and it is the primary library for the measure. + org.hl7.fhir.dstu3.model.Library libraryResource = + getLibraryResourceProvider() + .getDao() + .read(new IdType(measure.getLibraryFirstRep().getReference())); + + // TODO: what are the period params for? Library.effectivePeriod? + + List dependencies = new ArrayList<>(); + for (RelatedArtifact dependency : libraryResource.getRelatedArtifact()) { + if (dependency.getType().toCode().equals("depends-on")) { + dependencies.add(dependency); + } + } + + List typeCoding = new ArrayList<>(); + typeCoding.add(new Coding().setCode("module-definition")); + org.hl7.fhir.dstu3.model.Library library = + new org.hl7.fhir.dstu3.model.Library().setType(new CodeableConcept().setCoding(typeCoding)); + + if (!dependencies.isEmpty()) { + library.setRelatedArtifact(dependencies); + } + + return library + .setDataRequirement(libraryResource.getDataRequirement()) + .setParameter(libraryResource.getParameter()); + } + + @Search(allowUnknownParams=true) + public IBundleProvider search( + javax.servlet.http.HttpServletRequest theServletRequest, + + RequestDetails theRequestDetails, + + @Description(shortDefinition="Search the contents of the resource's data using a fulltext search") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_CONTENT) + StringAndListParam theFtContent, + + @Description(shortDefinition="Search the contents of the resource's narrative using a fulltext search") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_TEXT) + StringAndListParam theFtText, + + @Description(shortDefinition="Search for resources which have the given tag") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_TAG) + TokenAndListParam theSearchForTag, + + @Description(shortDefinition="Search for resources which have the given security labels") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_SECURITY) + TokenAndListParam theSearchForSecurity, + + @Description(shortDefinition="Search for resources which have the given profile") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE) + UriAndListParam theSearchForProfile, + + @Description(shortDefinition="Return resources linked to by the given target") + @OptionalParam(name="_has") + HasAndListParam theHas, + + @Description(shortDefinition="The ID of the resource") + @OptionalParam(name="_id") + TokenAndListParam the_id, + + @Description(shortDefinition="The language of the resource") + @OptionalParam(name="_language") + StringAndListParam the_language, + + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="composed-of", targetTypes={ } ) + ReferenceAndListParam theComposed_of, + + @Description(shortDefinition="The measure publication date") + @OptionalParam(name="date") + DateRangeParam theDate, + + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="depends-on", targetTypes={ } ) + ReferenceAndListParam theDepends_on, + + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="derived-from", targetTypes={ } ) + ReferenceAndListParam theDerived_from, + + @Description(shortDefinition="The description of the measure") + @OptionalParam(name="description") + StringAndListParam theDescription, + + @Description(shortDefinition="The time during which the measure is intended to be in use") + @OptionalParam(name="effective") + DateRangeParam theEffective, + + @Description(shortDefinition="External identifier for the measure") + @OptionalParam(name="identifier") + TokenAndListParam theIdentifier, + + @Description(shortDefinition="Intended jurisdiction for the measure") + @OptionalParam(name="jurisdiction") + TokenAndListParam theJurisdiction, + + @Description(shortDefinition="Computationally friendly name of the measure") + @OptionalParam(name="name") + StringAndListParam theName, + + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="predecessor", targetTypes={ } ) + ReferenceAndListParam thePredecessor, + + @Description(shortDefinition="Name of the publisher of the measure") + @OptionalParam(name="publisher") + StringAndListParam thePublisher, + + @Description(shortDefinition="The current status of the measure") + @OptionalParam(name="status") + TokenAndListParam theStatus, + + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="successor", targetTypes={ } ) + ReferenceAndListParam theSuccessor, + + @Description(shortDefinition="The human-friendly name of the measure") + @OptionalParam(name="title") + StringAndListParam theTitle, + + @Description(shortDefinition="Topics associated with the module") + @OptionalParam(name="topic") + TokenAndListParam theTopic, + + @Description(shortDefinition="The uri that identifies the measure") + @OptionalParam(name="url") + UriAndListParam theUrl, + + @Description(shortDefinition="The business version of the measure") + @OptionalParam(name="version") + TokenAndListParam theVersion, + + @RawParam + Map> theAdditionalRawParams, + + @IncludeParam(reverse=true) + Set theRevIncludes, + @Description(shortDefinition="Only return resources which were last updated as specified by the given range") + @OptionalParam(name="_lastUpdated") + DateRangeParam theLastUpdated, + + @IncludeParam(allow= { + "Measure:composed-of", + "Measure:depends-on", + "Measure:derived-from", + "Measure:predecessor", + "Measure:successor", + "Measure:composed-of", + "Measure:depends-on", + "Measure:derived-from", + "Measure:predecessor", + "Measure:successor", + "Measure:composed-of", + "Measure:depends-on", + "Measure:derived-from", + "Measure:predecessor", + "Measure:successor", + "Measure:composed-of", + "Measure:depends-on", + "Measure:derived-from", + "Measure:predecessor", + "Measure:successor", + "Measure:composed-of", + "Measure:depends-on", + "Measure:derived-from", + "Measure:predecessor", + "Measure:successor", + "*" + }) + Set theIncludes, + + @Sort + SortSpec theSort, + + @ca.uhn.fhir.rest.annotation.Count + Integer theCount + ) { + startRequest(theServletRequest); + try { + SearchParameterMap paramMap = new SearchParameterMap(); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_CONTENT, theFtContent); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_TEXT, theFtText); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_TAG, theSearchForTag); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_SECURITY, theSearchForSecurity); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE, theSearchForProfile); + paramMap.add("_has", theHas); + paramMap.add("_id", the_id); + paramMap.add("_language", the_language); + paramMap.add("composed-of", theComposed_of); + paramMap.add("date", theDate); + paramMap.add("depends-on", theDepends_on); + paramMap.add("derived-from", theDerived_from); + paramMap.add("description", theDescription); + paramMap.add("effective", theEffective); + paramMap.add("identifier", theIdentifier); + paramMap.add("jurisdiction", theJurisdiction); + paramMap.add("name", theName); + paramMap.add("predecessor", thePredecessor); + paramMap.add("publisher", thePublisher); + paramMap.add("status", theStatus); + paramMap.add("successor", theSuccessor); + paramMap.add("title", theTitle); + paramMap.add("topic", theTopic); + paramMap.add("url", theUrl); + paramMap.add("version", theVersion); + paramMap.setRevIncludes(theRevIncludes); + paramMap.setLastUpdated(theLastUpdated); + paramMap.setIncludes(theIncludes); + paramMap.setSort(theSort); + paramMap.setCount(theCount); +// paramMap.setRequestDetails(theRequestDetails); + + getDao().translateRawParameters(theAdditionalRawParams, paramMap); + + return getDao().search(paramMap, theRequestDetails); + } finally { + endRequest(theServletRequest); + } + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRPlanDefinitionResourceProvider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRPlanDefinitionResourceProvider.java new file mode 100644 index 00000000000..8f5a9796487 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/FHIRPlanDefinitionResourceProvider.java @@ -0,0 +1,295 @@ +package ca.uhn.fhir.jpa.cqf.ruler.providers; + +import ca.uhn.fhir.jpa.dao.SearchParameterMap; +import ca.uhn.fhir.jpa.provider.dstu3.JpaResourceProviderDstu3; +import ca.uhn.fhir.model.api.Include; +import ca.uhn.fhir.model.api.annotation.Description; +import ca.uhn.fhir.rest.annotation.*; +import ca.uhn.fhir.rest.api.SortSpec; +import ca.uhn.fhir.rest.api.server.IBundleProvider; +import ca.uhn.fhir.rest.api.server.RequestDetails; +import ca.uhn.fhir.rest.param.*; +import ca.uhn.fhir.rest.server.IResourceProvider; +import org.hl7.fhir.dstu3.model.*; +import org.hl7.fhir.exceptions.FHIRException; +import ca.uhn.fhir.jpa.cqf.ruler.builders.CarePlanBuilder; +import ca.uhn.fhir.jpa.cqf.ruler.builders.JavaDateBuilder; +import org.opencds.cqf.cql.runtime.DateTime; + +import javax.xml.bind.JAXBException; +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class FHIRPlanDefinitionResourceProvider extends JpaResourceProviderDstu3 { + + private JpaDataProvider provider; + private CqlExecutionProvider executionProvider; + + public FHIRPlanDefinitionResourceProvider(Collection providers) { + this.provider = new JpaDataProvider(providers); + this.executionProvider = new CqlExecutionProvider(providers); + } + + @Operation(name = "$apply", idempotent = true) + public CarePlan applyPlanDefinition( + @IdParam IdType theId, + @RequiredParam(name="patient") String patientId, + @OptionalParam(name="encounter") String encounterId, + @OptionalParam(name="practitioner") String practitionerId, + @OptionalParam(name="organization") String organizationId, + @OptionalParam(name="userType") String userType, + @OptionalParam(name="userLanguage") String userLanguage, + @OptionalParam(name="userTaskContext") String userTaskContext, + @OptionalParam(name="setting") String setting, + @OptionalParam(name="settingContext") String settingContext) + throws IOException, JAXBException, FHIRException + { + PlanDefinition planDefinition = this.getDao().read(theId); + + if (planDefinition == null) { + throw new IllegalArgumentException("Couldn't find PlanDefintion " + theId); + } + + CarePlanBuilder builder = new CarePlanBuilder(); + + builder + .buildDefinition(new Reference(planDefinition.getIdElement().getIdPart())) + .buildSubject(new Reference(patientId)) + .buildStatus(CarePlan.CarePlanStatus.DRAFT); + + if (encounterId != null) builder.buildContext(new Reference(encounterId)); + if (practitionerId != null) builder.buildAuthor(new Reference(practitionerId)); + if (organizationId != null) builder.buildAuthor(new Reference(organizationId)); + if (userLanguage != null) builder.buildLanguage(userLanguage); + + return resolveActions(planDefinition, builder, patientId); + } + + private CarePlan resolveActions(PlanDefinition planDefinition, CarePlanBuilder builder, + String patientId) throws FHIRException + { + for (PlanDefinition.PlanDefinitionActionComponent action : planDefinition.getAction()) + { + // TODO - Apply input/output dataRequirements? + + if (meetsConditions(planDefinition, patientId, action)) { + return resolveDynamicValues(planDefinition, builder.build(), patientId, action); + } + } + + return builder.build(); + } + + public Boolean meetsConditions(PlanDefinition planDefinition, String patientId, + PlanDefinition.PlanDefinitionActionComponent action) + { + for (PlanDefinition.PlanDefinitionActionConditionComponent condition: action.getCondition()) { + // TODO start + // TODO stop + if (condition.getKind() == PlanDefinition.ActionConditionKind.APPLICABILITY) { + if (!condition.getLanguage().equals("text/cql")) { + // TODO - log this + continue; + } + + if (!condition.hasExpression()) { + // TODO - log this + continue; + } + + String cql = condition.getExpression(); + Object result = executionProvider.evaluateInContext(planDefinition, cql, patientId); + + if (!(result instanceof Boolean)) { + // TODO - log this + // maybe try an int value check (i.e. 0 or 1)? + continue; + } + + if (!(Boolean) result) { + return false; + } + } + } + + return true; + } + + private CarePlan resolveDynamicValues(PlanDefinition planDefinition, CarePlan carePlan, String patientId, + PlanDefinition.PlanDefinitionActionComponent action) throws FHIRException + { + for (PlanDefinition.PlanDefinitionActionDynamicValueComponent dynamicValue: action.getDynamicValue()) + { + if (dynamicValue.hasExpression()) { + Object result = + executionProvider + .evaluateInContext(planDefinition, dynamicValue.getExpression(), patientId); + + if (dynamicValue.hasPath() && dynamicValue.getPath().equals("$this")) + { + carePlan = (CarePlan) result; + } + + else { + + // TODO - likely need more date tranformations + if (result instanceof DateTime) { + result = + new JavaDateBuilder() + .buildFromDateTime((DateTime) result) + .build(); + } + + else if (result instanceof String) { + result = new StringType((String) result); + } + + provider.setValue(carePlan, dynamicValue.getPath(), result); + } + } + } + + return carePlan; + } + + @Search(allowUnknownParams=true) + public IBundleProvider search( + javax.servlet.http.HttpServletRequest theServletRequest, + RequestDetails theRequestDetails, + @Description(shortDefinition="Search the contents of the resource's data using a fulltext search") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_CONTENT) + StringAndListParam theFtContent, + @Description(shortDefinition="Search the contents of the resource's narrative using a fulltext search") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_TEXT) + StringAndListParam theFtText, + @Description(shortDefinition="Search for resources which have the given tag") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_TAG) + TokenAndListParam theSearchForTag, + @Description(shortDefinition="Search for resources which have the given security labels") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_SECURITY) + TokenAndListParam theSearchForSecurity, + @Description(shortDefinition="Search for resources which have the given profile") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE) + UriAndListParam theSearchForProfile, + @Description(shortDefinition="Return resources linked to by the given target") + @OptionalParam(name="_has") + HasAndListParam theHas, + @Description(shortDefinition="The ID of the resource") + @OptionalParam(name="_id") + TokenAndListParam the_id, + @Description(shortDefinition="The language of the resource") + @OptionalParam(name="_language") + StringAndListParam the_language, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="composed-of", targetTypes={ } ) + ReferenceAndListParam theComposed_of, + @Description(shortDefinition="The plan definition publication date") + @OptionalParam(name="date") + DateRangeParam theDate, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="depends-on", targetTypes={ } ) + ReferenceAndListParam theDepends_on, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="derived-from", targetTypes={ } ) + ReferenceAndListParam theDerived_from, + @Description(shortDefinition="The description of the plan definition") + @OptionalParam(name="description") + StringAndListParam theDescription, + @Description(shortDefinition="The time during which the plan definition is intended to be in use") + @OptionalParam(name="effective") + DateRangeParam theEffective, + @Description(shortDefinition="External identifier for the plan definition") + @OptionalParam(name="identifier") + TokenAndListParam theIdentifier, + @Description(shortDefinition="Intended jurisdiction for the plan definition") + @OptionalParam(name="jurisdiction") + TokenAndListParam theJurisdiction, + @Description(shortDefinition="Computationally friendly name of the plan definition") + @OptionalParam(name="name") + StringAndListParam theName, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="predecessor", targetTypes={ } ) + ReferenceAndListParam thePredecessor, + @Description(shortDefinition="Name of the publisher of the plan definition") + @OptionalParam(name="publisher") + StringAndListParam thePublisher, + @Description(shortDefinition="The current status of the plan definition") + @OptionalParam(name="status") + TokenAndListParam theStatus, + @Description(shortDefinition="What resource is being referenced") + @OptionalParam(name="successor", targetTypes={ } ) + ReferenceAndListParam theSuccessor, + @Description(shortDefinition="The human-friendly name of the plan definition") + @OptionalParam(name="title") + StringAndListParam theTitle, + @Description(shortDefinition="Topics associated with the module") + @OptionalParam(name="topic") + TokenAndListParam theTopic, + @Description(shortDefinition="The uri that identifies the plan definition") + @OptionalParam(name="url") + UriAndListParam theUrl, + @Description(shortDefinition="The business version of the plan definition") + @OptionalParam(name="version") + TokenAndListParam theVersion, + @RawParam + Map> theAdditionalRawParams, + @IncludeParam(reverse=true) + Set theRevIncludes, + @Description(shortDefinition="Only return resources which were last updated as specified by the given range") + @OptionalParam(name="_lastUpdated") + DateRangeParam theLastUpdated, + @IncludeParam(allow= { + "PlanDefinition:composed-of" , "PlanDefinition:depends-on" , "PlanDefinition:derived-from" , "PlanDefinition:predecessor" , "PlanDefinition:successor" , "PlanDefinition:composed-of" , "PlanDefinition:depends-on" , "PlanDefinition:derived-from" , "PlanDefinition:predecessor" , "PlanDefinition:successor" , "PlanDefinition:composed-of" , "PlanDefinition:depends-on" , "PlanDefinition:derived-from" , "PlanDefinition:predecessor" , "PlanDefinition:successor" , "PlanDefinition:composed-of" , "PlanDefinition:depends-on" , "PlanDefinition:derived-from" , "PlanDefinition:predecessor" , "PlanDefinition:successor" , "PlanDefinition:composed-of" , "PlanDefinition:depends-on" , "PlanDefinition:derived-from" , "PlanDefinition:predecessor" , "PlanDefinition:successor" , "*" + }) + Set theIncludes, + @Sort + SortSpec theSort, + @ca.uhn.fhir.rest.annotation.Count + Integer theCount + ) { + startRequest(theServletRequest); + try { + SearchParameterMap paramMap = new SearchParameterMap(); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_CONTENT, theFtContent); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_TEXT, theFtText); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_TAG, theSearchForTag); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_SECURITY, theSearchForSecurity); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE, theSearchForProfile); + paramMap.add("_has", theHas); + paramMap.add("_id", the_id); + paramMap.add("_language", the_language); + paramMap.add("composed-of", theComposed_of); + paramMap.add("date", theDate); + paramMap.add("depends-on", theDepends_on); + paramMap.add("derived-from", theDerived_from); + paramMap.add("description", theDescription); + paramMap.add("effective", theEffective); + paramMap.add("identifier", theIdentifier); + paramMap.add("jurisdiction", theJurisdiction); + paramMap.add("name", theName); + paramMap.add("predecessor", thePredecessor); + paramMap.add("publisher", thePublisher); + paramMap.add("status", theStatus); + paramMap.add("successor", theSuccessor); + paramMap.add("title", theTitle); + paramMap.add("topic", theTopic); + paramMap.add("url", theUrl); + paramMap.add("version", theVersion); + paramMap.setRevIncludes(theRevIncludes); + paramMap.setLastUpdated(theLastUpdated); + paramMap.setIncludes(theIncludes); + paramMap.setSort(theSort); + paramMap.setCount(theCount); +// paramMap.setRequestDetails(theRequestDetails); + + getDao().translateRawParameters(theAdditionalRawParams, paramMap); + + return getDao().search(paramMap, theRequestDetails); + } finally { + endRequest(theServletRequest); + } + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/JpaDataProvider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/JpaDataProvider.java new file mode 100644 index 00000000000..64cb2562d29 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/JpaDataProvider.java @@ -0,0 +1,127 @@ +package ca.uhn.fhir.jpa.cqf.ruler.providers; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.jpa.dao.SearchParameterMap; +import ca.uhn.fhir.jpa.provider.dstu3.JpaResourceProviderDstu3; +import ca.uhn.fhir.rest.api.server.IBundleProvider; +import ca.uhn.fhir.rest.param.*; +import ca.uhn.fhir.rest.server.IResourceProvider; +import org.hl7.fhir.instance.model.api.IAnyResource; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.opencds.cqf.cql.data.fhir.FhirDataProviderStu3; +import org.opencds.cqf.cql.runtime.Code; +import org.opencds.cqf.cql.runtime.Interval; +import org.opencds.cqf.cql.terminology.ValueSetInfo; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +/** + * Created by Christopher Schuler on 7/17/2017. + */ +public class JpaDataProvider extends FhirDataProviderStu3 { + + // need these to access the dao + private HashMap providers; + + public JpaDataProvider(Collection providers) { + this.providers = new HashMap<>(); + for (IResourceProvider i : providers) { + this.providers.put(i.getResourceType().getSimpleName(), i); + } + + // NOTE: Defaults to STU3 + setPackageName("org.hl7.fhir.dstu3.model"); + setFhirContext(FhirContext.forDstu3()); + } + + public Iterable retrieve(String context, Object contextValue, String dataType, String templateId, + String codePath, Iterable codes, String valueSet, String datePath, + String dateLowPath, String dateHighPath, Interval dateRange) + { + + SearchParameterMap map = new SearchParameterMap(); + map.setLastUpdated(new DateRangeParam()); + + if (templateId != null && !templateId.equals("")) { + // do something? + } + + if (valueSet != null && valueSet.startsWith("urn:oid:")) { + valueSet = valueSet.replace("urn:oid:", ""); + } + + if (codePath == null && (codes != null || valueSet != null)) { + throw new IllegalArgumentException("A code path must be provided when filtering on codes or a valueset."); + } + + if (dataType == null) { + throw new IllegalArgumentException("A data type (i.e. Procedure, Valueset, etc...) must be specified for clinical data retrieval"); + } + + if (context != null && context.equals("Patient") && contextValue != null) { + ReferenceParam patientParam = new ReferenceParam(contextValue.toString()); + map.add(getPatientSearchParam(dataType), patientParam); + } + + if (codePath != null && !codePath.equals("")) { + + if (terminologyProvider != null && expandValueSets) { + ValueSetInfo valueSetInfo = new ValueSetInfo().withId(valueSet); + codes = terminologyProvider.expand(valueSetInfo); + } + if (codes != null) { + TokenOrListParam codeParams = new TokenOrListParam(); + for (Code code : codes) { + codeParams.addOr(new TokenParam(code.getSystem(), code.getCode())); + } + map.add(convertPathToSearchParam(codePath), codeParams); + } + } + + if (dateRange != null) { + DateParam low = null; + DateParam high = null; + if (dateRange.getLow() != null) { + low = new DateParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, convertPathToSearchParam(dateLowPath != null ? dateLowPath : datePath)); + } + + if (dateRange.getHigh() != null) { + high = new DateParam(ParamPrefixEnum.LESSTHAN_OR_EQUALS, convertPathToSearchParam(dateHighPath != null ? dateHighPath : datePath)); + } + DateRangeParam rangeParam; + if (low == null && high != null) { + rangeParam = new DateRangeParam(high); + } + else if (high == null && low != null) { + rangeParam = new DateRangeParam(low); + } + else { + rangeParam = new DateRangeParam(high, low); + } + + map.add(convertPathToSearchParam(datePath), rangeParam); + } + + JpaResourceProviderDstu3 jpaResProvider = resolveResourceProvider(dataType); + IBundleProvider bundleProvider = jpaResProvider.getDao().search(map); + List resourceList = bundleProvider.getResources(0, 50); + return resolveResourceList(resourceList); + } + + public Iterable resolveResourceList(List resourceList) { + List ret = new ArrayList<>(); + for (IBaseResource res : resourceList) { + Class clazz = res.getClass(); + ret.add(clazz.cast(res)); + } + // ret.addAll(resourceList); + return ret; + } + + public JpaResourceProviderDstu3 resolveResourceProvider(String datatype) { + return (JpaResourceProviderDstu3) providers.get(datatype); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/JpaTerminologyProvider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/JpaTerminologyProvider.java new file mode 100644 index 00000000000..b6165c0338b --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/JpaTerminologyProvider.java @@ -0,0 +1,58 @@ +package ca.uhn.fhir.jpa.cqf.ruler.providers; + +import ca.uhn.fhir.jpa.provider.dstu3.JpaResourceProviderDstu3; +import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; +import org.hl7.fhir.dstu3.model.CodeSystem; +import org.hl7.fhir.dstu3.model.IdType; +import org.hl7.fhir.dstu3.model.ValueSet; +import org.opencds.cqf.cql.runtime.Code; +import org.opencds.cqf.cql.terminology.CodeSystemInfo; +import org.opencds.cqf.cql.terminology.TerminologyProvider; +import org.opencds.cqf.cql.terminology.ValueSetInfo; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Christopher Schuler on 7/17/2017. + */ +public class JpaTerminologyProvider implements TerminologyProvider { + private JpaResourceProviderDstu3 valueSetProvider; + private JpaResourceProviderDstu3 codeSystemProvider; + + public JpaTerminologyProvider(JpaResourceProviderDstu3 valueSetProvider, JpaResourceProviderDstu3 codeSystemProvider) { + this.valueSetProvider = valueSetProvider; + this.codeSystemProvider = codeSystemProvider; + } + + @Override + public boolean in(Code code, ValueSetInfo valueSet) throws ResourceNotFoundException { + for (Code c : expand(valueSet)) { + if (c == null) continue; + if (c.getCode().equals(code.getCode()) && c.getSystem().equals(code.getSystem())) { + return true; + } + } + return false; + } + + @Override + public Iterable expand(ValueSetInfo valueSet) throws ResourceNotFoundException { + ValueSet vs = valueSetProvider.getDao().read(new IdType(valueSet.getId())); + List codes = new ArrayList<>(); + for (ValueSet.ValueSetExpansionContainsComponent expansion : vs.getExpansion().getContains()) { + codes.add(new Code().withCode(expansion.getCode()).withSystem(expansion.getSystem())); + } + return codes; + } + + @Override + public Code lookup(Code code, CodeSystemInfo codeSystem) throws ResourceNotFoundException { + CodeSystem cs = codeSystemProvider.getDao().read(new IdType(codeSystem.getId())); + for (CodeSystem.ConceptDefinitionComponent concept : cs.getConcept()) { + if (concept.getCode().equals(code.getCode())) + return code.withSystem(codeSystem.getId()).withDisplay(concept.getDisplay()); + } + return code; + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/NarrativeProvider.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/NarrativeProvider.java new file mode 100644 index 00000000000..4073493f82d --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/providers/NarrativeProvider.java @@ -0,0 +1,46 @@ +package ca.uhn.fhir.jpa.cqf.ruler.providers; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.narrative.CustomThymeleafNarrativeGenerator; +import org.hl7.fhir.instance.model.api.IBaseResource; + +import java.io.*; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Created by Christopher on 2/4/2017. + */ +public class NarrativeProvider { + + // args[0] == relative path to json resource -> i.e. measure/cms146.json + public static void main(String[] args) { + Path pathToResources = Paths.get("src/main/resources/narratives").toAbsolutePath(); + Path pathToProp = pathToResources.resolve("narrative.properties"); + String propFile = "file:" + pathToProp.toString(); + CustomThymeleafNarrativeGenerator gen = new CustomThymeleafNarrativeGenerator(propFile); + FhirContext ctx = FhirContext.forDstu3(); + ctx.setNarrativeGenerator(gen); + + // examples are here: src/main/resources/narratives/examples + if (args.length < 1) { throw new IllegalArgumentException("provide a file name..."); } + Path pathToResource = pathToResources.resolve("examples/" + args[0]); + + try { + IBaseResource res = ctx.newJsonParser().parseResource(new FileReader(pathToResource.toFile())); + String resource = ctx.newXmlParser().setPrettyPrint(true) + .encodeResourceToString(ctx.newJsonParser().setPrettyPrint(true).parseResource(new FileReader(pathToResource.toFile()))); + + try { + PrintWriter writer = new PrintWriter(new File(pathToResources.resolve("scratch.xml").toString()), "UTF-8"); + writer.println(resource); + writer.println(); + writer.close(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/servlet/BaseServlet.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/servlet/BaseServlet.java new file mode 100644 index 00000000000..aae6bfd368b --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/servlet/BaseServlet.java @@ -0,0 +1,150 @@ +package ca.uhn.fhir.jpa.cqf.ruler.servlet; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.context.FhirVersionEnum; +import ca.uhn.fhir.jpa.dao.DaoConfig; +import ca.uhn.fhir.jpa.dao.IFhirSystemDao; +import ca.uhn.fhir.jpa.provider.dstu3.JpaConformanceProviderDstu3; +import ca.uhn.fhir.jpa.provider.dstu3.JpaSystemProviderDstu3; +import ca.uhn.fhir.jpa.rp.dstu3.ActivityDefinitionResourceProvider; +import ca.uhn.fhir.jpa.rp.dstu3.MeasureResourceProvider; +import ca.uhn.fhir.jpa.rp.dstu3.PlanDefinitionResourceProvider; +import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; +import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator; +import ca.uhn.fhir.rest.api.EncodingEnum; +import ca.uhn.fhir.rest.server.IResourceProvider; +import ca.uhn.fhir.rest.server.RestfulServer; +import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor; +import ca.uhn.fhir.rest.server.interceptor.LoggingInterceptor; +import org.hl7.fhir.dstu3.model.Bundle; +import org.hl7.fhir.dstu3.model.Meta; +import ca.uhn.fhir.jpa.cqf.ruler.providers.FHIRActivityDefinitionResourceProvider; +import ca.uhn.fhir.jpa.cqf.ruler.providers.FHIRMeasureResourceProvider; +import ca.uhn.fhir.jpa.cqf.ruler.providers.FHIRPlanDefinitionResourceProvider; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.WebApplicationContext; + +import javax.servlet.ServletException; +import java.util.Collection; +import java.util.List; + +/** + * Created by Chris Schuler on 12/11/2016. + */ +public class BaseServlet extends RestfulServer { + + @SuppressWarnings("unchecked") + @Override + protected void initialize() throws ServletException { + + super.initialize(); + + FhirVersionEnum fhirVersion = FhirVersionEnum.DSTU3; + setFhirContext(new FhirContext(fhirVersion)); + + // Get the spring context from the web container (it's declared in web.xml) + WebApplicationContext myAppCtx = ContextLoaderListener.getCurrentWebApplicationContext(); + + String resourceProviderBeanName = "myResourceProvidersDstu3"; + List beans = myAppCtx.getBean(resourceProviderBeanName, List.class); + setResourceProviders(beans); + + Object systemProvider = myAppCtx.getBean("mySystemProviderDstu3", JpaSystemProviderDstu3.class); + setPlainProviders(systemProvider); + + IFhirSystemDao systemDao = myAppCtx.getBean("mySystemDaoDstu3", IFhirSystemDao.class); + JpaConformanceProviderDstu3 confProvider = new JpaConformanceProviderDstu3(this, systemDao, + myAppCtx.getBean(DaoConfig.class)); + confProvider.setImplementationDescription("Measure and Opioid Processing Server"); + setServerConformanceProvider(confProvider); + + FhirContext ctx = getFhirContext(); + ctx.setNarrativeGenerator(new DefaultThymeleafNarrativeGenerator()); + setDefaultPrettyPrint(true); + setDefaultResponseEncoding(EncodingEnum.JSON); + setPagingProvider(myAppCtx.getBean(DatabaseBackedPagingProvider.class)); + + /* + * Enable CORS + */ +// CorsConfiguration config = new CorsConfiguration(); +// CorsInterceptor corsInterceptor = new CorsInterceptor(config); +// config.addAllowedHeader("Origin"); +// config.addAllowedHeader("Accept"); +// config.addAllowedHeader("X-Requested-With"); +// config.addAllowedHeader("Content-Type"); +// config.addAllowedHeader("Access-Control-Request-Method"); +// config.addAllowedHeader("Access-Control-Request-Headers"); +// config.addAllowedOrigin("*"); +// config.addExposedHeader("Location"); +// config.addExposedHeader("Content-Location"); +// config.setAllowedMethods(Arrays.asList("GET","POST","PUT","DELETE","OPTIONS")); +// registerInterceptor(corsInterceptor); + + /* + * Load interceptors for the server from Spring (these are defined in FhirServerConfig.java) + */ + Collection interceptorBeans = myAppCtx.getBeansOfType(IServerInterceptor.class).values(); + for (IServerInterceptor interceptor : interceptorBeans) { + this.registerInterceptor(interceptor); + } + + // Measure processing + FHIRMeasureResourceProvider measureProvider = new FHIRMeasureResourceProvider(getResourceProviders()); + MeasureResourceProvider jpaMeasureProvider = (MeasureResourceProvider) getProvider("Measure"); + measureProvider.setDao(jpaMeasureProvider.getDao()); + measureProvider.setContext(jpaMeasureProvider.getContext()); + + // PlanDefinition processing + FHIRPlanDefinitionResourceProvider planDefProvider = new FHIRPlanDefinitionResourceProvider(getResourceProviders()); + PlanDefinitionResourceProvider jpaPlanDefProvider = + (PlanDefinitionResourceProvider) getProvider("PlanDefinition"); + planDefProvider.setDao(jpaPlanDefProvider.getDao()); + planDefProvider.setContext(jpaPlanDefProvider.getContext()); + + // ActivityDefinition processing + FHIRActivityDefinitionResourceProvider actDefProvider = new FHIRActivityDefinitionResourceProvider(getResourceProviders()); + ActivityDefinitionResourceProvider jpaActDefProvider = + (ActivityDefinitionResourceProvider) getProvider("ActivityDefinition"); + actDefProvider.setDao(jpaActDefProvider.getDao()); + actDefProvider.setContext(jpaActDefProvider.getContext()); + + try { + unregisterProvider(jpaMeasureProvider); + unregisterProvider(jpaPlanDefProvider); + unregisterProvider(jpaActDefProvider); + } catch (Exception e) { + throw new ServletException("Unable to unregister provider: " + e.getMessage()); + } + + registerProvider(measureProvider); + registerProvider(planDefProvider); + registerProvider(actDefProvider); + + // Register the logging interceptor + LoggingInterceptor loggingInterceptor = new LoggingInterceptor(); + this.registerInterceptor(loggingInterceptor); + + // The SLF4j logger "test.accesslog" will receive the logging events + loggingInterceptor.setLoggerName("logging.accesslog"); + + // This is the format for each line. A number of substitution variables may + // be used here. See the JavaDoc for LoggingInterceptor for information on + // what is available. + loggingInterceptor.setMessageFormat("Source[${remoteAddr}] Operation[${operationType} ${idOrResourceName}] UA[${requestHeader.user-agent}] Params[${requestParameters}]"); + + //setServerAddressStrategy(new HardcodedServerAddressStrategy("http://mydomain.com/fhir/baseDstu2")); + //registerProvider(myAppCtx.getBean(TerminologyUploaderProviderDstu3.class)); + } + + public IResourceProvider getProvider(String name) { + + for (IResourceProvider res : getResourceProviders()) { + if (res.getResourceType().getSimpleName().equals(name)) { + return res; + } + } + + throw new IllegalArgumentException("This should never happen!"); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/servlet/CdsServicesServlet.java b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/servlet/CdsServicesServlet.java new file mode 100644 index 00000000000..5479a0b5356 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/java/ca/uhn/fhir/jpa/cqf/ruler/servlet/CdsServicesServlet.java @@ -0,0 +1,180 @@ +package ca.uhn.fhir.jpa.cqf.ruler.servlet; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.jpa.rp.dstu3.LibraryResourceProvider; +import ca.uhn.fhir.model.primitive.IdDt; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.hl7.fhir.dstu3.model.*; +import org.hl7.fhir.exceptions.FHIRException; +import ca.uhn.fhir.jpa.cqf.ruler.cds.*; +import ca.uhn.fhir.jpa.cqf.ruler.providers.FHIRPlanDefinitionResourceProvider; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +/** + * Created by Christopher Schuler on 5/1/2017. + */ +@WebServlet(name = "cds-services") +public class CdsServicesServlet extends BaseServlet { + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + // validate that we are dealing with JSON + if (!request.getContentType().equals("application/json")) { + throw new ServletException(String.format("Invalid content type %s. Please use application/json.", request.getContentType())); + } + + CdsHooksRequest cdsHooksRequest = new CdsHooksRequest(request.getReader()); + CdsRequestProcessor processor = null; + + String service = request.getPathInfo().replace("/", ""); + + // PlanDefinition must have the same id as the cds service + // For example, {BASE}/cds-services/cdc-opioid-guidance -> PlanDefinition ID = cds-opioid-guidance + PlanDefinition planDefinition = + ((FHIRPlanDefinitionResourceProvider) getProvider("PlanDefinition")) + .getDao() + .read(new IdDt(service)); + + // Custom cds services + if (request.getRequestURL().toString().endsWith("cdc-opioid-guidance")) { + resolveMedicationPrescribePrefetch(cdsHooksRequest); + try { + processor = new OpioidGuidanceProcessor(cdsHooksRequest, planDefinition, (LibraryResourceProvider) getProvider("Library")); + } catch (FHIRException e) { + e.printStackTrace(); + } + } + + else { + // User-defined cds services + // These are limited - no user-defined data/terminology providers + switch (cdsHooksRequest.getHook()) { + case "medication-prescribe": + resolveMedicationPrescribePrefetch(cdsHooksRequest); + try { + processor = new MedicationPrescribeProcessor(cdsHooksRequest, planDefinition, (LibraryResourceProvider) getProvider("Library")); + } catch (FHIRException e) { + e.printStackTrace(); + } + break; + case "order-review": + // resolveOrderReviewPrefetch(cdsHooksRequest); + // TODO - currently only works for ProcedureRequest orders + processor = new OrderReviewProcessor(cdsHooksRequest, planDefinition, (LibraryResourceProvider) getProvider("Library")); + break; + + case "patient-view": + processor = new PatientViewProcessor(cdsHooksRequest, planDefinition, (LibraryResourceProvider) getProvider("Library")); + break; + } + } + + if (processor == null) { + throw new ServletException("Invalid cds service"); + } + + response.getWriter().println(toJsonResponse(processor.process())); + } + + // If the EHR did not provide the prefetch resources, fetch them + // Assuming EHR is using DSTU2 resources here... + // This is a big drag on performance. + public void resolveMedicationPrescribePrefetch(CdsHooksRequest cdsHooksRequest) { + if (cdsHooksRequest.getPrefetch().size() == 0) { + String searchUrl = String.format("MedicationOrder?patient=%s&status=active", cdsHooksRequest.getPatientId()); + ca.uhn.fhir.model.dstu2.resource.Bundle postfetch = FhirContext.forDstu2() + .newRestfulGenericClient(cdsHooksRequest.getFhirServerEndpoint()) + .search() + .byUrl(searchUrl) + .returnBundle(ca.uhn.fhir.model.dstu2.resource.Bundle.class) + .execute(); + cdsHooksRequest.setPrefetch(postfetch, "medication"); + } + } + + // This is especially inefficient as the search must be done for each Request resource (and then converted to stu3): + // MedicationOrder -> MedicationRequest, DiagnosticOrder or DeviceUseRequest -> ProcedureRequest, SupplyRequest + public void resolveOrderReviewPrefetch(CdsHooksRequest cdsHooksRequest) { + + // TODO - clean this up + + if (cdsHooksRequest.getPrefetch().size() == 0) { + String searchUrl = String.format("MedicationOrder?patient=%s&encounter=%s", cdsHooksRequest.getPatientId(), cdsHooksRequest.getEncounterId()); + ca.uhn.fhir.model.dstu2.resource.Bundle postfetch = FhirContext.forDstu2() + .newRestfulGenericClient(cdsHooksRequest.getFhirServerEndpoint()) + .search() + .byUrl(searchUrl) + .returnBundle(ca.uhn.fhir.model.dstu2.resource.Bundle.class) + .execute(); + cdsHooksRequest.setPrefetch(postfetch, "medication"); + + searchUrl = String.format("DiagnosticOrder?patient=%s&encounter=%s", cdsHooksRequest.getPatientId(), cdsHooksRequest.getEncounterId()); + ca.uhn.fhir.model.dstu2.resource.Bundle diagnosticOrders = FhirContext.forDstu2() + .newRestfulGenericClient(cdsHooksRequest.getFhirServerEndpoint()) + .search() + .byUrl(searchUrl) + .returnBundle(ca.uhn.fhir.model.dstu2.resource.Bundle.class) + .execute(); + cdsHooksRequest.setPrefetch(diagnosticOrders, "diagnosticOrders"); + + searchUrl = String.format("DeviceUseRequest?patient=%s&encounter=%s", cdsHooksRequest.getPatientId(), cdsHooksRequest.getEncounterId()); + ca.uhn.fhir.model.dstu2.resource.Bundle deviceUseRequests = FhirContext.forDstu2() + .newRestfulGenericClient(cdsHooksRequest.getFhirServerEndpoint()) + .search() + .byUrl(searchUrl) + .returnBundle(ca.uhn.fhir.model.dstu2.resource.Bundle.class) + .execute(); + cdsHooksRequest.setPrefetch(deviceUseRequests, "deviceUseRequests"); + + searchUrl = String.format("ProcedureRequest?patient=%s&encounter=%s", cdsHooksRequest.getPatientId(), cdsHooksRequest.getEncounterId()); + ca.uhn.fhir.model.dstu2.resource.Bundle procedureRequests = FhirContext.forDstu2() + .newRestfulGenericClient(cdsHooksRequest.getFhirServerEndpoint()) + .search() + .byUrl(searchUrl) + .returnBundle(ca.uhn.fhir.model.dstu2.resource.Bundle.class) + .execute(); + cdsHooksRequest.setPrefetch(procedureRequests, "procedureRequests"); + + searchUrl = String.format("SupplyRequest?patient=%s&encounter=%s", cdsHooksRequest.getPatientId(), cdsHooksRequest.getEncounterId()); + ca.uhn.fhir.model.dstu2.resource.Bundle supplyRequests = FhirContext.forDstu2() + .newRestfulGenericClient(cdsHooksRequest.getFhirServerEndpoint()) + .search() + .byUrl(searchUrl) + .returnBundle(ca.uhn.fhir.model.dstu2.resource.Bundle.class) + .execute(); + cdsHooksRequest.setPrefetch(supplyRequests, "supplyRequests"); + } + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + if (!request.getRequestURL().toString().endsWith("cds-services")) { + throw new ServletException("This servlet is not configured to handle GET requests."); + } + + CdsHooksHelper.DisplayDiscovery(response); + } + + public String toJsonResponse(List cards) { + JsonObject ret = new JsonObject(); + JsonArray cardArray = new JsonArray(); + + for (CdsCard card : cards) { + cardArray.add(card.toJson()); + } + + ret.add("cards", cardArray); + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + return gson.toJson(ret); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/cds/OMTK-modelinfo-0.1.0.xml b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/cds/OMTK-modelinfo-0.1.0.xml new file mode 100644 index 00000000000..64ad6a415da --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/cds/OMTK-modelinfo-0.1.0.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.1.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.1.json new file mode 100644 index 00000000000..4e741f73f71 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.1.json @@ -0,0 +1,34 @@ +{ + "resourceType": "CodeSystem", + "id": "2.16.840.1.113883.6.1", + "url": "http://loinc.org", + "status": "draft", + "content": "example", + "concept": [ + { + "code": "17856-6", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood by HPLC" + }, + { + "code": "4548-4", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood" + }, + { + "code": "4549-2", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood by Electrophoresis" + }, + { + "code": "17856-6", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood by HPLC" + }, + { + "code": "4548-4", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood" + }, + { + "code": "4549-2", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood by Electrophoresis" + } + ] +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.103.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.103.json new file mode 100644 index 00000000000..cda10c80d31 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.103.json @@ -0,0 +1,443 @@ +{ + "resourceType": "CodeSystem", + "id": "2.16.840.1.113883.6.103", + "url": "http://hl7.org/fhir/sid/icd-9-cm", + "version": "2013", + "status": "draft", + "content": "example", + "concept": [ + { + "code": "250", + "display": "Diabetes mellitus without mention of complication, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.01", + "display": "Diabetes mellitus without mention of complication, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.02", + "display": "Diabetes mellitus without mention of complication, type II or unspecified type, uncontrolled" + }, + { + "code": "250.03", + "display": "Diabetes mellitus without mention of complication, type I [juvenile type], uncontrolled" + }, + { + "code": "250.1", + "display": "Diabetes with ketoacidosis, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.11", + "display": "Diabetes with ketoacidosis, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.12", + "display": "Diabetes with ketoacidosis, type II or unspecified type, uncontrolled" + }, + { + "code": "250.13", + "display": "Diabetes with ketoacidosis, type I [juvenile type], uncontrolled" + }, + { + "code": "250.2", + "display": "Diabetes with hyperosmolarity, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.21", + "display": "Diabetes with hyperosmolarity, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.22", + "display": "Diabetes with hyperosmolarity, type II or unspecified type, uncontrolled" + }, + { + "code": "250.23", + "display": "Diabetes with hyperosmolarity, type I [juvenile type], uncontrolled" + }, + { + "code": "250.3", + "display": "Diabetes with other coma, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.31", + "display": "Diabetes with other coma, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.32", + "display": "Diabetes with other coma, type II or unspecified type, uncontrolled" + }, + { + "code": "250.33", + "display": "Diabetes with other coma, type I [juvenile type], uncontrolled" + }, + { + "code": "250.4", + "display": "Diabetes with renal manifestations, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.41", + "display": "Diabetes with renal manifestations, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.42", + "display": "Diabetes with renal manifestations, type II or unspecified type, uncontrolled" + }, + { + "code": "250.43", + "display": "Diabetes with renal manifestations, type I [juvenile type], uncontrolled" + }, + { + "code": "250.5", + "display": "Diabetes with ophthalmic manifestations, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.51", + "display": "Diabetes with ophthalmic manifestations, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.52", + "display": "Diabetes with ophthalmic manifestations, type II or unspecified type, uncontrolled" + }, + { + "code": "250.53", + "display": "Diabetes with ophthalmic manifestations, type I [juvenile type], uncontrolled" + }, + { + "code": "250.6", + "display": "Diabetes with neurological manifestations, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.61", + "display": "Diabetes with neurological manifestations, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.62", + "display": "Diabetes with neurological manifestations, type II or unspecified type, uncontrolled" + }, + { + "code": "250.63", + "display": "Diabetes with neurological manifestations, type I [juvenile type], uncontrolled" + }, + { + "code": "250.7", + "display": "Diabetes with peripheral circulatory disorders, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.71", + "display": "Diabetes with peripheral circulatory disorders, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.72", + "display": "Diabetes with peripheral circulatory disorders, type II or unspecified type, uncontrolled" + }, + { + "code": "250.73", + "display": "Diabetes with peripheral circulatory disorders, type I [juvenile type], uncontrolled" + }, + { + "code": "250.8", + "display": "Diabetes with other specified manifestations, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.81", + "display": "Diabetes with other specified manifestations, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.82", + "display": "Diabetes with other specified manifestations, type II or unspecified type, uncontrolled" + }, + { + "code": "250.83", + "display": "Diabetes with other specified manifestations, type I [juvenile type], uncontrolled" + }, + { + "code": "250.9", + "display": "Diabetes with unspecified complication, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.91", + "display": "Diabetes with unspecified complication, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.92", + "display": "Diabetes with unspecified complication, type II or unspecified type, uncontrolled" + }, + { + "code": "250.93", + "display": "Diabetes with unspecified complication, type I [juvenile type], uncontrolled" + }, + { + "code": "357.2", + "display": "Polyneuropathy in diabetes" + }, + { + "code": "362.01", + "display": "Background diabetic retinopathy" + }, + { + "code": "362.02", + "display": "Proliferative diabetic retinopathy" + }, + { + "code": "362.03", + "display": "Nonproliferative diabetic retinopathy NOS" + }, + { + "code": "362.04", + "display": "Mild nonproliferative diabetic retinopathy" + }, + { + "code": "362.05", + "display": "Moderate nonproliferative diabetic retinopathy" + }, + { + "code": "362.06", + "display": "Severe nonproliferative diabetic retinopathy" + }, + { + "code": "362.07", + "display": "Diabetic macular edema" + }, + { + "code": "366.41", + "display": "Diabetic cataract" + }, + { + "code": "648", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, unspecified as to episode of care or not applicable" + }, + { + "code": "648.01", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, delivered, with or without mention of antepartum condition" + }, + { + "code": "648.02", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, delivered, with mention of postpartum complication" + }, + { + "code": "648.03", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, antepartum condition or complication" + }, + { + "code": "648.04", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, postpartum condition or complication" + }, + { + "code": "250", + "display": "Diabetes mellitus without mention of complication, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.01", + "display": "Diabetes mellitus without mention of complication, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.02", + "display": "Diabetes mellitus without mention of complication, type II or unspecified type, uncontrolled" + }, + { + "code": "250.03", + "display": "Diabetes mellitus without mention of complication, type I [juvenile type], uncontrolled" + }, + { + "code": "250.1", + "display": "Diabetes with ketoacidosis, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.11", + "display": "Diabetes with ketoacidosis, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.12", + "display": "Diabetes with ketoacidosis, type II or unspecified type, uncontrolled" + }, + { + "code": "250.13", + "display": "Diabetes with ketoacidosis, type I [juvenile type], uncontrolled" + }, + { + "code": "250.2", + "display": "Diabetes with hyperosmolarity, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.21", + "display": "Diabetes with hyperosmolarity, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.22", + "display": "Diabetes with hyperosmolarity, type II or unspecified type, uncontrolled" + }, + { + "code": "250.23", + "display": "Diabetes with hyperosmolarity, type I [juvenile type], uncontrolled" + }, + { + "code": "250.3", + "display": "Diabetes with other coma, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.31", + "display": "Diabetes with other coma, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.32", + "display": "Diabetes with other coma, type II or unspecified type, uncontrolled" + }, + { + "code": "250.33", + "display": "Diabetes with other coma, type I [juvenile type], uncontrolled" + }, + { + "code": "250.4", + "display": "Diabetes with renal manifestations, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.41", + "display": "Diabetes with renal manifestations, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.42", + "display": "Diabetes with renal manifestations, type II or unspecified type, uncontrolled" + }, + { + "code": "250.43", + "display": "Diabetes with renal manifestations, type I [juvenile type], uncontrolled" + }, + { + "code": "250.5", + "display": "Diabetes with ophthalmic manifestations, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.51", + "display": "Diabetes with ophthalmic manifestations, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.52", + "display": "Diabetes with ophthalmic manifestations, type II or unspecified type, uncontrolled" + }, + { + "code": "250.53", + "display": "Diabetes with ophthalmic manifestations, type I [juvenile type], uncontrolled" + }, + { + "code": "250.6", + "display": "Diabetes with neurological manifestations, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.61", + "display": "Diabetes with neurological manifestations, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.62", + "display": "Diabetes with neurological manifestations, type II or unspecified type, uncontrolled" + }, + { + "code": "250.63", + "display": "Diabetes with neurological manifestations, type I [juvenile type], uncontrolled" + }, + { + "code": "250.7", + "display": "Diabetes with peripheral circulatory disorders, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.71", + "display": "Diabetes with peripheral circulatory disorders, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.72", + "display": "Diabetes with peripheral circulatory disorders, type II or unspecified type, uncontrolled" + }, + { + "code": "250.73", + "display": "Diabetes with peripheral circulatory disorders, type I [juvenile type], uncontrolled" + }, + { + "code": "250.8", + "display": "Diabetes with other specified manifestations, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.81", + "display": "Diabetes with other specified manifestations, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.82", + "display": "Diabetes with other specified manifestations, type II or unspecified type, uncontrolled" + }, + { + "code": "250.83", + "display": "Diabetes with other specified manifestations, type I [juvenile type], uncontrolled" + }, + { + "code": "250.9", + "display": "Diabetes with unspecified complication, type II or unspecified type, not stated as uncontrolled" + }, + { + "code": "250.91", + "display": "Diabetes with unspecified complication, type I [juvenile type], not stated as uncontrolled" + }, + { + "code": "250.92", + "display": "Diabetes with unspecified complication, type II or unspecified type, uncontrolled" + }, + { + "code": "250.93", + "display": "Diabetes with unspecified complication, type I [juvenile type], uncontrolled" + }, + { + "code": "357.2", + "display": "Polyneuropathy in diabetes" + }, + { + "code": "362.01", + "display": "Background diabetic retinopathy" + }, + { + "code": "362.02", + "display": "Proliferative diabetic retinopathy" + }, + { + "code": "362.03", + "display": "Nonproliferative diabetic retinopathy NOS" + }, + { + "code": "362.04", + "display": "Mild nonproliferative diabetic retinopathy" + }, + { + "code": "362.05", + "display": "Moderate nonproliferative diabetic retinopathy" + }, + { + "code": "362.06", + "display": "Severe nonproliferative diabetic retinopathy" + }, + { + "code": "362.07", + "display": "Diabetic macular edema" + }, + { + "code": "366.41", + "display": "Diabetic cataract" + }, + { + "code": "648", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, unspecified as to episode of care or not applicable" + }, + { + "code": "648.01", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, delivered, with or without mention of antepartum condition" + }, + { + "code": "648.02", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, delivered, with mention of postpartum complication" + }, + { + "code": "648.03", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, antepartum condition or complication" + }, + { + "code": "648.04", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, postpartum condition or complication" + } + ] +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.90.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.90.json new file mode 100644 index 00000000000..8e63a3ccf54 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.90.json @@ -0,0 +1,1179 @@ +{ + "resourceType": "CodeSystem", + "id": "2.16.840.1.113883.6.90", + "url": "http://hl7.org/fhir/sid/icd-10-cm", + "version": "2017", + "status": "draft", + "content": "example", + "concept": [ + { + "code": "E10.8", + "display": "Type 1 diabetes mellitus with unspecified complications" + }, + { + "code": "E10.9", + "display": "Type 1 diabetes mellitus without complications" + }, + { + "code": "E10.10", + "display": "Type 1 diabetes mellitus with ketoacidosis without coma" + }, + { + "code": "E10.11", + "display": "Type 1 diabetes mellitus with ketoacidosis with coma" + }, + { + "code": "E10.21", + "display": "Type 1 diabetes mellitus with diabetic nephropathy" + }, + { + "code": "E10.22", + "display": "Type 1 diabetes mellitus with diabetic chronic kidney disease" + }, + { + "code": "E10.29", + "display": "Type 1 diabetes mellitus with other diabetic kidney complication" + }, + { + "code": "E10.36", + "display": "Type 1 diabetes mellitus with diabetic cataract" + }, + { + "code": "E10.39", + "display": "Type 1 diabetes mellitus with other diabetic ophthalmic complication" + }, + { + "code": "E10.40", + "display": "Type 1 diabetes mellitus with diabetic neuropathy, unspecified" + }, + { + "code": "E10.41", + "display": "Type 1 diabetes mellitus with diabetic mononeuropathy" + }, + { + "code": "E10.42", + "display": "Type 1 diabetes mellitus with diabetic polyneuropathy" + }, + { + "code": "E10.43", + "display": "Type 1 diabetes mellitus with diabetic autonomic (poly)neuropathy" + }, + { + "code": "E10.44", + "display": "Type 1 diabetes mellitus with diabetic amyotrophy" + }, + { + "code": "E10.49", + "display": "Type 1 diabetes mellitus with other diabetic neurological complication" + }, + { + "code": "E10.51", + "display": "Type 1 diabetes mellitus with diabetic peripheral angiopathy without gangrene" + }, + { + "code": "E10.52", + "display": "Type 1 diabetes mellitus with diabetic peripheral angiopathy with gangrene" + }, + { + "code": "E10.59", + "display": "Type 1 diabetes mellitus with other circulatory complications" + }, + { + "code": "E10.65", + "display": "Type 1 diabetes mellitus with hyperglycemia" + }, + { + "code": "E10.69", + "display": "Type 1 diabetes mellitus with other specified complication" + }, + { + "code": "E10.311", + "display": "Type 1 diabetes mellitus with unspecified diabetic retinopathy with macular edema" + }, + { + "code": "E10.319", + "display": "Type 1 diabetes mellitus with unspecified diabetic retinopathy without macular edema" + }, + { + "code": "E10.321", + "display": "Type 1 diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E10.329", + "display": "Type 1 diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E10.331", + "display": "Type 1 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E10.339", + "display": "Type 1 diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E10.341", + "display": "Type 1 diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E10.349", + "display": "Type 1 diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E10.351", + "display": "Type 1 diabetes mellitus with proliferative diabetic retinopathy with macular edema" + }, + { + "code": "E10.359", + "display": "Type 1 diabetes mellitus with proliferative diabetic retinopathy without macular edema" + }, + { + "code": "E10.610", + "display": "Type 1 diabetes mellitus with diabetic neuropathic arthropathy" + }, + { + "code": "E10.618", + "display": "Type 1 diabetes mellitus with other diabetic arthropathy" + }, + { + "code": "E10.620", + "display": "Type 1 diabetes mellitus with diabetic dermatitis" + }, + { + "code": "E10.621", + "display": "Type 1 diabetes mellitus with foot ulcer" + }, + { + "code": "E10.622", + "display": "Type 1 diabetes mellitus with other skin ulcer" + }, + { + "code": "E10.628", + "display": "Type 1 diabetes mellitus with other skin complications" + }, + { + "code": "E10.630", + "display": "Type 1 diabetes mellitus with periodontal disease" + }, + { + "code": "E10.638", + "display": "Type 1 diabetes mellitus with other oral complications" + }, + { + "code": "E10.641", + "display": "Type 1 diabetes mellitus with hypoglycemia with coma" + }, + { + "code": "E10.649", + "display": "Type 1 diabetes mellitus with hypoglycemia without coma" + }, + { + "code": "E11.00", + "display": "Type 2 diabetes mellitus with hyperosmolarity without nonketotic hyperglycemic-hyperosmolar coma (NKHHC)" + }, + { + "code": "E11.01", + "display": "Type 2 diabetes mellitus with hyperosmolarity with coma" + }, + { + "code": "E11.8", + "display": "Type 2 diabetes mellitus with unspecified complications" + }, + { + "code": "E11.9", + "display": "Type 2 diabetes mellitus without complications" + }, + { + "code": "E11.21", + "display": "Type 2 diabetes mellitus with diabetic nephropathy" + }, + { + "code": "E11.22", + "display": "Type 2 diabetes mellitus with diabetic chronic kidney disease" + }, + { + "code": "E11.29", + "display": "Type 2 diabetes mellitus with other diabetic kidney complication" + }, + { + "code": "E11.36", + "display": "Type 2 diabetes mellitus with diabetic cataract" + }, + { + "code": "E11.39", + "display": "Type 2 diabetes mellitus with other diabetic ophthalmic complication" + }, + { + "code": "E11.40", + "display": "Type 2 diabetes mellitus with diabetic neuropathy, unspecified" + }, + { + "code": "E11.41", + "display": "Type 2 diabetes mellitus with diabetic mononeuropathy" + }, + { + "code": "E11.42", + "display": "Type 2 diabetes mellitus with diabetic polyneuropathy" + }, + { + "code": "E11.43", + "display": "Type 2 diabetes mellitus with diabetic autonomic (poly)neuropathy" + }, + { + "code": "E11.44", + "display": "Type 2 diabetes mellitus with diabetic amyotrophy" + }, + { + "code": "E11.49", + "display": "Type 2 diabetes mellitus with other diabetic neurological complication" + }, + { + "code": "E11.51", + "display": "Type 2 diabetes mellitus with diabetic peripheral angiopathy without gangrene" + }, + { + "code": "E11.52", + "display": "Type 2 diabetes mellitus with diabetic peripheral angiopathy with gangrene" + }, + { + "code": "E11.59", + "display": "Type 2 diabetes mellitus with other circulatory complications" + }, + { + "code": "E11.65", + "display": "Type 2 diabetes mellitus with hyperglycemia" + }, + { + "code": "E11.69", + "display": "Type 2 diabetes mellitus with other specified complication" + }, + { + "code": "E11.311", + "display": "Type 2 diabetes mellitus with unspecified diabetic retinopathy with macular edema" + }, + { + "code": "E11.319", + "display": "Type 2 diabetes mellitus with unspecified diabetic retinopathy without macular edema" + }, + { + "code": "E11.321", + "display": "Type 2 diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E11.329", + "display": "Type 2 diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E11.331", + "display": "Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E11.339", + "display": "Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E11.341", + "display": "Type 2 diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E11.349", + "display": "Type 2 diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E11.351", + "display": "Type 2 diabetes mellitus with proliferative diabetic retinopathy with macular edema" + }, + { + "code": "E11.359", + "display": "Type 2 diabetes mellitus with proliferative diabetic retinopathy without macular edema" + }, + { + "code": "E11.610", + "display": "Type 2 diabetes mellitus with diabetic neuropathic arthropathy" + }, + { + "code": "E11.618", + "display": "Type 2 diabetes mellitus with other diabetic arthropathy" + }, + { + "code": "E11.620", + "display": "Type 2 diabetes mellitus with diabetic dermatitis" + }, + { + "code": "E11.621", + "display": "Type 2 diabetes mellitus with foot ulcer" + }, + { + "code": "E11.622", + "display": "Type 2 diabetes mellitus with other skin ulcer" + }, + { + "code": "E11.628", + "display": "Type 2 diabetes mellitus with other skin complications" + }, + { + "code": "E11.630", + "display": "Type 2 diabetes mellitus with periodontal disease" + }, + { + "code": "E11.638", + "display": "Type 2 diabetes mellitus with other oral complications" + }, + { + "code": "E11.641", + "display": "Type 2 diabetes mellitus with hypoglycemia with coma" + }, + { + "code": "E11.649", + "display": "Type 2 diabetes mellitus with hypoglycemia without coma" + }, + { + "code": "E13.00", + "display": "Other specified diabetes mellitus with hyperosmolarity without nonketotic hyperglycemic-hyperosmolar coma (NKHHC)" + }, + { + "code": "E13.01", + "display": "Other specified diabetes mellitus with hyperosmolarity with coma" + }, + { + "code": "E13.8", + "display": "Other specified diabetes mellitus with unspecified complications" + }, + { + "code": "E13.9", + "display": "Other specified diabetes mellitus without complications" + }, + { + "code": "E13.10", + "display": "Other specified diabetes mellitus with ketoacidosis without coma" + }, + { + "code": "E13.11", + "display": "Other specified diabetes mellitus with ketoacidosis with coma" + }, + { + "code": "E13.21", + "display": "Other specified diabetes mellitus with diabetic nephropathy" + }, + { + "code": "E13.22", + "display": "Other specified diabetes mellitus with diabetic chronic kidney disease" + }, + { + "code": "E13.29", + "display": "Other specified diabetes mellitus with other diabetic kidney complication" + }, + { + "code": "E13.36", + "display": "Other specified diabetes mellitus with diabetic cataract" + }, + { + "code": "E13.39", + "display": "Other specified diabetes mellitus with other diabetic ophthalmic complication" + }, + { + "code": "E13.40", + "display": "Other specified diabetes mellitus with diabetic neuropathy, unspecified" + }, + { + "code": "E13.41", + "display": "Other specified diabetes mellitus with diabetic mononeuropathy" + }, + { + "code": "E13.42", + "display": "Other specified diabetes mellitus with diabetic polyneuropathy" + }, + { + "code": "E13.43", + "display": "Other specified diabetes mellitus with diabetic autonomic (poly)neuropathy" + }, + { + "code": "E13.44", + "display": "Other specified diabetes mellitus with diabetic amyotrophy" + }, + { + "code": "E13.49", + "display": "Other specified diabetes mellitus with other diabetic neurological complication" + }, + { + "code": "E13.51", + "display": "Other specified diabetes mellitus with diabetic peripheral angiopathy without gangrene" + }, + { + "code": "E13.52", + "display": "Other specified diabetes mellitus with diabetic peripheral angiopathy with gangrene" + }, + { + "code": "E13.59", + "display": "Other specified diabetes mellitus with other circulatory complications" + }, + { + "code": "E13.65", + "display": "Other specified diabetes mellitus with hyperglycemia" + }, + { + "code": "E13.69", + "display": "Other specified diabetes mellitus with other specified complication" + }, + { + "code": "E13.311", + "display": "Other specified diabetes mellitus with unspecified diabetic retinopathy with macular edema" + }, + { + "code": "E13.319", + "display": "Other specified diabetes mellitus with unspecified diabetic retinopathy without macular edema" + }, + { + "code": "E13.321", + "display": "Other specified diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E13.329", + "display": "Other specified diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E13.331", + "display": "Other specified diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E13.339", + "display": "Other specified diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E13.341", + "display": "Other specified diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E13.349", + "display": "Other specified diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E13.351", + "display": "Other specified diabetes mellitus with proliferative diabetic retinopathy with macular edema" + }, + { + "code": "E13.359", + "display": "Other specified diabetes mellitus with proliferative diabetic retinopathy without macular edema" + }, + { + "code": "E13.610", + "display": "Other specified diabetes mellitus with diabetic neuropathic arthropathy" + }, + { + "code": "E13.618", + "display": "Other specified diabetes mellitus with other diabetic arthropathy" + }, + { + "code": "E13.620", + "display": "Other specified diabetes mellitus with diabetic dermatitis" + }, + { + "code": "E13.621", + "display": "Other specified diabetes mellitus with foot ulcer" + }, + { + "code": "E13.622", + "display": "Other specified diabetes mellitus with other skin ulcer" + }, + { + "code": "E13.628", + "display": "Other specified diabetes mellitus with other skin complications" + }, + { + "code": "E13.630", + "display": "Other specified diabetes mellitus with periodontal disease" + }, + { + "code": "E13.638", + "display": "Other specified diabetes mellitus with other oral complications" + }, + { + "code": "E13.641", + "display": "Other specified diabetes mellitus with hypoglycemia with coma" + }, + { + "code": "E13.649", + "display": "Other specified diabetes mellitus with hypoglycemia without coma" + }, + { + "code": "O24.019", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, unspecified trimester" + }, + { + "code": "O24.02", + "display": "Pre-existing type 1 diabetes mellitus, in childbirth" + }, + { + "code": "O24.03", + "display": "Pre-existing type 1 diabetes mellitus, in the puerperium" + }, + { + "code": "O24.011", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, first trimester" + }, + { + "code": "O24.012", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, second trimester" + }, + { + "code": "O24.013", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, third trimester" + }, + { + "code": "O24.12", + "display": "Pre-existing type 2 diabetes mellitus, in childbirth" + }, + { + "code": "O24.13", + "display": "Pre-existing type 2 diabetes mellitus, in the puerperium" + }, + { + "code": "O24.32", + "display": "Unspecified pre-existing diabetes mellitus in childbirth" + }, + { + "code": "O24.33", + "display": "Unspecified pre-existing diabetes mellitus in the puerperium" + }, + { + "code": "O24.82", + "display": "Other pre-existing diabetes mellitus in childbirth" + }, + { + "code": "O24.83", + "display": "Other pre-existing diabetes mellitus in the puerperium" + }, + { + "code": "O24.111", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, first trimester" + }, + { + "code": "O24.112", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, second trimester" + }, + { + "code": "O24.113", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, third trimester" + }, + { + "code": "O24.119", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, unspecified trimester" + }, + { + "code": "O24.311", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, first trimester" + }, + { + "code": "O24.312", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, second trimester" + }, + { + "code": "O24.313", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, third trimester" + }, + { + "code": "O24.319", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, unspecified trimester" + }, + { + "code": "O24.811", + "display": "Other pre-existing diabetes mellitus in pregnancy, first trimester" + }, + { + "code": "O24.812", + "display": "Other pre-existing diabetes mellitus in pregnancy, second trimester" + }, + { + "code": "O24.813", + "display": "Other pre-existing diabetes mellitus in pregnancy, third trimester" + }, + { + "code": "O24.819", + "display": "Other pre-existing diabetes mellitus in pregnancy, unspecified trimester" + }, + { + "code": "E10.8", + "display": "Type 1 diabetes mellitus with unspecified complications" + }, + { + "code": "E10.9", + "display": "Type 1 diabetes mellitus without complications" + }, + { + "code": "E10.10", + "display": "Type 1 diabetes mellitus with ketoacidosis without coma" + }, + { + "code": "E10.11", + "display": "Type 1 diabetes mellitus with ketoacidosis with coma" + }, + { + "code": "E10.21", + "display": "Type 1 diabetes mellitus with diabetic nephropathy" + }, + { + "code": "E10.22", + "display": "Type 1 diabetes mellitus with diabetic chronic kidney disease" + }, + { + "code": "E10.29", + "display": "Type 1 diabetes mellitus with other diabetic kidney complication" + }, + { + "code": "E10.36", + "display": "Type 1 diabetes mellitus with diabetic cataract" + }, + { + "code": "E10.39", + "display": "Type 1 diabetes mellitus with other diabetic ophthalmic complication" + }, + { + "code": "E10.40", + "display": "Type 1 diabetes mellitus with diabetic neuropathy, unspecified" + }, + { + "code": "E10.41", + "display": "Type 1 diabetes mellitus with diabetic mononeuropathy" + }, + { + "code": "E10.42", + "display": "Type 1 diabetes mellitus with diabetic polyneuropathy" + }, + { + "code": "E10.43", + "display": "Type 1 diabetes mellitus with diabetic autonomic (poly)neuropathy" + }, + { + "code": "E10.44", + "display": "Type 1 diabetes mellitus with diabetic amyotrophy" + }, + { + "code": "E10.49", + "display": "Type 1 diabetes mellitus with other diabetic neurological complication" + }, + { + "code": "E10.51", + "display": "Type 1 diabetes mellitus with diabetic peripheral angiopathy without gangrene" + }, + { + "code": "E10.52", + "display": "Type 1 diabetes mellitus with diabetic peripheral angiopathy with gangrene" + }, + { + "code": "E10.59", + "display": "Type 1 diabetes mellitus with other circulatory complications" + }, + { + "code": "E10.65", + "display": "Type 1 diabetes mellitus with hyperglycemia" + }, + { + "code": "E10.69", + "display": "Type 1 diabetes mellitus with other specified complication" + }, + { + "code": "E10.311", + "display": "Type 1 diabetes mellitus with unspecified diabetic retinopathy with macular edema" + }, + { + "code": "E10.319", + "display": "Type 1 diabetes mellitus with unspecified diabetic retinopathy without macular edema" + }, + { + "code": "E10.321", + "display": "Type 1 diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E10.329", + "display": "Type 1 diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E10.331", + "display": "Type 1 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E10.339", + "display": "Type 1 diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E10.341", + "display": "Type 1 diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E10.349", + "display": "Type 1 diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E10.351", + "display": "Type 1 diabetes mellitus with proliferative diabetic retinopathy with macular edema" + }, + { + "code": "E10.359", + "display": "Type 1 diabetes mellitus with proliferative diabetic retinopathy without macular edema" + }, + { + "code": "E10.610", + "display": "Type 1 diabetes mellitus with diabetic neuropathic arthropathy" + }, + { + "code": "E10.618", + "display": "Type 1 diabetes mellitus with other diabetic arthropathy" + }, + { + "code": "E10.620", + "display": "Type 1 diabetes mellitus with diabetic dermatitis" + }, + { + "code": "E10.621", + "display": "Type 1 diabetes mellitus with foot ulcer" + }, + { + "code": "E10.622", + "display": "Type 1 diabetes mellitus with other skin ulcer" + }, + { + "code": "E10.628", + "display": "Type 1 diabetes mellitus with other skin complications" + }, + { + "code": "E10.630", + "display": "Type 1 diabetes mellitus with periodontal disease" + }, + { + "code": "E10.638", + "display": "Type 1 diabetes mellitus with other oral complications" + }, + { + "code": "E10.641", + "display": "Type 1 diabetes mellitus with hypoglycemia with coma" + }, + { + "code": "E10.649", + "display": "Type 1 diabetes mellitus with hypoglycemia without coma" + }, + { + "code": "E11.00", + "display": "Type 2 diabetes mellitus with hyperosmolarity without nonketotic hyperglycemic-hyperosmolar coma (NKHHC)" + }, + { + "code": "E11.01", + "display": "Type 2 diabetes mellitus with hyperosmolarity with coma" + }, + { + "code": "E11.8", + "display": "Type 2 diabetes mellitus with unspecified complications" + }, + { + "code": "E11.9", + "display": "Type 2 diabetes mellitus without complications" + }, + { + "code": "E11.21", + "display": "Type 2 diabetes mellitus with diabetic nephropathy" + }, + { + "code": "E11.22", + "display": "Type 2 diabetes mellitus with diabetic chronic kidney disease" + }, + { + "code": "E11.29", + "display": "Type 2 diabetes mellitus with other diabetic kidney complication" + }, + { + "code": "E11.36", + "display": "Type 2 diabetes mellitus with diabetic cataract" + }, + { + "code": "E11.39", + "display": "Type 2 diabetes mellitus with other diabetic ophthalmic complication" + }, + { + "code": "E11.40", + "display": "Type 2 diabetes mellitus with diabetic neuropathy, unspecified" + }, + { + "code": "E11.41", + "display": "Type 2 diabetes mellitus with diabetic mononeuropathy" + }, + { + "code": "E11.42", + "display": "Type 2 diabetes mellitus with diabetic polyneuropathy" + }, + { + "code": "E11.43", + "display": "Type 2 diabetes mellitus with diabetic autonomic (poly)neuropathy" + }, + { + "code": "E11.44", + "display": "Type 2 diabetes mellitus with diabetic amyotrophy" + }, + { + "code": "E11.49", + "display": "Type 2 diabetes mellitus with other diabetic neurological complication" + }, + { + "code": "E11.51", + "display": "Type 2 diabetes mellitus with diabetic peripheral angiopathy without gangrene" + }, + { + "code": "E11.52", + "display": "Type 2 diabetes mellitus with diabetic peripheral angiopathy with gangrene" + }, + { + "code": "E11.59", + "display": "Type 2 diabetes mellitus with other circulatory complications" + }, + { + "code": "E11.65", + "display": "Type 2 diabetes mellitus with hyperglycemia" + }, + { + "code": "E11.69", + "display": "Type 2 diabetes mellitus with other specified complication" + }, + { + "code": "E11.311", + "display": "Type 2 diabetes mellitus with unspecified diabetic retinopathy with macular edema" + }, + { + "code": "E11.319", + "display": "Type 2 diabetes mellitus with unspecified diabetic retinopathy without macular edema" + }, + { + "code": "E11.321", + "display": "Type 2 diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E11.329", + "display": "Type 2 diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E11.331", + "display": "Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E11.339", + "display": "Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E11.341", + "display": "Type 2 diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E11.349", + "display": "Type 2 diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E11.351", + "display": "Type 2 diabetes mellitus with proliferative diabetic retinopathy with macular edema" + }, + { + "code": "E11.359", + "display": "Type 2 diabetes mellitus with proliferative diabetic retinopathy without macular edema" + }, + { + "code": "E11.610", + "display": "Type 2 diabetes mellitus with diabetic neuropathic arthropathy" + }, + { + "code": "E11.618", + "display": "Type 2 diabetes mellitus with other diabetic arthropathy" + }, + { + "code": "E11.620", + "display": "Type 2 diabetes mellitus with diabetic dermatitis" + }, + { + "code": "E11.621", + "display": "Type 2 diabetes mellitus with foot ulcer" + }, + { + "code": "E11.622", + "display": "Type 2 diabetes mellitus with other skin ulcer" + }, + { + "code": "E11.628", + "display": "Type 2 diabetes mellitus with other skin complications" + }, + { + "code": "E11.630", + "display": "Type 2 diabetes mellitus with periodontal disease" + }, + { + "code": "E11.638", + "display": "Type 2 diabetes mellitus with other oral complications" + }, + { + "code": "E11.641", + "display": "Type 2 diabetes mellitus with hypoglycemia with coma" + }, + { + "code": "E11.649", + "display": "Type 2 diabetes mellitus with hypoglycemia without coma" + }, + { + "code": "E13.00", + "display": "Other specified diabetes mellitus with hyperosmolarity without nonketotic hyperglycemic-hyperosmolar coma (NKHHC)" + }, + { + "code": "E13.01", + "display": "Other specified diabetes mellitus with hyperosmolarity with coma" + }, + { + "code": "E13.8", + "display": "Other specified diabetes mellitus with unspecified complications" + }, + { + "code": "E13.9", + "display": "Other specified diabetes mellitus without complications" + }, + { + "code": "E13.10", + "display": "Other specified diabetes mellitus with ketoacidosis without coma" + }, + { + "code": "E13.11", + "display": "Other specified diabetes mellitus with ketoacidosis with coma" + }, + { + "code": "E13.21", + "display": "Other specified diabetes mellitus with diabetic nephropathy" + }, + { + "code": "E13.22", + "display": "Other specified diabetes mellitus with diabetic chronic kidney disease" + }, + { + "code": "E13.29", + "display": "Other specified diabetes mellitus with other diabetic kidney complication" + }, + { + "code": "E13.36", + "display": "Other specified diabetes mellitus with diabetic cataract" + }, + { + "code": "E13.39", + "display": "Other specified diabetes mellitus with other diabetic ophthalmic complication" + }, + { + "code": "E13.40", + "display": "Other specified diabetes mellitus with diabetic neuropathy, unspecified" + }, + { + "code": "E13.41", + "display": "Other specified diabetes mellitus with diabetic mononeuropathy" + }, + { + "code": "E13.42", + "display": "Other specified diabetes mellitus with diabetic polyneuropathy" + }, + { + "code": "E13.43", + "display": "Other specified diabetes mellitus with diabetic autonomic (poly)neuropathy" + }, + { + "code": "E13.44", + "display": "Other specified diabetes mellitus with diabetic amyotrophy" + }, + { + "code": "E13.49", + "display": "Other specified diabetes mellitus with other diabetic neurological complication" + }, + { + "code": "E13.51", + "display": "Other specified diabetes mellitus with diabetic peripheral angiopathy without gangrene" + }, + { + "code": "E13.52", + "display": "Other specified diabetes mellitus with diabetic peripheral angiopathy with gangrene" + }, + { + "code": "E13.59", + "display": "Other specified diabetes mellitus with other circulatory complications" + }, + { + "code": "E13.65", + "display": "Other specified diabetes mellitus with hyperglycemia" + }, + { + "code": "E13.69", + "display": "Other specified diabetes mellitus with other specified complication" + }, + { + "code": "E13.311", + "display": "Other specified diabetes mellitus with unspecified diabetic retinopathy with macular edema" + }, + { + "code": "E13.319", + "display": "Other specified diabetes mellitus with unspecified diabetic retinopathy without macular edema" + }, + { + "code": "E13.321", + "display": "Other specified diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E13.329", + "display": "Other specified diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E13.331", + "display": "Other specified diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E13.339", + "display": "Other specified diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E13.341", + "display": "Other specified diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + }, + { + "code": "E13.349", + "display": "Other specified diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + }, + { + "code": "E13.351", + "display": "Other specified diabetes mellitus with proliferative diabetic retinopathy with macular edema" + }, + { + "code": "E13.359", + "display": "Other specified diabetes mellitus with proliferative diabetic retinopathy without macular edema" + }, + { + "code": "E13.610", + "display": "Other specified diabetes mellitus with diabetic neuropathic arthropathy" + }, + { + "code": "E13.618", + "display": "Other specified diabetes mellitus with other diabetic arthropathy" + }, + { + "code": "E13.620", + "display": "Other specified diabetes mellitus with diabetic dermatitis" + }, + { + "code": "E13.621", + "display": "Other specified diabetes mellitus with foot ulcer" + }, + { + "code": "E13.622", + "display": "Other specified diabetes mellitus with other skin ulcer" + }, + { + "code": "E13.628", + "display": "Other specified diabetes mellitus with other skin complications" + }, + { + "code": "E13.630", + "display": "Other specified diabetes mellitus with periodontal disease" + }, + { + "code": "E13.638", + "display": "Other specified diabetes mellitus with other oral complications" + }, + { + "code": "E13.641", + "display": "Other specified diabetes mellitus with hypoglycemia with coma" + }, + { + "code": "E13.649", + "display": "Other specified diabetes mellitus with hypoglycemia without coma" + }, + { + "code": "O24.019", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, unspecified trimester" + }, + { + "code": "O24.02", + "display": "Pre-existing type 1 diabetes mellitus, in childbirth" + }, + { + "code": "O24.03", + "display": "Pre-existing type 1 diabetes mellitus, in the puerperium" + }, + { + "code": "O24.011", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, first trimester" + }, + { + "code": "O24.012", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, second trimester" + }, + { + "code": "O24.013", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, third trimester" + }, + { + "code": "O24.12", + "display": "Pre-existing type 2 diabetes mellitus, in childbirth" + }, + { + "code": "O24.13", + "display": "Pre-existing type 2 diabetes mellitus, in the puerperium" + }, + { + "code": "O24.32", + "display": "Unspecified pre-existing diabetes mellitus in childbirth" + }, + { + "code": "O24.33", + "display": "Unspecified pre-existing diabetes mellitus in the puerperium" + }, + { + "code": "O24.82", + "display": "Other pre-existing diabetes mellitus in childbirth" + }, + { + "code": "O24.83", + "display": "Other pre-existing diabetes mellitus in the puerperium" + }, + { + "code": "O24.111", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, first trimester" + }, + { + "code": "O24.112", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, second trimester" + }, + { + "code": "O24.113", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, third trimester" + }, + { + "code": "O24.119", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, unspecified trimester" + }, + { + "code": "O24.311", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, first trimester" + }, + { + "code": "O24.312", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, second trimester" + }, + { + "code": "O24.313", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, third trimester" + }, + { + "code": "O24.319", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, unspecified trimester" + }, + { + "code": "O24.811", + "display": "Other pre-existing diabetes mellitus in pregnancy, first trimester" + }, + { + "code": "O24.812", + "display": "Other pre-existing diabetes mellitus in pregnancy, second trimester" + }, + { + "code": "O24.813", + "display": "Other pre-existing diabetes mellitus in pregnancy, third trimester" + }, + { + "code": "O24.819", + "display": "Other pre-existing diabetes mellitus in pregnancy, unspecified trimester" + } + ] +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.96.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.96.json new file mode 100644 index 00000000000..1ac22bca962 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/codesystems/2.16.840.1.113883.6.96.json @@ -0,0 +1,291 @@ +{ + "resourceType": "CodeSystem", + "id": "2.16.840.1.113883.6.96", + "url": "http://snomed.info/sct", + "version": "2016-09", + "status": "draft", + "content": "example", + "concept": [ + { + "code": "4783006", + "display": "Maternal diabetes mellitus with hypoglycemia affecting fetus OR newborn (disorder)" + }, + { + "code": "9859006", + "display": "Type 2 diabetes mellitus with acanthosis nigricans (disorder)" + }, + { + "code": "23045005", + "display": "Insulin dependent diabetes mellitus type IA (disorder)" + }, + { + "code": "28032008", + "display": "Insulin dependent diabetes mellitus type IB (disorder)" + }, + { + "code": "44054006", + "display": "Diabetes mellitus type 2 (disorder)" + }, + { + "code": "46635009", + "display": "Diabetes mellitus type 1 (disorder)" + }, + { + "code": "75682002", + "display": "Diabetes mellitus caused by insulin receptor antibodies (disorder)" + }, + { + "code": "76751001", + "display": "Diabetes mellitus in mother complicating pregnancy, childbirth AND/OR puerperium (disorder)" + }, + { + "code": "81531005", + "display": "Diabetes mellitus type 2 in obese (disorder)" + }, + { + "code": "190330002", + "display": "Type 1 diabetes mellitus with hyperosmolar coma (disorder)" + }, + { + "code": "190331003", + "display": "Type 2 diabetes mellitus with hyperosmolar coma (disorder)" + }, + { + "code": "190368000", + "display": "Type I diabetes mellitus with ulcer (disorder)" + }, + { + "code": "190369008", + "display": "Type I diabetes mellitus with gangrene (disorder)" + }, + { + "code": "190372001", + "display": "Type I diabetes mellitus maturity onset (disorder)" + }, + { + "code": "190389009", + "display": "Type II diabetes mellitus with ulcer (disorder)" + }, + { + "code": "190390000", + "display": "Type II diabetes mellitus with gangrene (disorder)" + }, + { + "code": "199223000", + "display": "Diabetes mellitus during pregnancy, childbirth and the puerperium (disorder)" + }, + { + "code": "199225007", + "display": "Diabetes mellitus during pregnancy - baby delivered (disorder)" + }, + { + "code": "199226008", + "display": "Diabetes mellitus in the puerperium - baby delivered during current episode of care (disorder)" + }, + { + "code": "199227004", + "display": "Diabetes mellitus during pregnancy - baby not yet delivered (disorder)" + }, + { + "code": "199228009", + "display": "Diabetes mellitus in the puerperium - baby delivered during previous episode of care (disorder)" + }, + { + "code": "199229001", + "display": "Pre-existing type 1 diabetes mellitus (disorder)" + }, + { + "code": "199230006", + "display": "Pre-existing type 2 diabetes mellitus (disorder)" + }, + { + "code": "237599002", + "display": "Insulin treated type 2 diabetes mellitus (disorder)" + }, + { + "code": "237618001", + "display": "Insulin-dependent diabetes mellitus secretory diarrhea syndrome (disorder)" + }, + { + "code": "237627000", + "display": "Pregnancy and type 2 diabetes mellitus (disorder)" + }, + { + "code": "313435000", + "display": "Type I diabetes mellitus without complication (disorder)" + }, + { + "code": "313436004", + "display": "Type II diabetes mellitus without complication (disorder)" + }, + { + "code": "314771006", + "display": "Type I diabetes mellitus with hypoglycemic coma (disorder)" + }, + { + "code": "314772004", + "display": "Type II diabetes mellitus with hypoglycemic coma (disorder)" + }, + { + "code": "314893005", + "display": "Type I diabetes mellitus with arthropathy (disorder)" + }, + { + "code": "314902007", + "display": "Type II diabetes mellitus with peripheral angiopathy (disorder)" + }, + { + "code": "314903002", + "display": "Type II diabetes mellitus with arthropathy (disorder)" + }, + { + "code": "314904008", + "display": "Type II diabetes mellitus with neuropathic arthropathy (disorder)" + }, + { + "code": "359642000", + "display": "Diabetes mellitus type 2 in nonobese (disorder)" + }, + { + "code": "4783006", + "display": "Maternal diabetes mellitus with hypoglycemia affecting fetus OR newborn (disorder)" + }, + { + "code": "9859006", + "display": "Type 2 diabetes mellitus with acanthosis nigricans (disorder)" + }, + { + "code": "23045005", + "display": "Insulin dependent diabetes mellitus type IA (disorder)" + }, + { + "code": "28032008", + "display": "Insulin dependent diabetes mellitus type IB (disorder)" + }, + { + "code": "44054006", + "display": "Diabetes mellitus type 2 (disorder)" + }, + { + "code": "46635009", + "display": "Diabetes mellitus type 1 (disorder)" + }, + { + "code": "75682002", + "display": "Diabetes mellitus caused by insulin receptor antibodies (disorder)" + }, + { + "code": "76751001", + "display": "Diabetes mellitus in mother complicating pregnancy, childbirth AND/OR puerperium (disorder)" + }, + { + "code": "81531005", + "display": "Diabetes mellitus type 2 in obese (disorder)" + }, + { + "code": "190330002", + "display": "Type 1 diabetes mellitus with hyperosmolar coma (disorder)" + }, + { + "code": "190331003", + "display": "Type 2 diabetes mellitus with hyperosmolar coma (disorder)" + }, + { + "code": "190368000", + "display": "Type I diabetes mellitus with ulcer (disorder)" + }, + { + "code": "190369008", + "display": "Type I diabetes mellitus with gangrene (disorder)" + }, + { + "code": "190372001", + "display": "Type I diabetes mellitus maturity onset (disorder)" + }, + { + "code": "190389009", + "display": "Type II diabetes mellitus with ulcer (disorder)" + }, + { + "code": "190390000", + "display": "Type II diabetes mellitus with gangrene (disorder)" + }, + { + "code": "199223000", + "display": "Diabetes mellitus during pregnancy, childbirth and the puerperium (disorder)" + }, + { + "code": "199225007", + "display": "Diabetes mellitus during pregnancy - baby delivered (disorder)" + }, + { + "code": "199226008", + "display": "Diabetes mellitus in the puerperium - baby delivered during current episode of care (disorder)" + }, + { + "code": "199227004", + "display": "Diabetes mellitus during pregnancy - baby not yet delivered (disorder)" + }, + { + "code": "199228009", + "display": "Diabetes mellitus in the puerperium - baby delivered during previous episode of care (disorder)" + }, + { + "code": "199229001", + "display": "Pre-existing type 1 diabetes mellitus (disorder)" + }, + { + "code": "199230006", + "display": "Pre-existing type 2 diabetes mellitus (disorder)" + }, + { + "code": "237599002", + "display": "Insulin treated type 2 diabetes mellitus (disorder)" + }, + { + "code": "237618001", + "display": "Insulin-dependent diabetes mellitus secretory diarrhea syndrome (disorder)" + }, + { + "code": "237627000", + "display": "Pregnancy and type 2 diabetes mellitus (disorder)" + }, + { + "code": "313435000", + "display": "Type I diabetes mellitus without complication (disorder)" + }, + { + "code": "313436004", + "display": "Type II diabetes mellitus without complication (disorder)" + }, + { + "code": "314771006", + "display": "Type I diabetes mellitus with hypoglycemic coma (disorder)" + }, + { + "code": "314772004", + "display": "Type II diabetes mellitus with hypoglycemic coma (disorder)" + }, + { + "code": "314893005", + "display": "Type I diabetes mellitus with arthropathy (disorder)" + }, + { + "code": "314902007", + "display": "Type II diabetes mellitus with peripheral angiopathy (disorder)" + }, + { + "code": "314903002", + "display": "Type II diabetes mellitus with arthropathy (disorder)" + }, + { + "code": "314904008", + "display": "Type II diabetes mellitus with neuropathic arthropathy (disorder)" + }, + { + "code": "359642000", + "display": "Diabetes mellitus type 2 in nonobese (disorder)" + } + ] +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/logback.xml b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/logback.xml new file mode 100644 index 00000000000..7f90fcf62d4 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + INFO + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%file:%line] %msg%n + + + + + + + + \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/md/load_resources.md b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/md/load_resources.md new file mode 100644 index 00000000000..614c2c31c44 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/md/load_resources.md @@ -0,0 +1,108 @@ +# Resource Loading + +## Methods + +### HTTP Client + +There are 2 different methods of uploading resources using an HTTP client. +1. PUT or POST a single resource + PUT method is used to create a new resource with a specified ID or update an existing resource. + + PUT [base]/baseDstu3/Practitioner/prac-123 + ``` + { + "resourceType": "Practitioner", + "id": "prac-123", + "identifier": [ + { + "system": "http://clinfhir.com/fhir/NamingSystem/practitioner", + "value": "z1z1kXlcn3bhaZRsg7izSA1PYZm1" + } + ], + "telecom": [ + { + "system": "email", + "value": "sruthi.v@collabnotes.com" + } + ] + } + ``` + Successful response + ``` + { + "resourceType": "OperationOutcome", + "issue": [ + { + "severity": "information", + "code": "informational", + "diagnostics": "Successfully created resource \"Practitioner/prac-123/_history/1\" in 32ms" + } + ] + } + ``` + If the request results in an error, the "severity" will be specified as "error" and a message will be given in the "diagnostics" value field + + POST method is used to create a new resource with a generated ID. + + POST [base]/baseDstu3/Practitioner + ``` + { + "resourceType": "Practitioner", + "identifier": [ + { + "system": "http://clinfhir.com/fhir/NamingSystem/practitioner", + "value": "z1z1kXlcn3bhaZRsg7izSA1PYZm1" + } + ], + "telecom": [ + { + "system": "email", + "value": "sruthi.v@collabnotes.com" + } + ] + } + ``` + The response will be the same as the PUT method. + +2. POST a transaction Bundle + + The [transaction](http://hl7.org/implement/standards/fhir/http.html#transaction) operation loads all the resources within a transaction Bundle. + + POST [base]/baseDstu3 + ``` + { + "resourceType": "Bundle", + "id": "example-transaction", + "type": "transaction", + "entry": [ + { + "resource": { + ... + }, + "request": { + "method": "PUT", + "url": "[base]/baseDstu3/Resource/ResourceID" + } + }, + ... + ] + } + ``` + The response will be a Bundle containing the status and location for each uploaded resource if successful or an OperationOutcome if there were errors. + ``` + { + "resourceType": "Bundle", + "id": "...", + "type": "transaction-response", + "entry": [ + { + "response": { + "status": "201 Created", + "location": "Resource/ResourceID/_history/1", + ... + }, + ... + } + ] + } + ``` \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/MedicationOrder.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/MedicationOrder.json new file mode 100644 index 00000000000..a6aa4f927ae --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/MedicationOrder.json @@ -0,0 +1,99 @@ +{ + "resourceType": "ActivityDefinition", + "id": "citalopramPrescription", + "contained": [ + { + "resourceType": "Medication", + "id": "citalopramMedication", + "code": { + "coding": [ + { + "system": "http://www.nlm.nih.gov/research/umls/rxnorm", + "code": "200371" + } + ], + "text": "citalopram" + }, + "form": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "385055001", + "display": "Tablet dose form" + } + ], + "text": "Tablet dose form" + }, + "ingredient": [ + { + "itemReference": { + "reference": "#citalopramSubstance" + }, + "amount": { + "numerator": { + "value": 20, + "unit": "mg" + }, + "denominator": { + "value": 1, + "unit": "{tbl}" + } + } + } + ] + }, + { + "resourceType": "Substance", + "id": "citalopramSubstance", + "code": { + "coding": [ + { + "system": "http://www.nlm.nih.gov/research/umls/rxnorm", + "code": "2556" + } + ], + "text": "citalopram" + } + } + ], + "status": "draft", + "category": "drug", + "productReference": { + "reference": "#citalopramMedication" + }, + "dosageInstruction": [ + { + "text": "1 tablet oral 1 time daily", + "timing": { + "repeat": { + "frequency": 1, + "period": 1, + "periodUnit": "d" + } + }, + "route": { + "coding": [ + { + "code": "26643006", + "display": "Oral route (qualifier value)" + } + ], + "text": "Oral route (qualifier value)" + }, + "doseQuantity": { + "value": 1, + "unit": "{tbl}" + } + } + ], + "dynamicValue": [ + { + "path": "dispenseRequest.numberOfRepeatsAllowed", + "expression": "3" + }, + { + "path": "dispenseRequest.quantity", + "expression": "30 '{tbl}'" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ReferralDefinition.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ReferralDefinition.json new file mode 100644 index 00000000000..1afb2cc83b6 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ReferralDefinition.json @@ -0,0 +1,31 @@ +{ + "resourceType": "ActivityDefinition", + "id": "example", + "status": "draft", + "description": "refer to primary care mental-health integrated care program for evaluation and treatment of mental health conditions now", + "category": "referral", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "306206005" + } + ], + "text": "Referral to service (procedure)" + }, + "timingTiming": { + "event": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "Now()" + } + ] + } + ] + }, + "participantType": [ + "practitioner" + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZIkaMedicationOrder.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZIkaMedicationOrder.json new file mode 100644 index 00000000000..350eb20c6e5 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZIkaMedicationOrder.json @@ -0,0 +1,33 @@ +{ + "resourceType": "ActivityDefinition", + "id": "serum-zika-dengue-virus-igm", + "url": "http://example.org/ActivityDefinition/serum-zika-dengue-virus-igm", + "status": "draft", + "description": "Order Serum Zika and Dengue Virus IgM", + "relatedArtifact": [ + { + "type": "documentation", + "display": "Explanation of diagnostic tests for Zika virus and which to use based on the patient’s clinical and exposure history.", + "url": "http://www.cdc.gov/zika/hc-providers/diagnostic.html" + } + ], + "category": "diagnostic", + "code": { + "text": "Serum Zika and Dengue Virus IgM" + }, + "timingTiming": { + "event": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "Now()" + } + ] + } + ] + }, + "participantType": [ + "practitioner" + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZikaPrevention.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZikaPrevention.json new file mode 100644 index 00000000000..c5aa3714f25 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZikaPrevention.json @@ -0,0 +1,38 @@ +{ + "resourceType": "ActivityDefinition", + "id": "provide-mosquito-prevention-advice", + "url": "http://example.org/ActivityDefinition/provide-mosquito-prevention-advice", + "status": "draft", + "description": "Provide mosquito prevention advice", + "relatedArtifact": [ + { + "type": "documentation", + "display": "Advice for patients about how to avoid Mosquito bites.", + "url": "http://www.cdc.gov/zika/prevention/index.html" + }, + { + "type": "documentation", + "display": "Advice for patients about which mosquito repellents are effective and safe to use in pregnancy. [DEET, IF3535 and Picardin are safe during]", + "url": "https://www.epa.gov/insect-repellents/find-insect-repellent-right-you" + } + ], + "category": "communication", + "code": { + "text": "Provide Mosquito Prevention Advice" + }, + "timingTiming": { + "event": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "Now()" + } + ] + } + ] + }, + "participantType": [ + "practitioner" + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZikaVirusExposure.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZikaVirusExposure.json new file mode 100644 index 00000000000..5b010ebe4d7 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/activitydefinition/ZikaVirusExposure.json @@ -0,0 +1,31 @@ +{ + "resourceType": "ActivityDefinition", + "id": "administer-zika-virus-exposure-assessment", + "url": "http://example.org/ActivityDefinition/administer-zika-virus-exposure-assessment", + "status": "draft", + "description": "Administer Zika Virus Exposure Assessment", + "category": "procedure", + "code": { + "coding": [ + { + "system": "http://example.org/questionnaires", + "code": "zika-virus-exposure-assessment" + } + ] + }, + "timingTiming": { + "event": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "Now()" + } + ] + } + ] + }, + "participantType": [ + "practitioner" + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/guidanceresponse/SimpleExample.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/guidanceresponse/SimpleExample.json new file mode 100644 index 00000000000..82d119359de --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/guidanceresponse/SimpleExample.json @@ -0,0 +1,8 @@ +{ + "resourceType": "GuidanceResponse", + "id": "example", + "module": { + "reference": "ServiceDefinition/example" + }, + "status": "success" +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/CMS146.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/CMS146.json new file mode 100644 index 00000000000..6b735fa6413 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/CMS146.json @@ -0,0 +1,161 @@ +{ + "resourceType": "Library", + "id": "library-cms146-example", + "identifier": [ + { + "use": "official", + "value": "CMS146" + } + ], + "version": "2.0.0", + "title": "Appropriate Testing for Children with Pharyngitis", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "status": "draft", + "date": "2015-07-22", + "description": "Logic for CMS 146: Appropriate Testing for Children with Pharyngitis", + "relatedArtifact": [ + { + "type": "depends-on", + "resource": { + "reference": "Library/library-quick-model-definition" + } + } + ], + "dataRequirement": [ + { + "type": "Condition", + "codeFilter": [ + { + "path": "code", + "valueSetString": "Other Female Reproductive Conditions" + } + ] + }, + { + "type": "Patient" + }, + { + "type": "Condition", + "codeFilter": [ + { + "path": "category", + "valueCode": [ + "diagnosis" + ] + }, + { + "path": "clinicalStatus", + "valueCode": [ + "confirmed" + ] + }, + { + "path": "code", + "valueSetString": "2.16.840.1.113883.3.464.1003.102.12.1011" + } + ] + }, + { + "type": "Condition", + "codeFilter": [ + { + "path": "category", + "valueCode": [ + "diagnosis" + ] + }, + { + "path": "clinicalStatus", + "valueCode": [ + "confirmed" + ] + }, + { + "path": "code", + "valueSetString": "2.16.840.1.113883.3.464.1003.102.12.1012" + } + ] + }, + { + "type": "Encounter", + "codeFilter": [ + { + "path": "status", + "valueCode": [ + "finished" + ] + }, + { + "path": "class", + "valueCode": [ + "ambulatory" + ] + }, + { + "path": "type", + "valueSetString": "2.16.840.1.113883.3.464.1003.101.12.1061" + } + ] + }, + { + "type": "DiagnosticReport", + "codeFilter": [ + { + "path": "diagnosis", + "valueSetString": "2.16.840.1.113883.3.464.1003.198.12.1012" + } + ] + }, + { + "type": "Medication", + "codeFilter": [ + { + "path": "code", + "valueSetString": "2.16.840.1.113883.3.464.1003.196.12.1001" + } + ] + }, + { + "type": "MedicationRequest", + "codeFilter": [ + { + "path": "status", + "valueCode": [ + "active" + ] + }, + { + "path": "medication.code", + "valueSetString": "2.16.840.1.113883.3.464.1003.196.12.1001" + } + ] + }, + { + "type": "MedicationStatement", + "codeFilter": [ + { + "path": "status", + "valueCode": [ + "completed" + ] + }, + { + "path": "medication.code", + "valueSetString": "2.16.840.1.113883.3.464.1003.196.12.1001" + } + ] + } + ], + "content": [ + { + "contentType": "text/cql", + "url": "http://cqlrepository.org/CMS146.cql" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ChlamydiaScreening.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ChlamydiaScreening.json new file mode 100644 index 00000000000..1032c8b0e5f --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ChlamydiaScreening.json @@ -0,0 +1,52 @@ +{ + "resourceType": "Library", + "id": "example", + "identifier": [ + { + "use": "official", + "value": "ChalmydiaScreening_Common" + } + ], + "version": "2.0.0", + "title": "Chlamydia Screening Common Library", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "status": "draft", + "date": "2015-07-22", + "description": "Common Logic for adherence to Chlamydia Screening guidelines", + "topic": [ + { + "text": "Chlamydia Screening" + } + ], + "relatedArtifact": [ + { + "type": "depends-on", + "resource": { + "reference": "Library/library-quick-model-definition" + } + } + ], + "dataRequirement": [ + { + "type": "Condition", + "codeFilter": [ + { + "path": "code", + "valueSetString": "Other Female Reproductive Conditions" + } + ] + } + ], + "content": [ + { + "contentType": "text/cql", + "url": "http://cqlrepository.org/ChlamydiaScreening_Common.cql" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ExclusiveBreastfeeding_CDS.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ExclusiveBreastfeeding_CDS.json new file mode 100644 index 00000000000..3bfda61b02f --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ExclusiveBreastfeeding_CDS.json @@ -0,0 +1,53 @@ +{ + "resourceType": "Library", + "id": "library-exclusive-breastfeeding-cds-logic", + "identifier": [ + { + "use": "official", + "value": "Exclusive_Breastfeeding_CDS_Logic" + } + ], + "version": "1.0.0", + "title": "Exclusive Breastfeeding CDS Logic", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "status": "active", + "experimental": true, + "date": "2016-03-08", + "description": "Decision support logic for improving outcomes for exclusive breastmilk feeding of newborns", + "topic": [ + { + "text": "Exclusive Breastfeeding" + } + ], + "relatedArtifact": [ + { + "type": "depends-on", + "resource": { + "reference": "Library/library-quick-model-definition" + } + } + ], + "dataRequirement": [ + { + "type": "Condition", + "codeFilter": [ + { + "path": "code", + "valueSetString": "Single Live Birth" + } + ] + } + ], + "content": [ + { + "contentType": "text/cql", + "url": "http://cqlrepository.org/CMS9v4_CDS.cql" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ExclusiveBreastfeeding_CQM.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ExclusiveBreastfeeding_CQM.json new file mode 100644 index 00000000000..12afc56f84c --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/ExclusiveBreastfeeding_CQM.json @@ -0,0 +1,53 @@ +{ + "resourceType": "Library", + "id": "library-exclusive-breastfeeding-cqm-logic", + "identifier": [ + { + "use": "official", + "value": "Exclusive_Breastfeeding_CQM_Logic" + } + ], + "version": "1.0.0", + "title": "Exclusive Breastfeeding CQM Logic", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "status": "active", + "experimental": true, + "date": "2016-03-08", + "description": "Quality measure logic for measuring outcomes for exclusive breastmilk feeding of newborns", + "topic": [ + { + "text": "Exclusive Breastfeeding" + } + ], + "relatedArtifact": [ + { + "type": "depends-on", + "resource": { + "reference": "Library/library-quick-model-definition" + } + } + ], + "dataRequirement": [ + { + "type": "Condition", + "codeFilter": [ + { + "path": "code", + "valueSetString": "Single Live Birth" + } + ] + } + ], + "content": [ + { + "contentType": "text/cql", + "url": "http://cqlrepository.org/CMS9v4_CQM.cql" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/FhirHelpers.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/FhirHelpers.json new file mode 100644 index 00000000000..bdef4d4518e --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/FhirHelpers.json @@ -0,0 +1,44 @@ +{ + "resourceType": "Library", + "id": "library-fhir-helpers", + "identifier": [ + { + "use": "official", + "value": "FHIRHelpers" + } + ], + "version": "1.8", + "title": "FHIR Helpers", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "status": "active", + "experimental": true, + "date": "2016-11-14", + "description": "FHIR Helpers", + "topic": [ + { + "text": "FHIR Helpers" + } + ], + "relatedArtifact": [ + { + "type": "depends-on", + "resource": { + "reference": "Library/fhir-model-definition" + } + } + ], + "content": [ + { + "contentType": "text/cql", + "data": "bGlicmFyeSBGSElSSGVscGVycyB2ZXJzaW9uICcxLjgnDQoNCnVzaW5nIEZISVIgdmVyc2lvbiAnMS44Jw0KDQpkZWZpbmUgZnVuY3Rpb24gVG9JbnRlcnZhbChwZXJpb2QgRkhJUi5QZXJpb2QpOg0KICAgIEludGVydmFsW3BlcmlvZC4ic3RhcnQiLnZhbHVlLCBwZXJpb2QuImVuZCIudmFsdWVdDQoNCmRlZmluZSBmdW5jdGlvbiBUb1F1YW50aXR5KHF1YW50aXR5IEZISVIuUXVhbnRpdHkpOg0KICAgIFN5c3RlbS5RdWFudGl0eSB7IHZhbHVlOiBxdWFudGl0eS52YWx1ZS52YWx1ZSwgdW5pdDogcXVhbnRpdHkudW5pdC52YWx1ZSB9DQoNCmRlZmluZSBmdW5jdGlvbiBUb0ludGVydmFsKHJhbmdlIEZISVIuUmFuZ2UpOg0KICAgIEludGVydmFsW1RvUXVhbnRpdHkocmFuZ2UubG93KSwgVG9RdWFudGl0eShyYW5nZS5oaWdoKV0NCg0KZGVmaW5lIGZ1bmN0aW9uIFRvQ29kZShjb2RpbmcgRkhJUi5Db2RpbmcpOg0KICAgIFN5c3RlbS5Db2RlIHsNCiAgICAgIGNvZGU6IGNvZGluZy5jb2RlLnZhbHVlLA0KICAgICAgc3lzdGVtOiBjb2Rpbmcuc3lzdGVtLnZhbHVlLA0KICAgICAgdmVyc2lvbjogY29kaW5nLnZlcnNpb24udmFsdWUsDQogICAgICBkaXNwbGF5OiBjb2RpbmcuZGlzcGxheS52YWx1ZQ0KICAgIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIFRvQ29uY2VwdChjb25jZXB0IEZISVIuQ29kZWFibGVDb25jZXB0KToNCiAgICBTeXN0ZW0uQ29uY2VwdCB7DQogICAgICAgIGNvZGVzOiBjb25jZXB0LmNvZGluZyBDIHJldHVybiBUb0NvZGUoQyksDQogICAgICAgIGRpc3BsYXk6IGNvbmNlcHQudGV4dC52YWx1ZQ0KICAgIH0NCg0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIudXVpZCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5QbGFuQWN0aW9uUHJlY2hlY2tCZWhhdmlvcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Qcm92ZW5hbmNlRW50aXR5Um9sZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Vbml0c09mVGltZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BZGRyZXNzVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BbGxlcmd5SW50b2xlcmFuY2VDYXRlZ29yeSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TcGVjaW1lblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZXN0ZnVsQ2FwYWJpbGl0eU1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRGV0ZWN0ZWRJc3N1ZVNldmVyaXR5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLklzc3VlU2V2ZXJpdHkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRGF0YUVsZW1lbnRTdHJpbmdlbmN5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlBsYW5BY3Rpb25Db25kaXRpb25LaW5kKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkVuY291bnRlclN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TdHJ1Y3R1cmVEZWZpbml0aW9uS2luZCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5QdWJsaWNhdGlvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db25zZW50RGF0YU1lYW5pbmcpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUXVlc3Rpb25uYWlyZVJlc3BvbnNlU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlNlYXJjaENvbXBhcmF0b3IpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWxsZXJneUludG9sZXJhbmNlVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Eb2N1bWVudFJlbGF0aW9uc2hpcFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWxsZXJneUludG9sZXJhbmNlQ2xpbmljYWxTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ2FyZVBsYW5BY3Rpdml0eVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BY3Rpb25MaXN0KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlBhcnRpY2lwYXRpb25TdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUGxhbkFjdGlvblNlbGVjdGlvbkJlaGF2aW9yKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb0RhdGVUaW1lKHZhbHVlIEZISVIuaW5zdGFudCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9EYXRlVGltZSh2YWx1ZSBGSElSLmRhdGVUaW1lKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb0RhdGVUaW1lKHZhbHVlIEZISVIuZGF0ZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Eb2N1bWVudE1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQXNzZXJ0aW9uT3BlcmF0b3JUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkRheXNPZldlZWspOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuSXNzdWVUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbnRlbnRUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN0cnVjdHVyZU1hcENvbnRleHRUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkZhbWlseUhpc3RvcnlTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVkaWNhdGlvblN0YXRlbWVudENhdGVnb3J5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb0ludGVnZXIodmFsdWUgRkhJUi5wb3NpdGl2ZUludCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db21tdW5pY2F0aW9uU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNsaW5pY2FsSW1wcmVzc2lvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Bc3NlcnRpb25SZXNwb25zZVR5cGVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk5hcnJhdGl2ZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZWZlcnJhbENhdGVnb3J5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk1lYXNtbnRQcmluY2lwbGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29uc2VudEV4Y2VwdFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuc3RyaW5nKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkVuZHBvaW50U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkd1aWRlUGFnZUtpbmQpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuR3VpZGVEZXBlbmRlbmN5VHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZXNvdXJjZVZlcnNpb25Qb2xpY3kpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVkaWNhdGlvblJlcXVlc3RTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk5hbWluZ1N5c3RlbUlkZW50aWZpZXJUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFjY291bnRTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUHJvY2VkdXJlUmVxdWVzdFByaW9yaXR5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk1lZGljYXRpb25EaXNwZW5zZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5JZGVudGlmaWVyVXNlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkRpZ2l0YWxNZWRpYVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVGVzdFJlcG9ydFBhcnRpY2lwYW50VHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5CaW5kaW5nU3RyZW5ndGgpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29uc2VudFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5QYXJ0aWNpcGFudFJlcXVpcmVkKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlhQYXRoVXNhZ2VUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN0cnVjdHVyZU1hcElucHV0TW9kZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5JbnN0YW5jZUF2YWlsYWJpbGl0eSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5pZCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5MaW5rYWdlVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZWZlcmVuY2VIYW5kbGluZ1BvbGljeSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5GaWx0ZXJPcGVyYXRvcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5OYW1pbmdTeXN0ZW1UeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlJlc2VhcmNoU3R1ZHlTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRXh0ZW5zaW9uQ29udGV4dCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BdWRpdEV2ZW50T3V0Y29tZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db25zdHJhaW50U2V2ZXJpdHkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRXZlbnRDYXBhYmlsaXR5TW9kZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5QbGFuQWN0aW9uUGFydGljaXBhbnRUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlByb2NlZHVyZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZXNlYXJjaFN1YmplY3RTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUGxhbkFjdGlvbkdyb3VwaW5nQmVoYXZpb3IpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29tcG9zaXRlTWVhc3VyZVNjb3JpbmcpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRGV2aWNlTWV0cmljQ2F0ZWdvcnkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUXVlc3Rpb25uYWlyZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TdHJ1Y3R1cmVNYXBUcmFuc2Zvcm0pOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUmVzcG9uc2VUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb0RlY2ltYWwodmFsdWUgRkhJUi5kZWNpbWFsKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFnZ3JlZ2F0aW9uTW9kZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5DYXBhYmlsaXR5U3RhdGVtZW50S2luZCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5zZXF1ZW5jZVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWxsZXJneUludG9sZXJhbmNlVmVyaWZpY2F0aW9uU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkV2ZW50VGltaW5nKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkdvYWxTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU2VhcmNoUGFyYW1UeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN5c3RlbVJlc3RmdWxJbnRlcmFjdGlvbik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TdHJ1Y3R1cmVNYXBNb2RlbE1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVGFza1N0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5NZWFzdXJlUG9wdWxhdGlvblR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU3Vic2NyaXB0aW9uQ2hhbm5lbFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUHJvY2VkdXJlUmVxdWVzdFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZWZlcnJhbFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Bc3NlcnRpb25EaXJlY3Rpb25UeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlNsaWNpbmdSdWxlcyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5FeHBsYW5hdGlvbk9mQmVuZWZpdFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5MaW5rVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BbGxlcmd5SW50b2xlcmFuY2VDcml0aWNhbGl0eSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db25jZXB0TWFwRXF1aXZhbGVuY2UpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUHJvcGVydHlSZXByZXNlbnRhdGlvbik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BdWRpdEV2ZW50QWN0aW9uKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk1lYXN1cmVEYXRhVXNhZ2UpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVHJpZ2dlclR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWN0aXZpdHlEZWZpbml0aW9uQ2F0ZWdvcnkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU2VhcmNoTW9kaWZpZXJDb2RlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbXBvc2l0aW9uU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFwcG9pbnRtZW50U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk1lc3NhZ2VTaWduaWZpY2FuY2VDYXRlZ29yeSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5PcGVyYXRpb25QYXJhbWV0ZXJVc2UpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTGlzdE1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuT2JzZXJ2YXRpb25TdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIucXVhbGl0eVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWRtaW5pc3RyYXRpdmVHZW5kZXIpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVhc3VyZVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUXVlc3Rpb25uYWlyZUl0ZW1UeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN0cnVjdHVyZU1hcExpc3RNb2RlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb0Jvb2xlYW4odmFsdWUgRkhJUi5ib29sZWFuKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkRldmljZU1ldHJpY0NhbGlicmF0aW9uVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5jb2RlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN1cHBseVJlcXVlc3RTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRW5jb3VudGVyTG9jYXRpb25TdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU3VwcGx5RGVsaXZlcnlTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRGlhZ25vc3RpY1JlcG9ydFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5GbGFnU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFsbGVyZ3lJbnRvbGVyYW5jZUNlcnRhaW50eSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5DYXJlUGxhblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5MaXN0U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb2Jhc2U2NEJpbmFyeSh2YWx1ZSBGSElSLmJhc2U2NEJpbmFyeSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5NZWFzdXJlU2NvcmluZyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BdWRpdEV2ZW50QWdlbnROZXR3b3JrVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BZGRyZXNzVXNlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbmRpdGlvbmFsRGVsZXRlU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbnRhY3RQb2ludFVzZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5EZXZpY2VNZXRyaWNPcGVyYXRpb25hbFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5OdXRyaXRpb25PcmRlclN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi51cmkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29udHJpYnV0b3JUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlJlZmVyZW5jZVZlcnNpb25SdWxlcyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Vc2UpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuSWRlbnRpdHlBc3N1cmFuY2VMZXZlbCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5NZWFzdXJlUmVwb3J0U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkRldmljZU1ldHJpY0NvbG9yKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlNlYXJjaEVudHJ5TW9kZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9UaW1lKHZhbHVlIEZISVIudGltZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db25kaXRpb25hbFJlYWRTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29uZGl0aW9uVmVyaWZpY2F0aW9uU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFsbGVyZ3lJbnRvbGVyYW5jZVNldmVyaXR5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk9wZXJhdGlvbktpbmQpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuT2JzZXJ2YXRpb25SZWxhdGlvbnNoaXBUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb0ludGVnZXIodmFsdWUgRkhJUi51bnNpZ25lZEludCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5OYW1lVXNlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN1YnNjcmlwdGlvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db21tdW5pY2F0aW9uUmVxdWVzdFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Eb2N1bWVudFJlZmVyZW5jZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Mb2NhdGlvbk1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvSW50ZWdlcih2YWx1ZSBGSElSLmludGVnZXIpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIucmVwb3NpdG9yeVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ2FyZVBsYW5SZWxhdGlvbnNoaXApOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTG9jYXRpb25TdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVW5rbm93bkNvbnRlbnRDb2RlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk5vdGVUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlRlc3RSZXBvcnRTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuSFRUUFZlcmIpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29kZVN5c3RlbUNvbnRlbnRNb2RlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlBsYW5BY3Rpb25SZWxhdGlvbnNoaXBUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkVwaXNvZGVPZkNhcmVTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUmVtaXR0YW5jZU91dGNvbWUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29udGFjdFBvaW50U3lzdGVtKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlNsb3RTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUHJvcGVydHlUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLm1hcmtkb3duKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlR5cGVEZXJpdmF0aW9uUnVsZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5NZWRpY2F0aW9uU3RhdGVtZW50U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkd1aWRhbmNlUmVzcG9uc2VTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUXVhbnRpdHlDb21wYXJhdG9yKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlJlbGF0ZWRBcnRpZmFjdFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIub2lkKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkRldmljZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5UZXN0UmVwb3J0UmVzdWx0Q29kZXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVhc3VyZVJlcG9ydFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU2FtcGxlZERhdGFEYXRhVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db21wYXJ0bWVudFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29tcG9zaXRpb25BdHRlc3RhdGlvbk1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUGxhbkFjdGlvblJlcXVpcmVkQmVoYXZpb3IpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRGV2aWNlTWV0cmljQ2FsaWJyYXRpb25TdGF0ZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Hcm91cFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVHlwZVJlc3RmdWxJbnRlcmFjdGlvbik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5QbGFuQWN0aW9uQ2FyZGluYWxpdHlCZWhhdmlvcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db2RlU3lzdGVtSGllcmFyY2h5TWVhbmluZyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5NZWRpY2F0aW9uU3RhdGVtZW50Tm90VGFrZW4pOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQnVuZGxlVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TeXN0ZW1WZXJzaW9uUHJvY2Vzc2luZ01vZGUpOiB2YWx1ZS52YWx1ZQ0K", + "url": "library-fhir-helpers-content.cql", + "title": "FHIR Helpers" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/FhirModel.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/FhirModel.json new file mode 100644 index 00000000000..30f237815a9 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/FhirModel.json @@ -0,0 +1,33 @@ +{ + "resourceType": "Library", + "id": "library-fhir-model-definition", + "identifier": [ + { + "use": "official", + "value": "FHIR" + } + ], + "version": "1.9.0", + "title": "FHIR Model Definition", + "type": { + "coding": [ + { + "code": "model-definition" + } + ] + }, + "status": "draft", + "date": "2016-07-08", + "description": "Model definition for the FHIR Model", + "topic": [ + { + "text": "FHIR" + } + ], + "content": [ + { + "contentType": "application/xml", + "url": "http://cqlrepository.org/fhirmodel-modelinfo.xml" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/QuickModel.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/QuickModel.json new file mode 100644 index 00000000000..930f3c0ea50 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/QuickModel.json @@ -0,0 +1,33 @@ +{ + "resourceType": "Library", + "id": "library-quick-model-definition", + "identifier": [ + { + "use": "official", + "value": "QUICK" + } + ], + "version": "1.0.0", + "title": "QUICK Model Definition", + "type": { + "coding": [ + { + "code": "model-definition" + } + ] + }, + "status": "draft", + "date": "2016-07-08", + "description": "Model definition for the QUICK Logical Model", + "topic": [ + { + "text": "QUICK" + } + ], + "content": [ + { + "contentType": "application/xml", + "url": "http://cqlrepository.org/quick-modelinfo.xml" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/SuicideRisk.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/SuicideRisk.json new file mode 100644 index 00000000000..9cb5bd23bb2 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/library/SuicideRisk.json @@ -0,0 +1,95 @@ +{ + "resourceType": "Library", + "id": "mmi-suiciderisk-orderset-logic", + "identifier": [ + { + "use": "official", + "value": "SuicideRiskLogic" + } + ], + "version": "1.0.0", + "title": "Suicide Risk Order Set Logic", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "status": "draft", + "date": "2015-07-22", + "description": "Logic for Suicide Risk Order Sets", + "topic": [ + { + "text": "Suicide Risk Order Set Logic" + } + ], + "relatedArtifact": [ + { + "type": "depends-on", + "resource": { + "reference": "Library/library-fhir-model-definition" + } + }, + { + "type": "depends-on", + "resource": { + "reference": "Library/library-fhir-helpers", + "display": "FHIRHelpers" + } + }, + { + "type": "depends-on", + "resource": { + "reference": "CodeSystem/npi-taxonomy" + } + }, + { + "type": "depends-on", + "resource": { + "reference": "ValueSet/1.2.3.4.5", + "display": "Suicide Risk Assessment" + } + } + ], + "parameter": [ + { + "name": "Patient", + "use": "in", + "min": 1, + "max": "1", + "type": "Patient" + }, + { + "name": "Encounter", + "use": "in", + "min": 1, + "max": "1", + "type": "Encounter" + }, + { + "name": "Practitioner", + "use": "in", + "min": 1, + "max": "1", + "type": "Practitioner" + } + ], + "dataRequirement": [ + { + "type": "RiskAssessment", + "codeFilter": [ + { + "path": "code", + "valueSetString": "Suicide Risk Assessment" + } + ] + } + ], + "content": [ + { + "contentType": "text/cql", + "url": "library-mmi-suiciderisk-orderset-logic-content.cql" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measure/ExclusiveBreastfeeding.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measure/ExclusiveBreastfeeding.json new file mode 100644 index 00000000000..9c2d24824bf --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measure/ExclusiveBreastfeeding.json @@ -0,0 +1,101 @@ +{ + "resourceType": "Measure", + "id": "measure-exclusive-breastfeeding", + "identifier": [ + { + "use": "official", + "value": "exclusive-breastfeeding-measure" + } + ], + "version": "1.0.0", + "title": "Exclusive Breastfeeding Measure", + "status": "active", + "date": "2015-03-08", + "description": "Exclusive breastfeeding measure of outcomes for exclusive breastmilk feeding of newborns.", + "purpose": "Exclusive breast milk feeding for the first 6 months of neonatal life can result in numerous long-term health benefits for both mother and newborn and is recommended by a number of national and international organizations. Evidence suggests that the prenatal and intrapartum period is critical for the success of exclusive (or any) breast feeding. Therefore, it is recommended that newborns are fed breast milk only from birth to discharge.", + "topic": [ + { + "text": "Exclusive Breastfeeding" + } + ], + "library": [ + { + "reference": "Library/library-exclusive-breastfeeding-cqm-logic" + } + ], + "type": [ + "outcome" + ], + "group": [ + { + "identifier": { + "value": "Population Group 1" + }, + "population": [ + { + "type": "initial-population", + "identifier": { + "value": "initial-population-1-identifier" + }, + "criteria": "InitialPopulation1" + }, + { + "type": "denominator", + "identifier": { + "value": "denominator-1-identifier" + }, + "criteria": "Denominator1" + }, + { + "type": "denominator-exclusion", + "identifier": { + "value": "denominator-exclusions-1-identifier" + }, + "criteria": "DenominatorExclusions1" + }, + { + "type": "numerator", + "identifier": { + "value": "numerator-1-identifier" + }, + "criteria": "Numerator1" + } + ] + }, + { + "identifier": { + "value": "Population Group 2" + }, + "population": [ + { + "type": "initial-population", + "identifier": { + "value": "initial-population-2-identifier" + }, + "criteria": "InitialPopulation2" + }, + { + "type": "denominator", + "identifier": { + "value": "denominator-2-identifier" + }, + "criteria": "Denominator2" + }, + { + "type": "denominator-exclusion", + "identifier": { + "value": "denominator-exclusions-2-identifier" + }, + "criteria": "DenominatorExclusions2" + }, + { + "type": "numerator", + "identifier": { + "value": "numerator-2-identifier" + }, + "criteria": "Numerator2" + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measure/cms146.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measure/cms146.json new file mode 100644 index 00000000000..250fb1e9d68 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measure/cms146.json @@ -0,0 +1,112 @@ +{ + "resourceType": "Measure", + "id": "measure-cms146-example", + "identifier": [ + { + "use": "official", + "system": "http://hl7.org/fhir/cqi/ecqm/Measure/Identifier/cms", + "value": "146" + }, + { + "use": "official", + "system": "http://hl7.org/fhir/cqi/ecqm/Measure/Identifier/nqf", + "value": "0002" + } + ], + "version": "1.0.0", + "title": "Appropriate Testing for Children with Pharyngitis", + "status": "active", + "experimental": true, + "description": "Percentage of children 2-18 years of age who were diagnosed with pharyngitis, ordered an antibiotic and received a group A streptococcus (strep) test for the episode.", + "purpose": "The Infectious Diseases Society of America (IDSA) \"recommends swabbing the throat and testing for GAS pharyngitis by rapid antigen detection test (RADT) and/or culture because the clinical features alone do not reliably discriminate between GAS and viral pharyngitis except when overt viral features like rhinorrhea, cough, oral ulcers, and/or hoarseness are present\"", + "topic": [ + { + "coding": [ + { + "system": "http://hl7.org/fhir/c80-doc-typecodes", + "code": "57024-2" + } + ] + } + ], + "library": [ + { + "reference": "Library/library-cms146-example" + } + ], + "scoring": "proportion", + "type": [ + "process" + ], + "group": [ + { + "identifier": { + "value": "CMS146-group-1" + }, + "population": [ + { + "type": "initial-population", + "identifier": { + "value": "initial-population-identifier" + }, + "criteria": "CMS146.InInitialPopulation" + }, + { + "type": "numerator", + "identifier": { + "value": "numerator-identifier" + }, + "criteria": "CMS146.InNumerator" + }, + { + "type": "denominator", + "identifier": { + "value": "denominator-identifier" + }, + "criteria": "CMS146.InDenominator" + }, + { + "type": "denominator-exclusion", + "identifier": { + "value": "denominator-exclusions-identifier" + }, + "criteria": "CMS146.InDenominatorExclusions" + } + ], + "stratifier": [ + { + "identifier": { + "value": "stratifier-ages-up-to-9" + }, + "criteria": "CMS146.AgesUpToNine" + }, + { + "identifier": { + "value": "stratifier-ages-10-plus" + }, + "criteria": "CMS146.AgesTenPlus" + }, + { + "identifier": { + "value": "stratifier-ages-up-to-9" + }, + "path": "Patient.gender" + } + ] + } + ], + "supplementalData": [ + { + "identifier": { + "value": "supplemental-data-gender" + }, + "path": "Patient.gender" + }, + { + "identifier": { + "value": "supplemental-data-deceased" + }, + "path": "deceasedBoolean" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146Individual.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146Individual.json new file mode 100644 index 00000000000..2e82fe60391 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146Individual.json @@ -0,0 +1,285 @@ +{ + "resourceType": "MeasureReport", + "id": "measurereport-cms146-cat1-example", + "contained": [ + { + "resourceType": "Organization", + "id": "reporter", + "name": "Good Health Hospital" + } + ], + "measure": { + "reference": "Measure/CMS146" + }, + "type": "individual", + "patient": { + "reference": "Patient/123" + }, + "period": { + "start": "2014-01-01", + "end": "2014-03-31" + }, + "status": "complete", + "reportingOrganization": { + "reference": "#reporter" + }, + "group": [ + { + "identifier": { + "value": "CMS146-group-1" + }, + "population": [ + { + "type": "initial-population", + "count": 1 + }, + { + "type": "numerator", + "count": 1 + }, + { + "type": "denominator", + "count": 1 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ], + "stratifier": [ + { + "identifier": { + "value": "stratifier-ages-up-to-9" + }, + "group": [ + { + "value": "true", + "population": [ + { + "type": "initial-population", + "count": 1 + }, + { + "type": "numerator", + "count": 1 + }, + { + "type": "denominator", + "count": 1 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + }, + { + "value": "false", + "population": [ + { + "type": "initial-population", + "count": 0 + }, + { + "type": "numerator", + "count": 0 + }, + { + "type": "denominator", + "count": 0 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + } + ] + }, + { + "identifier": { + "value": "stratifier-ages-10-plus" + }, + "group": [ + { + "value": "true", + "population": [ + { + "type": "initial-population", + "count": 0 + }, + { + "type": "numerator", + "count": 0 + }, + { + "type": "denominator", + "count": 0 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + }, + { + "value": "false", + "population": [ + { + "type": "initial-population", + "count": 1 + }, + { + "type": "numerator", + "count": 1 + }, + { + "type": "denominator", + "count": 1 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + } + ] + }, + { + "identifier": { + "value": "stratifier-gender" + }, + "group": [ + { + "value": "male", + "population": [ + { + "type": "initial-population", + "count": 1 + }, + { + "type": "numerator", + "count": 1 + }, + { + "type": "denominator", + "count": 1 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + }, + { + "value": "female", + "population": [ + { + "type": "initial-population", + "count": 0 + }, + { + "type": "numerator", + "count": 0 + }, + { + "type": "denominator", + "count": 0 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + }, + { + "value": "other", + "population": [ + { + "type": "initial-population", + "count": 0 + }, + { + "type": "numerator", + "count": 0 + }, + { + "type": "denominator", + "count": 0 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + }, + { + "value": "unknown", + "population": [ + { + "type": "initial-population", + "count": 0 + }, + { + "type": "numerator", + "count": 0 + }, + { + "type": "denominator", + "count": 0 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + } + ] + } + ], + "supplementalData": [ + { + "identifier": { + "value": "supplemental-data-gender" + }, + "group": [ + { + "value": "male", + "count": 1 + }, + { + "value": "female", + "count": 0 + }, + { + "value": "other", + "count": 0 + }, + { + "value": "unknown", + "count": 0 + } + ] + }, + { + "identifier": { + "value": "supplemental-data-deceased" + }, + "group": [ + { + "value": "true", + "count": 0 + }, + { + "value": "false", + "count": 1 + } + ] + } + ] + } + ], + "evaluatedResources": { + "reference": "Bundle/456" + } +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146PatientListing.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146PatientListing.json new file mode 100644 index 00000000000..07aad07f0fb --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146PatientListing.json @@ -0,0 +1,405 @@ +{ + "resourceType": "MeasureReport", + "id": "measurereport-cms146-cat2-example", + "contained": [ + { + "resourceType": "Organization", + "id": "reporter", + "name": "Good Health Hospital" + } + ], + "measure": { + "reference": "Measure/CMS146" + }, + "type": "patient-list", + "period": { + "start": "2014-01-01", + "end": "2014-03-31" + }, + "status": "complete", + "reportingOrganization": { + "reference": "#reporter" + }, + "group": [ + { + "identifier": { + "value": "CMS146-group-1" + }, + "population": [ + { + "type": "initial-population", + "count": 500, + "patients": { + "reference": "List/CMS146-initial-population" + } + }, + { + "type": "numerator", + "count": 200, + "patients": { + "reference": "List/CMS146-numerator" + } + }, + { + "type": "denominator", + "count": 500, + "patients": { + "reference": "List/CMS146-denominator" + } + }, + { + "type": "denominator-exclusion", + "count": 100, + "patients": { + "reference": "List/CMS146-denominator-exclusions" + } + } + ], + "stratifier": [ + { + "identifier": { + "value": "stratifier-ages-up-to-9" + }, + "group": [ + { + "value": "true", + "population": [ + { + "type": "initial-population", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-ages-up-to-9-true-initial-population" + } + }, + { + "type": "numerator", + "count": 100, + "patients": { + "reference": "List/CMS146-stratifier-ages-up-to-9-true-numerator" + } + }, + { + "type": "denominator", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-ages-up-to-9-true-denominator" + } + }, + { + "type": "denominator-exclusion", + "count": 50, + "patients": { + "reference": "List/CMS146-stratifier-ages-up-to-9-true-denominator-exclusions" + } + } + ] + }, + { + "value": "false", + "population": [ + { + "type": "initial-population", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-ages-up-to-9-false-initial-population" + } + }, + { + "type": "numerator", + "count": 100, + "patients": { + "reference": "List/CMS146-stratifier-ages-up-to-9-false-numerator" + } + }, + { + "type": "denominator", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-ages-up-to-9-false-denominator" + } + }, + { + "type": "denominator-exclusion", + "count": 50, + "patients": { + "reference": "List/CMS146-stratifier-ages-up-to-9-false-denominator-exclusions" + } + } + ] + } + ] + }, + { + "identifier": { + "value": "stratifier-ages-10-plus" + }, + "group": [ + { + "value": "true", + "population": [ + { + "type": "initial-population", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-ages-10-plus-true-initial-population" + } + }, + { + "type": "numerator", + "count": 100, + "patients": { + "reference": "List/CMS146-stratifier-ages-10-plus-true-numerator" + } + }, + { + "type": "denominator", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-ages-10-plus-true-denominator" + } + }, + { + "type": "denominator-exclusion", + "count": 50, + "patients": { + "reference": "List/CMS146-stratifier-ages-10-plus-true-denominator-exclusions" + } + } + ] + }, + { + "value": "false", + "population": [ + { + "type": "initial-population", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-ages-10-plus-false-initial-population" + } + }, + { + "type": "numerator", + "count": 100, + "patients": { + "reference": "List/CMS146-stratifier-ages-10-plus-false-numerator" + } + }, + { + "type": "denominator", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-ages-10-plus-false-denominator" + } + }, + { + "type": "denominator-exclusion", + "count": 50, + "patients": { + "reference": "List/CMS146-stratifier-ages-10-plus-false-denominator-exclusions" + } + } + ] + } + ] + }, + { + "identifier": { + "value": "stratifier-gender" + }, + "group": [ + { + "value": "male", + "population": [ + { + "type": "initial-population", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-gender-male-initial-population" + } + }, + { + "type": "numerator", + "count": 100, + "patients": { + "reference": "List/CMS146-stratifier-gender-male-numerator" + } + }, + { + "type": "denominator", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-gender-male-denominator" + } + }, + { + "type": "denominator-exclusion", + "count": 50, + "patients": { + "reference": "List/CMS146-stratifier-gender-male-denominator-exclusions" + } + } + ] + }, + { + "value": "female", + "population": [ + { + "type": "initial-population", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-gender-female-initial-population" + } + }, + { + "type": "numerator", + "count": 100, + "patients": { + "reference": "List/CMS146-stratifier-gender-female-numerator" + } + }, + { + "type": "denominator", + "count": 250, + "patients": { + "reference": "List/CMS146-stratifier-gender-female-denominator" + } + }, + { + "type": "denominator-exclusion", + "count": 50, + "patients": { + "reference": "List/CMS146-stratifier-gender-female-denominator-exclusions" + } + } + ] + }, + { + "value": "other", + "population": [ + { + "type": "initial-population", + "count": 0, + "patients": { + "reference": "List/CMS146-stratifier-gender-other-initial-population" + } + }, + { + "type": "numerator", + "count": 0, + "patients": { + "reference": "List/CMS146-stratifier-gender-other-numerator" + } + }, + { + "type": "denominator", + "count": 0, + "patients": { + "reference": "List/CMS146-stratifier-gender-other-denominator" + } + }, + { + "type": "denominator-exclusion", + "count": 0, + "patients": { + "reference": "List/CMS146-stratifier-gender-other-denominator-exclusions" + } + } + ] + }, + { + "value": "unknown", + "population": [ + { + "type": "initial-population", + "count": 0, + "patients": { + "reference": "List/CMS146-stratifier-gender-unknown-initial-population" + } + }, + { + "type": "numerator", + "count": 0, + "patients": { + "reference": "List/CMS146-stratifier-gender-unknown-numerator" + } + }, + { + "type": "denominator", + "count": 0, + "patients": { + "reference": "List/CMS146-stratifier-gender-unknown-denominator" + } + }, + { + "type": "denominator-exclusion", + "count": 0, + "patients": { + "reference": "List/CMS146-stratifier-gender-unknown-denominator-exclusions" + } + } + ] + } + ] + } + ], + "supplementalData": [ + { + "identifier": { + "value": "supplemental-data-gender" + }, + "group": [ + { + "value": "male", + "count": 250, + "patients": { + "reference": "List/CMS146-supplemental-data-gender-male" + } + }, + { + "value": "female", + "count": 250, + "patients": { + "reference": "List/CMS146-supplemental-data-gender-female" + } + }, + { + "value": "other", + "count": 0, + "patients": { + "reference": "List/CMS146-supplemental-data-gender-other" + } + }, + { + "value": "unknown", + "count": 0, + "patients": { + "reference": "List/CMS146-supplemental-data-gender-unknown" + } + } + ] + }, + { + "identifier": { + "value": "supplemental-data-deceased" + }, + "group": [ + { + "value": "true", + "count": 0, + "patients": { + "reference": "List/CMS146-supplemental-data-deceased-true" + } + }, + { + "value": "false", + "count": 500, + "patients": { + "reference": "List/CMS146-supplemental-data-deceased-false" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146Summary.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146Summary.json new file mode 100644 index 00000000000..073d5d92dec --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/measurereport/CMS146Summary.json @@ -0,0 +1,279 @@ +{ + "resourceType": "MeasureReport", + "id": "measurereport-cms146-cat3-example", + "contained": [ + { + "resourceType": "Organization", + "id": "reporter", + "name": "Good Health Hospital" + } + ], + "measure": { + "reference": "Measure/CMS146" + }, + "type": "summary", + "period": { + "start": "2014-01-01", + "end": "2014-03-31" + }, + "status": "complete", + "reportingOrganization": { + "reference": "#reporter" + }, + "group": [ + { + "identifier": { + "value": "CMS146-group-1" + }, + "population": [ + { + "type": "initial-population", + "count": 500 + }, + { + "type": "numerator", + "count": 200 + }, + { + "type": "denominator", + "count": 500 + }, + { + "type": "denominator-exclusion", + "count": 100 + } + ], + "stratifier": [ + { + "identifier": { + "value": "stratifier-ages-up-to-9" + }, + "group": [ + { + "value": "true", + "population": [ + { + "type": "initial-population", + "count": 250 + }, + { + "type": "numerator", + "count": 100 + }, + { + "type": "denominator", + "count": 250 + }, + { + "type": "denominator-exclusion", + "count": 50 + } + ] + }, + { + "value": "false", + "population": [ + { + "type": "initial-population", + "count": 250 + }, + { + "type": "numerator", + "count": 100 + }, + { + "type": "denominator", + "count": 250 + }, + { + "type": "denominator-exclusion", + "count": 50 + } + ] + } + ] + }, + { + "identifier": { + "value": "stratifier-ages-10-plus" + }, + "group": [ + { + "value": "true", + "population": [ + { + "type": "initial-population", + "count": 250 + }, + { + "type": "numerator", + "count": 100 + }, + { + "type": "denominator", + "count": 250 + }, + { + "type": "denominator-exclusion", + "count": 50 + } + ] + }, + { + "value": "false", + "population": [ + { + "type": "initial-population", + "count": 250 + }, + { + "type": "numerator", + "count": 100 + }, + { + "type": "denominator", + "count": 250 + }, + { + "type": "denominator-exclusion", + "count": 50 + } + ] + } + ] + }, + { + "identifier": { + "value": "stratifier-gender" + }, + "group": [ + { + "value": "male", + "population": [ + { + "type": "initial-population", + "count": 250 + }, + { + "type": "numerator", + "count": 100 + }, + { + "type": "denominator", + "count": 250 + }, + { + "type": "denominator-exclusion", + "count": 50 + } + ] + }, + { + "value": "female", + "population": [ + { + "type": "initial-population", + "count": 250 + }, + { + "type": "numerator", + "count": 100 + }, + { + "type": "denominator", + "count": 250 + }, + { + "type": "denominator-exclusion", + "count": 50 + } + ] + }, + { + "value": "other", + "population": [ + { + "type": "initial-population", + "count": 0 + }, + { + "type": "numerator", + "count": 0 + }, + { + "type": "denominator", + "count": 0 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + }, + { + "value": "unknown", + "population": [ + { + "type": "initial-population", + "count": 0 + }, + { + "type": "numerator", + "count": 0 + }, + { + "type": "denominator", + "count": 0 + }, + { + "type": "denominator-exclusion", + "count": 0 + } + ] + } + ] + } + ], + "supplementalData": [ + { + "identifier": { + "value": "supplemental-data-gender" + }, + "group": [ + { + "value": "male", + "count": 250 + }, + { + "value": "female", + "count": 250 + }, + { + "value": "other", + "count": 0 + }, + { + "value": "unknown", + "count": 0 + } + ] + }, + { + "identifier": { + "value": "supplemental-data-deceased" + }, + "group": [ + { + "value": "true", + "count": 0 + }, + { + "value": "false", + "count": 500 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ChlamydiaScreening.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ChlamydiaScreening.json new file mode 100644 index 00000000000..abd5a46d330 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ChlamydiaScreening.json @@ -0,0 +1,42 @@ +{ + "resourceType": "PlanDefinition", + "id": "chlamydia-screening-intervention", + "identifier": [ + { + "use": "official", + "value": "ChlamydiaScreening_CDS_UsingCommon" + } + ], + "version": "2.0.0", + "title": "Chalmydia Screening CDS Example Using Common", + "status": "draft", + "description": "Chlamydia Screening CDS Example Using Common", + "approvalDate": "2015-07-22", + "topic": [ + { + "text": "Chlamydia Screeening" + } + ], + "library": [ + { + "reference": "Library/ChlamydiaScreening_CDS_UsingCommon" + } + ], + "actionDefinition": [ + { + "title": "Patient has not had chlamydia screening within the recommended timeframe...", + "condition": [ + { + "kind": "applicability", + "expression": "NoScreening" + } + ], + "dynamicValue": [ + { + "path": "~", + "expression": "ChlamydiaScreeningRequest" + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_1.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_1.json new file mode 100644 index 00000000000..1ff67baa91c --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_1.json @@ -0,0 +1,82 @@ +{ + "resourceType": "PlanDefinition", + "id": "exclusive-breastfeeding-intervention-01", + "identifier": [ + { + "use": "official", + "value": "exclusive-breastfeeding-intervention-01" + } + ], + "version": "1.0.0", + "title": "Exclusive Breastfeeding Intervention-01", + "status": "active", + "date": "2015-03-08", + "description": "Exclusive breastfeeding intervention intended to improve outcomes for exclusive breastmilk feeding of newborns by ensuring that an appropriate breastfeeding readiness assessment order is created if necessary.", + "topic": [ + { + "text": "Exclusive Breastfeeding" + } + ], + "library": [ + { + "reference": "Library/library-exclusive-breastfeeding-cds-logic" + } + ], + "actionDefinition": [ + { + "title": "Mother should be administered a breastfeeding readiness assessment.", + "triggerDefinition": [ + { + "type": "named-event", + "eventName": "Admission" + }, + { + "type": "named-event", + "eventName": "Birth" + }, + { + "type": "named-event", + "eventName": "Infant Transfer to Recovery" + }, + { + "type": "named-event", + "eventName": "Transfer to Post-Partum" + } + ], + "condition": [ + { + "kind": "applicability", + "expression": "Should Create Assessment Order" + } + ], + "actionDefinition": [ + { + "title": "Create the breastfeeding readiness assessment order.", + "textEquivalent": "Administer a breastfeeding readiness assessment.", + "type": { + "code": "create" + }, + "dynamicValue": [ + { + "path": "/", + "expression": "Create Breastfeeding Risk Assessment" + } + ] + }, + { + "title": "Notify the provider to sign the order.", + "textEquivalent": "A Breastfeeding Readiness Assessment is recommended, please authorize or reject the order.", + "type": { + "code": "create" + }, + "dynamicValue": [ + { + "path": "/", + "expression": "Communication Request to Provider" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_2.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_2.json new file mode 100644 index 00000000000..36edd98c1ee --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_2.json @@ -0,0 +1,69 @@ +{ + "resourceType": "PlanDefinition", + "id": "exclusive-breastfeeding-intervention-02", + "identifier": [ + { + "use": "official", + "value": "exclusive-breastfeeding-intervention-02" + } + ], + "version": "1.0.0", + "title": "Exclusive Breastfeeding Intervention-02", + "status": "active", + "date": "2015-03-08", + "description": "Exclusive breastfeeding intervention intended to improve outcomes for exclusive breastmilk feeding of newborns by notifying the provider to sign the breastmilk feeding readiness assessment order, if necessary.", + "topic": [ + { + "text": "Exclusive Breastfeeding" + } + ], + "library": [ + { + "reference": "Library/library-exclusive-breastfeeding-cds-logic" + } + ], + "actionDefinition": [ + { + "title": "Mother should be administered a breastfeeding readiness assessment.", + "triggerDefinition": [ + { + "type": "named-event", + "eventName": "Admission" + }, + { + "type": "named-event", + "eventName": "Birth" + }, + { + "type": "named-event", + "eventName": "Infant Transfer to Recovery" + }, + { + "type": "named-event", + "eventName": "Transfer to Post-Partum" + } + ], + "condition": [ + { + "kind": "applicability", + "expression": "Should Notify Provider to Sign Assessment Order" + } + ], + "actionDefinition": [ + { + "title": "Notify the provider to sign the order.", + "textEquivalent": "A Breastfeeding Readiness Assessment is recommended, please authorize or reject the order.", + "type": { + "code": "create" + }, + "dynamicValue": [ + { + "path": "/", + "expression": "Communication Request to Provider" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_3.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_3.json new file mode 100644 index 00000000000..03b35aa1a5e --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_3.json @@ -0,0 +1,82 @@ +{ + "resourceType": "PlanDefinition", + "id": "exclusive-breastfeeding-intervention-03", + "identifier": [ + { + "use": "official", + "value": "exclusive-breastfeeding-intervention-03" + } + ], + "version": "1.0.0", + "title": "Exclusive Breastfeeding Intervention-03", + "status": "active", + "date": "2015-03-08", + "description": "Exclusive breastfeeding intervention intended to improve outcomes for exclusive breastmilk feeding of newborns by notifying the charge and/or bedside nurse to perform the breastfeeding readiness assessment.", + "topic": [ + { + "text": "Exclusive Breastfeeding" + } + ], + "library": [ + { + "reference": "Library/library-exclusive-breastfeeding-cds-logic" + } + ], + "actionDefinition": [ + { + "title": "Mother should be administered a breastfeeding readiness assessment.", + "triggerDefinition": [ + { + "type": "named-event", + "eventName": "Admission" + }, + { + "type": "named-event", + "eventName": "Birth" + }, + { + "type": "named-event", + "eventName": "Infant Transfer to Recovery" + }, + { + "type": "named-event", + "eventName": "Transfer to Post-Partum" + } + ], + "condition": [ + { + "kind": "applicability", + "expression": "Should Notify Nurse to Perform Assessment" + } + ], + "actionDefinition": [ + { + "title": "Notify the charge nurse to perform the assessment.", + "textEquivalent": "A Breastfeeding Readiness Assessment is recommended, please administer the assessment.", + "type": { + "code": "create" + }, + "dynamicValue": [ + { + "path": "/", + "expression": "Communication Request to Charge Nurse" + } + ] + }, + { + "title": "Notify the bedside nurse to perform the assessment.", + "textEquivalent": "A Breastfeeding Readiness Assessment is recommended, please administer the assessment.", + "type": { + "code": "create" + }, + "dynamicValue": [ + { + "path": "/", + "expression": "Communication Request to Bedside Nurse" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_4.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_4.json new file mode 100644 index 00000000000..4efd7adc7fb --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ExclusiveBreastfeeding_4.json @@ -0,0 +1,69 @@ +{ + "resourceType": "PlanDefinition", + "id": "exclusive-breastfeeding-intervention-04", + "identifier": [ + { + "use": "official", + "value": "exclusive-breastfeeding-intervention-04" + } + ], + "version": "1.0.0", + "title": "Exclusive Breastfeeding Intervention-04", + "status": "active", + "date": "2015-03-08", + "description": "Exclusive breastfeeding intervention intended to improve outcomes for exclusive breastmilk feeding of newborns by creating a lactation consult for the mother if appropriate.", + "topic": [ + { + "text": "Exclusive Breastfeeding" + } + ], + "library": [ + { + "reference": "Library/library-exclusive-breastfeeding-cds-logic" + } + ], + "actionDefinition": [ + { + "title": "Mother should be referred to a lactation specialist for consultation.", + "triggerDefinition": [ + { + "type": "named-event", + "eventName": "Admission" + }, + { + "type": "named-event", + "eventName": "Birth" + }, + { + "type": "named-event", + "eventName": "Infant Transfer to Recovery" + }, + { + "type": "named-event", + "eventName": "Transfer to Post-Partum" + } + ], + "condition": [ + { + "kind": "applicability", + "expression": "Should Create Lactation Consult" + } + ], + "actionDefinition": [ + { + "title": "Create a lactation consult request.", + "textEquivalent": "Create a lactation consult request", + "type": { + "code": "create" + }, + "dynamicValue": [ + { + "path": "/", + "expression": "Create Lactation Consult Request" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ZikaVirusIntervention.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ZikaVirusIntervention.json new file mode 100644 index 00000000000..6fe44408598 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/ZikaVirusIntervention.json @@ -0,0 +1,217 @@ +{ + "resourceType": "PlanDefinition", + "id": "zika-virus-intervention", + "contained": [ + { + "resourceType": "ActivityDefinition", + "id": "administer-zika-virus-exposure-assessment", + "url": "http://example.org/ActivityDefinition/administer-zika-virus-exposure-assessment", + "status": "draft", + "description": "Administer Zika Virus Exposure Assessment", + "category": "procedure", + "code": { + "coding": [ + { + "system": "http://example.org/questionnaires", + "code": "zika-virus-exposure-assessment" + } + ] + }, + "timingTiming": { + "event": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "Now()" + } + ] + } + ] + }, + "participantType": [ + "practitioner" + ] + }, + { + "resourceType": "ActivityDefinition", + "id": "order-serum-zika-dengue-virus-igm", + "url": "http://example.org/ActivityDefinition/serum-zika-dengue-virus-igm", + "status": "draft", + "description": "Order Serum Zika and Dengue Virus IgM", + "relatedArtifact": [ + { + "type": "documentation", + "display": "Explanation of diagnostic tests for Zika virus and which to use based on the patient’s clinical and exposure history.", + "url": "http://www.cdc.gov/zika/hc-providers/diagnostic.html" + } + ], + "category": "diagnostic", + "code": { + "text": "Serum Zika and Dengue Virus IgM" + }, + "timingTiming": { + "event": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "Now()" + } + ] + } + ] + }, + "participantType": [ + "practitioner" + ] + }, + { + "resourceType": "ActivityDefinition", + "id": "provide-mosquito-prevention-advice", + "text": { + "status": "generated", + "div": "
Provide Mosquito Prevention Advice
" + }, + "url": "http://example.org/ActivityDefinition/provide-mosquito-prevention-advice", + "status": "draft", + "description": "Provide mosquito prevention advice", + "relatedArtifact": [ + { + "type": "documentation", + "display": "Advice for patients about how to avoid Mosquito bites.", + "url": "http://www.cdc.gov/zika/prevention/index.html" + }, + { + "type": "documentation", + "display": "Advice for patients about which mosquito repellents are effective and safe to use in pregnancy. [DEET, IF3535 and Picardin are safe during]", + "url": "https://www.epa.gov/insect-repellents/find-insect-repellent-right-you" + } + ], + "category": "communication", + "code": { + "text": "Provide Mosquito Prevention Advice" + }, + "timingTiming": { + "event": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "Now()" + } + ] + } + ] + }, + "participantType": [ + "practitioner" + ] + } + ], + "url": "http://example.org/PlanDefinition/zika-virus-intervention", + "identifier": [ + { + "use": "official", + "value": "zika-virus-intervention" + } + ], + "version": "1.0.0", + "title": "Example Zika Virus Intervention", + "status": "active", + "date": "2016-11-14", + "description": "Zika Virus Management intervention describing the CDC Guidelines for Zika Virus Reporting and Management.", + "topic": [ + { + "text": "Zika Virus Management" + } + ], + "library": [ + { + "reference": "Library/zika-virus-intervention-logic" + } + ], + "actionDefinition": [ + { + "title": "Zika Virus Assessment", + "triggerDefinition": [ + { + "type": "named-event", + "eventName": "patient-view" + } + ], + "condition": [ + { + "kind": "applicability", + "expression": "Is Patient Pregnant" + } + ], + "actionDefinition": [ + { + "condition": [ + { + "kind": "applicability", + "expression": "Should Administer Zika Virus Exposure Assessment" + } + ], + "activityDefinition": { + "reference": "#administer-zika-virus-exposure-assessment" + } + }, + { + "condition": [ + { + "kind": "applicability", + "expression": "Should Order Serum + Urine rRT-PCR Test" + } + ], + "activityDefinition": { + "reference": "ActivityDefinition/order-serum-urine-rrt-pcr-test" + } + }, + { + "condition": [ + { + "kind": "applicability", + "expression": "Should Order Serum Zika Virus IgM + Dengue Virus IgM" + } + ], + "activityDefinition": { + "reference": "#order-serum-zika-dengue-virus-igm" + } + }, + { + "condition": [ + { + "kind": "applicability", + "expression": "Should Consider IgM Antibody Testing" + } + ], + "activityDefinition": { + "reference": "ActivityDefinition/consider-igm-antibody-testing" + } + }, + { + "condition": [ + { + "kind": "applicability", + "expression": "Should Provide Mosquito Prevention and Contraception Advice" + } + ], + "actionDefinition": [ + { + "activityDefinition": { + "reference": "#provide-mosquito-prevention-advice" + } + }, + { + "activityDefinition": { + "reference": "ActivityDefinition/provide-contraception-advice" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/low-suicide-risk.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/low-suicide-risk.json new file mode 100644 index 00000000000..8ae6d53ac41 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/low-suicide-risk.json @@ -0,0 +1,476 @@ +{ + "resourceType": "PlanDefinition", + "id": "example", + "contained": [ + { + "resourceType": "ActivityDefinition", + "id": "referralToMentalHealthCare", + "status": "draft", + "description": "refer to primary care mental-health integrated care program for evaluation and treatment of mental health conditions now", + "category": "referral", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "306206005" + } + ], + "text": "Referral to service (procedure)" + }, + "timingTiming": { + "event": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "Now()" + } + ] + } + ] + }, + "participantType": [ + "practitioner" + ] + }, + { + "resourceType": "ActivityDefinition", + "id": "citalopramPrescription", + "status": "draft", + "category": "drug", + "productReference": { + "reference": "#citalopramMedication" + }, + "dosageInstruction": [ + { + "text": "1 tablet oral 1 time daily", + "timing": { + "repeat": { + "frequency": 1, + "period": 1, + "periodUnit": "d" + } + }, + "route": { + "coding": [ + { + "code": "26643006", + "display": "Oral route (qualifier value)" + } + ], + "text": "Oral route (qualifier value)" + }, + "doseQuantity": { + "value": 1, + "unit": "{tbl}" + } + } + ], + "dynamicValue": [ + { + "path": "dispenseRequest.numberOfRepeatsAllowed", + "expression": "3" + }, + { + "path": "dispenseRequest.quantity", + "expression": "30 '{tbl}'" + } + ] + }, + { + "resourceType": "Medication", + "id": "citalopramMedication", + "code": { + "coding": [ + { + "system": "http://www.nlm.nih.gov/research/umls/rxnorm", + "code": "200371" + } + ], + "text": "citalopram" + }, + "product": { + "form": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "385055001", + "display": "Tablet dose form" + } + ], + "text": "Tablet dose form" + }, + "ingredient": [ + { + "itemReference": { + "reference": "#citalopramSubstance" + }, + "amount": { + "numerator": { + "value": 20, + "unit": "mg" + }, + "denominator": { + "value": 1, + "unit": "{tbl}" + } + } + } + ] + } + }, + { + "resourceType": "Substance", + "id": "citalopramSubstance", + "code": { + "coding": [ + { + "system": "http://www.nlm.nih.gov/research/umls/rxnorm", + "code": "2556" + } + ], + "text": "citalopram" + } + } + ], + "identifier": [ + { + "use": "official", + "value": "mmi:low-suicide-risk-order-set" + } + ], + "version": "1.0.0", + "title": "Low Suicide Risk Order Set", + "status": "draft", + "date": "2015-08-15", + "description": "Orders to be applied to a patient characterized as low suicide risk.", + "purpose": "This order set helps ensure consistent application of appropriate orders for the care of low suicide risk patients.", + "usage": "This order set should be applied after assessing a patient for suicide risk, when the findings of that assessment indicate the patient has low suicide risk.", + "approvalDate": "2016-03-12", + "lastReviewDate": "2016-08-15", + "effectivePeriod": { + "start": "2016-01-01", + "end": "2017-12-31" + }, + "useContext": [ + { + "code": { + "system": "http://hl7.org/fhir/usage-context-type", + "code": "age" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "https://meshb.nlm.nih.gov", + "code": "D000328", + "display": "Adult" + } + ] + } + }, + { + "code": { + "system": "http://hl7.org/fhir/usage-context-type", + "code": "focus" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "87512008", + "display": "Mild major depression" + } + ] + } + }, + { + "code": { + "system": "http://hl7.org/fhir/usage-context-type", + "code": "focus" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "40379007", + "display": "Major depression, recurrent, mild" + } + ] + } + }, + { + "code": { + "system": "http://hl7.org/fhir/usage-context-type", + "code": "focus" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "394687007", + "display": "Low suicide risk" + } + ] + } + }, + { + "code": { + "system": "http://hl7.org/fhir/usage-context-type", + "code": "focus" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "225337009", + "display": "Suicide risk assessment" + } + ] + } + }, + { + "code": { + "system": "http://hl7.org/fhir/usage-context-type", + "code": "user" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "309343006", + "display": "Physician" + } + ] + } + }, + { + "code": { + "system": "http://hl7.org/fhir/usage-context-type", + "code": "venue" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "440655000", + "display": "Outpatient environment" + } + ] + } + } + ], + "jurisdiction": [ + { + "coding": [ + { + "system": "urn:iso:std:iso:3166", + "code": "US" + } + ] + } + ], + "topic": [ + { + "text": "Suicide risk assessment" + } + ], + "contributor": [ + { + "type": "author", + "name": "Motive Medical Intelligence", + "contact": [ + { + "telecom": [ + { + "system": "phone", + "value": "415-362-4007", + "use": "work" + }, + { + "system": "email", + "value": "info@motivemi.com", + "use": "work" + } + ] + } + ] + } + ], + "publisher": "Motive Medical Intelligence", + "contact": [ + { + "telecom": [ + { + "system": "phone", + "value": "415-362-4007", + "use": "work" + }, + { + "system": "email", + "value": "info@motivemi.com", + "use": "work" + } + ] + } + ], + "library": [ + { + "reference": "Library/mmi-suiciderisk-orderset-logic", + "display": "SuicideRiskLogic" + } + ], + "actionDefinition": [ + { + "title": "Suicide Risk Assessment and Outpatient Management", + "actionDefinition": [ + { + "title": "Consults and Referrals", + "groupingBehavior": "logical-group", + "selectionBehavior": "any", + "actionDefinition": [ + { + "textEquivalent": "Refer to outpatient mental health program for evaluation and treatment of mental health conditions now", + "activityDefinition": { + "reference": "#referralToMentalHealthCare" + }, + "dynamicValue": [ + { + "path": "timing.event", + "expression": "Now()" + }, + { + "path": "specialty", + "expression": "Code '261QM0850X' from SuicideRiskLogic.\"NPI Taxonomy\"" + }, + { + "path": "fulfillmentTime", + "expression": "SuicideRiskLogic.ReferralRequestFulfillmentTime" + }, + { + "path": "patient", + "expression": "SuicideRiskLogic.Patient" + }, + { + "path": "requester", + "expression": "SuicideRiskLogic.Practitioner" + }, + { + "path": "reason", + "expression": "SuicideRiskLogic.RiskAssessmentScore" + }, + { + "path": "supportingInformation", + "expression": "SuicideRiskLogic.RiskAssessment" + } + ] + } + ] + }, + { + "title": "Medications", + "groupingBehavior": "logical-group", + "selectionBehavior": "at-most-one", + "actionDefinition": [ + { + "title": "First-Line Antidepressants", + "documentation": [ + { + "type": "justification", + "document": { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-qualityOfEvidence", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/evidence-quality", + "code": "high" + } + ], + "text": "High Quality" + } + } + ], + "contentType": "text/html", + "url": "http://psychiatryonline.org/pb/assets/raw/sitewide/practice_guidelines/guidelines/mdd.pdf", + "title": "Practice Guideline for the Treatment of Patients with Major Depressive Disorder" + } + } + ], + "groupingBehavior": "logical-group", + "selectionBehavior": "at-most-one", + "actionDefinition": [ + { + "title": "Selective Serotonin Reuptake Inhibitors (Choose a mazimum of one or document reasons for exception)", + "documentation": [ + { + "type": "justification", + "document": { + "contentType": "text/html", + "url": "http://dailymed.nlm.nih.gov/dailymed/drugInfo.cfm?setid=6daeb45c-451d-b135-bf8f-2d6dff4b6b01", + "title": "National Library of Medicine. DailyMed website. CITALOPRAM- citalopram hydrobromide tablet, film coated." + } + } + ], + "groupingBehavior": "logical-group", + "selectionBehavior": "at-most-one", + "actionDefinition": [ + { + "textEquivalent": "citalopram 20 mg tablet 1 tablet oral 1 time daily now (30 table; 3 refills)", + "activityDefinition": { + "reference": "#citalopramPrescription" + }, + "dynamicValue": [ + { + "path": "status", + "expression": "'draft'" + }, + { + "path": "patient", + "expression": "SuicideRiskLogic.Patient" + }, + { + "path": "prescriber", + "expression": "SuicideRiskLogic.Practitioner" + }, + { + "path": "reasonCode", + "expression": "SuicideRiskLogic.RiskAssessmentScore" + }, + { + "path": "reasonReference", + "expression": "SuicideRiskLogic.RiskAssessment" + } + ] + }, + { + "textEquivalent": "escitalopram 10 mg tablet 1 tablet oral 1 time daily now (30 tablet; 3 refills)" + }, + { + "textEquivalent": "fluoxetine 20 mg capsule 1 capsule oral 1 time daily now (30 tablet; 3 refills)" + }, + { + "textEquivalent": "paroxetine 20 mg tablet 1 tablet oral 1 time daily now (30 tablet; 3 refills)" + }, + { + "textEquivalent": "sertraline 50 mg tablet 1 tablet oral 1 time daily now (30 tablet; 3 refills)" + } + ] + }, + { + "textEquivalent": "Dopamine Norepinephrine Reuptake Inhibitors (Choose a maximum of one or document reasons for exception)" + }, + { + "textEquivalent": "Serotonin Norepinephrine Reuptake Inhibitors (Choose a maximum of one or doument reasons for exception)" + }, + { + "textEquivalent": "Norepinephrine-Serotonin Modulators (Choose a maximum of one or document reasons for exception)" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/plandefinition-example.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/plandefinition-example.json new file mode 100644 index 00000000000..503bf2dbbaa --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/plandefinition/plandefinition-example.json @@ -0,0 +1,64 @@ +{ + "resourceType": "PlanDefinition", + "id": "protocol-example", + "contained": [ + { + "resourceType": "ActivityDefinition", + "id": "procedure", + "status": "draft", + "description": "Extra information on activity ", + "category": "procedure", + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "39156-5", + "display": "Body mass index (BMI) [Ratio]" + } + ] + }, + "participantType": [ + "practitioner" + ] + } + ], + "identifier": [ + { + "system": "http://acme.org", + "value": "example-1" + } + ], + "title": "Obesity Assessment Protocol", + "type": { + "coding": [ + { + "code": "protocol" + } + ] + }, + "status": "draft", + "purpose": "Example of A medical algorithm for assessment and treatment of overweight and obesity", + "contributor": [ + { + "type": "author", + "name": "National Heart, Lung, and Blood Institute http://www.nhlbi.nih.gov/health-pro/guidelines/current/obesity-guidelines/e_textbook/txgd/algorthm/algorthm.htm" + } + ], + "actionDefinition": [ + { + "label": "Measure BMI", + "title": "Measure, Weight, Height, Waist, Circumference; Calculate BMI", + "description": "Weight must be measured so that the BMI can be calculated. Most charts are based on weights obtained with the patient wearing undergarments and no shoes. BMI can be manually calculated (kg/[height in meters]2), but is more easily obtained from a nomogram. Waist circumference is important because evidence suggests that abdominal fat is a particularly strong determinant of cardiovascular risk in those with a BMI of 25 to 34.9 kg/m2. Increased waist circumference can also be a marker of increased risk even in persons of normal weight. The technique for measuring waist circumference is described in the text. A nutrition assessment will also help to assess the diet and physical activity habits of overweight patients", + "condition": [ + { + "kind": "applicability", + "description": "The practitioner must seek to determine whether the patient has ever been overweight. While a technical definition is provided, a simple question such as 'Have you ever been overweight?' will accomplish the same goal. Questions directed towards weight history, dietary habits, physical activities, and medications may provide useful information about the origins of obesity in particular patients. For those who have not been overweight, a 2 year interval is appropriate for the reassessment of BMI. While this time span is not evidence-based, it is believed to be a reasonable compromise between the need to identify weight gain at an early stage and the need to limit the time, effort, and cost of repeated measurements.", + "expression": "Observation of Obesity or BMI Measured in Past 2 Years" + } + ], + "activityDefinition": { + "reference": "#procedure" + } + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/servicedefinition/AppropriateOrdering.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/servicedefinition/AppropriateOrdering.json new file mode 100644 index 00000000000..a663e78020e --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/servicedefinition/AppropriateOrdering.json @@ -0,0 +1,23 @@ +{ + "resourceType": "ServiceDefinition", + "id": "example", + "identifier": [ + { + "use": "official", + "value": "guildeline-appropriate-ordering" + } + ], + "version": "1.0.0", + "title": "Guideline Appropriate Ordering Module", + "status": "draft", + "date": "2015-07-22", + "description": "Guideline appropriate ordering is used to assess appropriateness of an order given a patient, a proposed order, and a set of clinical indications.", + "topic": [ + { + "text": "Guideline Appropriate Ordering" + }, + { + "text": "Appropriate Use Criteria" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/servicedefinition/InfoButton.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/servicedefinition/InfoButton.json new file mode 100644 index 00000000000..fafe6001eb4 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/examples/servicedefinition/InfoButton.json @@ -0,0 +1,38 @@ +{ + "resourceType": "ServiceDefinition", + "id": "infobutton", + "identifier": [ + { + "use": "official", + "value": "infobutton" + } + ], + "version": "1.0.0", + "title": "InfoButton Module", + "status": "draft", + "date": "2016-07-05", + "description": "The InfoButton specification defines a mechanism for retrieving relevant clinical context based a particular set of search criteria..", + "topic": [ + { + "text": "InfoButton Module" + }, + { + "text": "InfoButton" + } + ], + "dataRequirement": [ + { + "type": "Patient", + "mustSupport": [ + "gender", + "birthDate" + ] + }, + { + "type": "Condition" + }, + { + "type": "MedicationStatement" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/scratch.xml b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/scratch.xml new file mode 100644 index 00000000000..ba217580eba --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/scratch.xml @@ -0,0 +1,447 @@ + + + + +
+ + + + + + + +
+ Id: +
Library/mmi-suiciderisk-orderset-logic
+ + + + + + + +
+ Identifier: +
+ value: + SuicideRiskLogic +
+

+ + + + + + + +
+ Version: +
1.0.0
+

+ + + + + + + +
+ Title: +
Suicide Risk Order Set Logic
+

+ + + + + + + +
+ Type: +
+ + + + code: + logic-library + + + +
+

+ + + + + + + +
+ Status: +
draft
+

+ + + + + + + +
+ Description: +
Logic for Suicide Risk Order Sets
+

+ + + + + + + +
+ Topic: +
+ + text: + Suicide Risk Order Set Logic + +
+

+ + + + + + + +
+ Related: +
+

+ type: + depends-on +

+

+ Resource: +
+ + + reference: + Library/library-fhir-model-definition + + +

+
+ + + + + + + +
+ Related: +
+

+ type: + depends-on +

+

+ Resource: +
+ + + reference: + Library/library-fhir-helpers +
+
+ + display: + FHIRHelpers + +
+

+
+ + + + + + + +
+ Related: +
+

+ type: + depends-on +

+

+ Resource: +
+ + + reference: + CodeSystem/npi-taxonomy + + +

+
+ + + + + + + +
+ Related: +
+

+ type: + depends-on +

+

+ Resource: +
+ + + reference: + ValueSet/1.2.3.4.5 +
+
+ + display: + Suicide Risk Assessment + +
+

+
+ + + + + + + +
+ Parameter: +
+ + name: + Patient +
+
+ use: + in +
+ + minimum cardinality: + 1 +
+
+ + maximum cardinality: + 1 +
+
+ type: + Patient +
+

+

+ + + + + + + +
+ Parameter: +
+ + name: + Encounter +
+
+ use: + in +
+ + minimum cardinality: + 1 +
+
+ + maximum cardinality: + 1 +
+
+ type: + Encounter +
+

+

+ + + + + + + +
+ Parameter: +
+ + name: + Practitioner +
+
+ use: + in +
+ + minimum cardinality: + 1 +
+
+ + maximum cardinality: + 1 +
+
+ type: + Practitioner +
+

+

+ + + + + + + +
+ Data Requirements: +
+
+

+ type: + RiskAssessment +

+

+ code filter: +
+ + path: + code + +
+ + valueset: + Suicide Risk Assessment + +

+
+
+ + + + + + + +
+ Content: +
+

+ type: + text/cql +

+

+ url: + library-mmi-suiciderisk-orderset-logic-content.cql +

+
+

+

+
+ + + + + + + <type> + <coding> + <code value="logic-library"/> + </coding> + </type> + <status value="draft"/> + <date value="2015-07-22"/> + <description value="Logic for Suicide Risk Order Sets"/> + <topic> + <text value="Suicide Risk Order Set Logic"/> + </topic> + <relatedArtifact> + <type value="depends-on"/> + <resource> + <reference value="Library/library-fhir-model-definition"/> + </resource> + </relatedArtifact> + <relatedArtifact> + <type value="depends-on"/> + <resource> + <reference value="Library/library-fhir-helpers"/> + <display value="FHIRHelpers"/> + </resource> + </relatedArtifact> + <relatedArtifact> + <type value="depends-on"/> + <resource> + <reference value="CodeSystem/npi-taxonomy"/> + </resource> + </relatedArtifact> + <relatedArtifact> + <type value="depends-on"/> + <resource> + <reference value="ValueSet/1.2.3.4.5"/> + <display value="Suicide Risk Assessment"/> + </resource> + </relatedArtifact> + <parameter> + <name value="Patient"/> + <use value="in"/> + <min value="1"/> + <max value="1"/> + <type value="Patient"/> + </parameter> + <parameter> + <name value="Encounter"/> + <use value="in"/> + <min value="1"/> + <max value="1"/> + <type value="Encounter"/> + </parameter> + <parameter> + <name value="Practitioner"/> + <use value="in"/> + <min value="1"/> + <max value="1"/> + <type value="Practitioner"/> + </parameter> + <dataRequirement> + <type value="RiskAssessment"/> + <codeFilter> + <path value="code"/> + <valueSetString value="Suicide Risk Assessment"/> + </codeFilter> + </dataRequirement> + <content> + <contentType value="text/cql"/> + <url value="library-mmi-suiciderisk-orderset-logic-content.cql"/> + </content> +</Library> + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/actdefcomponent.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/actdefcomponent.html new file mode 100644 index 00000000000..e2478800f5c --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/actdefcomponent.html @@ -0,0 +1,100 @@ +<th:block th:fragment="actionDefFrag(actions, contained, num)"> + <span th:each="res : ${actions}" th:with="counter=${num}*25"> + <b>Step: </b> + <br/> + <span th:style="'padding-left: ' + ${#strings.concat(counter, 'px')} + ';'" th:if="${res.hasLabel()}"> + <b>name: </b> <span th:narrative="${res.label}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter, 'px')} + ';'" th:if="${res.hasTitle()}"> + <b>title: </b> <span th:narrative="${res.title}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter, 'px')} + ';'" th:if="${res.hasDescription()}"> + <b>description: </b> <span th:narrative="${res.description}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter, 'px')} + ';'" th:if="${res.hasTextEquivalent()}"> + <b>text: </b> <span th:narrative="${res.textEquivalent}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter, 'px')} + ';'" th:each="con : ${res.condition}"> + <b>condition: </b> + <br/> + <span th:style="'padding-left: ' + ${#strings.concat(counter+25, 'px')} + ';'"> + <b>type: </b> + <span th:narrative="${con.kind.toCode()}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter+25, 'px')} + ';'" th:if="${con.hasDescription()}"> + <b>description: </b> + <span th:narrative="${con.description}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter+25, 'px')} + ';'" th:if="${con.hasExpression()}"> + <b>expression: </b> + <span th:narrative="${con.expression}"></span> + <br/> + </span> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter, 'px')} + ';'" th:if="${res.hasActivityDefinition()}"> + <b>condition: </b> + <br/> + <span th:style="'padding-left: ' + ${#strings.concat(counter+25, 'px')} + ';'" th:if="${res.activityDefinition.hasReference()}"> + <b>reference: </b> + <br/> + <span th:style="'padding-left: ' + ${#strings.concat(counter+50, 'px')} + ';'" th:narrative="${res.activityDefinition.reference}"></span> + <br/> + <span th:style="'padding-left: ' + ${#strings.concat(counter+50, 'px')} + ';'" th:each="inline : ${contained}"> + <span th:if="${res.activityDefinition.reference.contains(inline.id)}"> + <span th:style="'padding-left: ' + ${#strings.concat(counter+75, 'px')} + ';'" th:if="${inline.hasName()}"> + <b>name: </b> + <span th:narrative="${inline.name}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter+75, 'px')} + ';'" th:if="${inline.hasTitle()}"> + <b>title: </b> + <span th:narrative="${inline.title}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter+75, 'px')} + ';'" th:if="${inline.hasDescription()}"> + <b>description: </b> + <span th:narrative="${inline.description}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter+75, 'px')} + ';'" th:if="${inline.hasPurpose()}"> + <b>purpose: </b> + <span th:narrative="${inline.purpose}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter+75, 'px')} + ';'" th:if="${inline.hasUsage()}"> + <b>usage: </b> + <span th:narrative="${inline.usage}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter+75, 'px')} + ';'" th:each="related : ${inline.relatedArtifact}"> + <b>related:</b> + <br/> + <span th:style="'padding-left: ' + ${#strings.concat(counter+100, 'px')} + ';'" > + <b>type: </b> + <span th:narrative="${related.type.toCode()}"></span> + <br/> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter+100, 'px')} + ';'" th:if="${related.hasDisplay()}"> + <b>display: </b> + <span th:narrative="${related.display}"></span> + <br/> + </span> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter+75, 'px')} + ';'" th:if="${inline.hasCategory()}"> + <b>category: </b> + <span th:narrative="${inline.category.toCode()}"></span> + <br/> + </span> + </span> + </span> + </span> + </span> + <span th:style="'padding-left: ' + ${#strings.concat(counter, 'px')} + ';'" th:insert="actiondefcomponent :: actionDefFrag(${res.actionDefinition}, ${contained}, ${num + 1})"></span> + </span> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/actiondefcomponent.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/actiondefcomponent.html new file mode 100644 index 00000000000..e116a2626ae --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/actiondefcomponent.html @@ -0,0 +1,87 @@ +<th:block th:fragment="actionDefFrag(actions, contained)"> + <tr th:each="res : ${actions}"> + <td><b>Step: </b></td> + <tr th:if="${res.hasLabel()}"> + <tr style="padding-left: 25px;"><b>name: </b></tr> + <tr th:narrative="${res.label}"></tr> + </tr> + <tr th:if="${res.hasTitle()}"> + <tr style="padding-left: 25px;"><b>title: </b></tr> + <tr th:narrative="${res.title}"></tr> + </tr> + <tr th:if="${res.hasDescription()}"> + <tr style="padding-left: 25px;"><b>description: </b></tr> + <tr th:narrative="${res.description}"></tr> + </tr> + <tr th:if="${res.hasTextEquivalent()}"> + <tr style="padding-left: 25px;"><b>text: </b></tr> + <tr th:narrative="${res.textEquivalent}"></tr> + </tr> + + <!-- Conditions --> + <tr style="padding-left: 25px;" th:each="con : ${res.condition}"> + <tr><td><b>condition: </b></td></tr> + <tr style="padding-left: 25px;"> + <td><b>type: </b></td> + <td th:narrative="${con.kind.toCode()}"></td> + </tr> + <tr style="padding-left: 25px;" th:if="${con.hasDescription()}"> + <td><b>description: </b></td> + <td th:narrative="${con.description}"></td> + </tr> + <tr style="padding-left: 25px;" th:if="${con.hasExpression()}"> + <td><b>expression: </b></td> + <td th:narrative="${con.expression}"></td> + </tr> + </tr> + + <!-- Activity Definitions --> + <td style="padding-left: 25px;" th:if="${res.hasActivityDefinition()}"> + <b>condition: </b> + <tr style="padding-left: 25px;" th:if="${res.activityDefinition.hasReference()}"> + <b>reference: </b> + <td th:narrative="${res.activityDefinition.reference}"></td> + <td th:each="inline : ${contained}"> + <tr style="padding-left: 25px;" th:if="${res.activityDefinition.reference.contains(inline.id)}"> + <tr th:if="${inline.hasName()}"> + <b>name: </b> + <td th:narrative="${inline.name}"></td> + </tr> + <tr th:if="${inline.hasTitle()}"> + <b>title: </b> + <td th:narrative="${inline.title}"></td> + </tr> + <tr th:if="${inline.hasDescription()}"> + <b>description: </b> + <td th:narrative="${inline.description}"></td> + </tr> + <tr th:if="${inline.hasPurpose()}"> + <b>purpose: </b> + <td th:narrative="${inline.purpose}"></td> + </tr> + <tr th:if="${inline.hasUsage()}"> + <b>usage: </b> + <td th:narrative="${inline.usage}"></td> + </tr> + <tr th:each="related : ${inline.relatedArtifact}"> + <b>related:</b> + <tr style="padding-left: 25px;"> + <b>type: </b> + <td th:narrative="${related.type.toCode()}"></td> + </tr> + <tr style="padding-left: 25px;" th:if="${related.hasDisplay()}"> + <b>display: </b> + <td th:narrative="${related.display}"></td> + </tr> + </tr> + <tr th:if="${inline.hasCategory()}"> + <b>category: </b> + <td th:narrative="${inline.category.toCode()}"></td> + </tr> + </tr> + </td> + </tr> + </td> + <td style="padding-left: 25px;" th:include="actiondefcomponent :: actionDefFrag(${res.actionDefinition}, ${contained})"></td> + </tr> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/activitydefinition.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/activitydefinition.html new file mode 100644 index 00000000000..9c532dd4870 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/activitydefinition.html @@ -0,0 +1,236 @@ +<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> + + <table th:if="${resource.hasId()}" class="grid dict"> + <tr> + <td><b>Id: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.id}"></td> + </tr> + </table> + + <p th:if="${resource.hasId() and not resource.hasIdentifier()}"></p> + + <table th:each="ident : ${resource.identifier}" class="grid dict"> + <tr> + <td><br/><b>Identifier: </b></td> + </tr> + <tr th:if="${ident.hasSystem()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>system: </b> <span th:narrative="${ident.system}"></span> + </td> + </tr> + <tr th:if="${ident.hasValue()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>value: </b> <span th:narrative="${ident.value}"></span> + </td> + </tr> + </table> + + <p th:if="${resource.hasIdentifier()}"></p> + + <table th:if="${resource.hasTitle()}" class="grid dict"> + <tr> + <td><b>Title: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.title}"></td> + </tr> + </table> + + <p th:if="${resource.hasTitle()}"></p> + + <table class="grid dict"> + <tr> + <td><b>Status: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.status.toCode()}"></td> + </tr> + </table> + + <p></p> + + <table th:if="${resource.hasDescription()}" class="grid dict"> + <tr> + <td><b>Description: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.description}"></td> + </tr> + </table> + + <p th:if="${resource.hasDescription()}"></p> + + <table th:if="${resource.hasPurpose()}" class="grid dict"> + <tr> + <td><b>Purpose: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.purpose}"></td> + </tr> + </table> + + <p th:if="${resource.hasPurpose()}"></p> + + <table th:if="${resource.hasUsage()}" class="grid dict"> + <tr> + <td><b>Usage: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.usage}"></td> + </tr> + </table> + + <p th:if="${resource.hasUsage()}"></p> + + <table th:each="context : ${resource.useContext}" class="grid dict"> + <tr> + <td><b>Use Context: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${context}"></td> + </tr> + </table> + + <p th:if="${resource.hasUseContext()}"></p> + + <table th:each="topics : ${resource.topic}" class="grid dict"> + <tr> + <td><b>Topic: </b></td> + </tr> + <tr> + <td style="padding-right: 25px;" th:narrative="${topics}"></td> + </tr> + </table> + + <p th:if="${resource.hasTopic()}"></p> + + <table th:each="cont : ${resource.contributor}" class="grid dict"> + <tr> + <td><b>Contributor: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;"><b><span th:narrative="${cont.type.toCode()}"></span>: </b></td> + </tr> + <tr> + <td style="padding-left: 50px; padding-right: 25px;" th:narrative="${cont.name}"></td> + </tr> + </table> + + <p th:if="${resource.hasContributor()}"></p> + + <table th:each="related : ${resource.relatedArtifact}" class="grid dict"> + <tr> + <td><b>Related: </b></td> + </tr> + <tr style="vertical-align: top;"> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${related}"></td> + </tr> + </table> + + <p th:if="${resource.hasRelatedArtifact()}"></p> + + <table th:each="lib : ${resource.library}" class="grid dict"> + <tr> + <td><b>Library: </b></td> + </tr> + <tr th:if="${lib.hasReference()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>reference: </b> + <span th:narrative="${lib.reference}"></span> + </td> + </tr> + <tr th:if="${lib.hasIdentifier()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>identifier: </b> + <span th:narrative="${lib.identifier}"></span> + </td> + </tr> + <tr th:if="${lib.hasDisplay()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>display: </b> + <span th:narrative="${lib.display}"></span> + </td> + </tr> + </table> + + <p th:if="${resource.hasLibrary()}"></p> + + <table th:if="${resource.hasCategory()}" class="grid dict"> + <tr> + <td><b>Category: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.category.toCode()}"></td> + </tr> + </table> + + <p th:if="${resource.hasCategory()}"></p> + + <table th:if="${resource.hasCode()}" class="grid dict"> + <tr> + <td><b>Code: </b></td> + </tr> + <tr> + <td style="padding-right: 25px;" th:narrative="${resource.code}"></td> + </tr> + </table> + + <p th:if="${resource.hasCode()}"></p> + + <table th:if="${resource.hasTimingCodeableConcept()}" class="grid dict"> + <tr> + <td><b>Timing: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.timingCodeableConcept}"></td> + </tr> + </table> + + <p th:if="${resource.hasTimingCodeableConcept()}"></p> + + <table th:if="${resource.hasLocation()}" class="grid dict"> + <tr> + <td><b>Location: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.location}"></td> + </tr> + </table> + + <p th:if="${resource.hasLocation()}"></p> + + <table th:each="participant : ${resource.participantType}" class="grid dict"> + <tr> + <td><b>Participant: </b></td> + </tr> + <tr style="vertical-align: top;"> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${participant.getValue().toCode()}"></td> + </tr> + </table> + + <p th:if="${resource.hasParticipantType()}"></p> + + <table th:if="${resource.hasProductCodeableConcept()}" class="grid dict"> + <tr> + <td><b>Product Concept: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.productCodeableConcept}"></td> + </tr> + </table> + + <p th:if="${resource.hasProductCodeableConcept()}"></p> + + <table th:if="${resource.hasQuantity()}" class="grid dict"> + <tr> + <td><b>Quantity: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.quantity}"></td> + </tr> + </table> + + <p th:if="${resource.hasQuantity()}"></p> +</div> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/attachment.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/attachment.html new file mode 100644 index 00000000000..7cad83e85b1 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/attachment.html @@ -0,0 +1,18 @@ +<th:block th:if="${not resource.empty}"> + <p style="margin-bottom: 5px;" th:if="${resource.hasTitle()}"> + <b>title: </b> + <span th:narrative="${resource.title}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${resource.hasContentType()}"> + <b>type: </b> + <span th:narrative="${resource.contentType}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${resource.hasLanguage()}"> + <b>language: </b> + <span th:narrative="${resource.language}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${resource.hasUrl()}"> + <b>url: </b> + <span th:narrative="${resource.url}"></span> + </p> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/codeableconcept.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/codeableconcept.html new file mode 100644 index 00000000000..5110a0f760d --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/codeableconcept.html @@ -0,0 +1,10 @@ +<th:block th:if="${not resource.empty}"> + <span style="padding-left: 25px;" th:if="${resource.hasText()}"> + <b>text: </b> + <span th:text="${resource.text}"></span> + </span> + <span th:each="codings : ${resource.coding}"> + <br th:if="${resource.hasText()}" /> + <span th:narrative="${codings}"></span> + </span> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/coding.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/coding.html new file mode 100644 index 00000000000..61db48ea157 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/coding.html @@ -0,0 +1,16 @@ +<th:block th:if="${not resource.empty}"> + <span style="padding-left: 25px;" th:if="${resource.hasSystem()}"> + <b>system: </b> + <span th:text="${resource.system}"></span> + <br th:if="${resource.hasCode() or resource.hasDisplay()}" /> + </span> + <span style="padding-left: 25px;" th:if="${resource.hasCode()}"> + <b>code: </b> + <span th:text="${resource.code}"></span> + <br th:if="${resource.hasDisplay()}" /> + </span> + <span style="padding-left: 25px;" th:if="${resource.hasDisplay()}"> + <b>display: </b> + <span th:text="${resource.display}"></span> + </span> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/datarequirement.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/datarequirement.html new file mode 100644 index 00000000000..a19e3218217 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/datarequirement.html @@ -0,0 +1,88 @@ +<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> + <p style="margin-bottom: 5px;" th:if="${resource.hasId()}"> + <b>id: </b> + <span th:narrative="${resource.id}"></span> + </p> + + <p style="margin-bottom: 5px;"> + <b>type: </b> + <span th:narrative="${resource.type}"></span> + </p> + + <p style="margin-bottom: 5px;" th:each="pro : ${resource.profile}"> + <b>profile: </b> + <span th:narrative="${pro}"></span> + </p> + + <p style="margin-bottom: 5px;" th:each="must : ${resource.mustSupport}"> + <b>must support: </b> + <span th:narrative="${must}"></span> + </p> + + <p style="margin-bottom: 5px;" th:each="cFilter : ${resource.codeFilter}"> + <b>code filter:</b> + <br/> + <span style="padding-left: 25px;"> + <b>path: </b> + <span th:narrative="${cFilter.path}"></span> + </span> + <br th:if="${cFilter.hasValueSetStringType() or cFilter.hasValueSetReference()}" /> + <span style="padding-left: 25px;" th:if="${cFilter.hasValueSetStringType()}"> + <b>valueset: </b> + <span th:narrative="${cFilter.valueSetStringType}"></span> + </span> + <span style="padding-left: 25px;" th:if="${cFilter.hasValueSetReference()}"> + <b>valueset: </b> + <span th:narrative="${cFilter.valueSetReference}"></span> + </span> + <br th:if="${cFilter.hasValueCode()}" /> + <span style="padding-left: 25px;" th:each="codes : ${cFilter.valueCode}"> + <b>code:</b> + <span th:narrative="${codes}"></span> + </span> + <br th:if="${cFilter.hasValueCoding()}" /> + <span style="padding-left: 25px;" th:each="codings : ${cFilter.valueCoding}"> + <br /> + <b>coding:</b> + <span style="padding-left: 25px;" th:narrative="${codings}"></span> + </span> + <br th:if="${cFilter.hasValueCodeableConcept()}" /> + <span style="padding-left: 25px;" th:each="concepts : ${cFilter.valueCodeableConcept}"> + <b>concept:</b> + <span style="padding-left: 25px;" th:narrative="${concepts}"></span> + </span> + </p> + + <p style="margin-bottom: 5px;" th:each="dFilter : ${resource.dateFilter}"> + <b>date filter:</b> + <span style="padding-left: 25px;"> + <b>path: </b> + <span th:narrative="${dFilter.path}"></span> + </span> + <br/> + <span th:if="${dFilter.hasValueDateTime()}"> + <b>date time: </b> + <span th:narrative="${dFilter.valueDateTime}"></span> + </span> + <span th:if="${dFilter.hasValuePeriod()}"> + <b>date period: </b> + <span style="padding-left: 25px;" th:if="${dFilter.valuePeriod.hasStart()}"> + <br/> + <b>start: </b> + <span th:narrative="${dFilter.valuePeriod.start}"></span> + </span> + <span style="padding-left: 25px;" th:if="${dFilter.valuePeriod.hasEnd()}"> + <b>end: </b> + <span th:narrative="${dFilter.valuePeriod.end}"></span> + </span> + </span> + <span th:if="${dFilter.hasValueDuration()}"> + <b>date duration: </b> + <br/> + <span style="padding-left: 25px;"> + <b>duration: </b> + <span th:narrative="${dFilter.valueDuration}"></span> + </span> + </span> + </p> +</div> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/date.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/date.html new file mode 100644 index 00000000000..dde58ed17b0 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/date.html @@ -0,0 +1 @@ +<th:block th:text="${resource.toString()}" /> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/guidanceresponse.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/guidanceresponse.html new file mode 100644 index 00000000000..35ea2973242 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/guidanceresponse.html @@ -0,0 +1,36 @@ +<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> + <!-- INVALID - NEEDS WORK --> + <div th:if="${resource.hasId()}"> + <b>id: </b> + <span th:narrative="${resource.id}"></span> + </div> + + <br th:if="${resource.hasId()}" /> + + <div th:if="${resource.hasRequestId()}"> + <b>request id: </b> + <span th:narrative="${resource.requestId}"></span> + </div> + + <br th:if="${resource.hasRequestId()}" /> + + <div th:each="ident : ${resource.identifier}"> + <span th:narrative="${ident}"></span> + </div> + + <br th:if="${resource.hasIdentifier()}" /> + + <div> + <b>reference to knowledge module: </b> + <div style="padding-left: 25px;" th:narrative="${resource.module}"></div> + </div> + + <br /> + + <div> + <b>status: </b> + <span th:narrative="${resource.status.toCode()}"></span> + </div> + + <br /> +</div> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/identifier.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/identifier.html new file mode 100644 index 00000000000..b3d02f77c18 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/identifier.html @@ -0,0 +1,12 @@ +<th:block th:if="${not resource.empty}"> + <b>Identifier:</b> + <br/> + <span style="padding-left: 25px;" th:if="${resource.hasSystem()}"> + <b>system: </b> <span th:narrative="${resource.system}"></span> + <br/> + </span> + <span style="padding-left: 25px;" th:if="${resource.hasValue()}"> + <b>value: </b> <span th:narrative="${resource.value}"></span> + <br/> + </span> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/integer.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/integer.html new file mode 100644 index 00000000000..dde58ed17b0 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/integer.html @@ -0,0 +1 @@ +<th:block th:text="${resource.toString()}" /> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/library.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/library.html new file mode 100644 index 00000000000..d39c9e07e2c --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/library.html @@ -0,0 +1,215 @@ +<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> + + <table th:if="${resource.hasId()}" class="grid dict"> + <tr> + <td><b>Id: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.id}"></td> + </tr> + </table> + + <p th:if="${resource.hasId() and not resource.hasIdentifier()}"></p> + + <table th:each="ident : ${resource.identifier}" class="grid dict"> + <tr> + <td><b>Identifier: </b></td> + </tr> + <tr th:if="${ident.hasSystem()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>system: </b> <span th:narrative="${ident.system}"></span> + </td> + </tr> + <tr th:if="${ident.hasValue()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>value: </b> <span th:narrative="${ident.value}"></span> + </td> + </tr> + </table> + + <p th:if="${resource.hasIdentifier()}"></p> + + <table th:if="${resource.hasVersion()}" class="grid dict"> + <tr> + <td><b>Version: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.version}"></td> + </tr> + </table> + + <p th:if="${resource.hasVersion()}"></p> + + <table th:if="${resource.hasTitle()}" class="grid dict"> + <tr> + <td><b>Title: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.title}"></td> + </tr> + </table> + + <p th:if="${resource.hasTitle()}"></p> + + <table class="grid dict"> + <tr> + <td><b>Type: </b></td> + </tr> + <tr> + <td style="padding-right: 25px;" th:narrative="${resource.type}"></td> + </tr> + </table> + + <p></p> + + <table th:if="${not resource.status.toCode().empty}" class="grid dict"> + <tr> + <td><b>Status: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.status.toCode()}"></td> + </tr> + </table> + + <p th:if="${not resource.status.toCode().empty}"></p> + + <table th:if="${resource.hasDescription()}" class="grid dict"> + <tr> + <td><b>Description: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.description}"></td> + </tr> + </table> + + <p th:if="${resource.hasDescription()}"></p> + + <table th:if="${resource.hasPurpose()}" class="grid dict"> + <tr> + <td><b>Purpose: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.purpose}"></td> + </tr> + </table> + + <p th:if="${resource.hasPurpose()}"></p> + + <table th:if="${resource.hasUsage()}" class="grid dict"> + <tr> + <td><b>Usage: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.usage}"></td> + </tr> + </table> + + <p th:if="${resource.hasUsage()}"></p> + + <table th:each="context : ${resource.useContext}" class="grid dict"> + <tr> + <td><b>Use Context: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${context}"></td> + </tr> + </table> + + <p th:if="${resource.hasUseContext()}"></p> + + <table th:each="topics : ${resource.topic}" class="grid dict"> + <tr> + <td><b>Topic: </b></td> + </tr> + <tr> + <td style="padding-right: 25px;" th:narrative="${topics}"></td> + </tr> + </table> + + <p th:if="${resource.hasTopic()}"></p> + + <table th:each="cont : ${resource.contributor}" class="grid dict"> + <tr> + <td><b>Contributor: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;"><b><span th:narrative="${cont.type.toCode()}"></span>: </b></td> + </tr> + <tr> + <td style="padding-left: 50px; padding-right: 25px;" th:narrative="${cont.name}"></td> + </tr> + </table> + + <p th:if="${resource.hasContributor()}"></p> + + <table th:each="related : ${resource.relatedArtifact}" class="grid dict"> + <tr> + <td><b>Related: </b></td> + </tr> + <tr style="vertical-align: top;"> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${related}"></td> + </tr> + </table> + + <table th:each="param : ${resource.parameter}" class="grid dict"> + <tr> + <td><b>Parameter: </b></td> + </tr> + <tr style="vertical-align: top;"> + <td style="padding-left: 25px; padding-right: 25px;"> + <span th:if="${param.hasName()}"> + <b>name: </b> + <span th:narrative="${param.name}"></span> + <br/> + </span> + <b>use: </b> + <span th:narrative="${param.use.toCode()}"></span> + <br/> + <span th:if="${param.hasMin()}"> + <b>minimum cardinality: </b> + <span th:narrative="${param.min}"></span> + <br/> + </span> + <span th:if="${param.hasMax()}"> + <b>maximum cardinality: </b> + <span th:narrative="${param.max}"></span> + <br/> + </span> + <b>type: </b> + <span th:narrative="${param.type}"></span> + <br/> + <span th:if="${param.hasDocumentation()}"> + <b>documentation: </b> + <span th:narrative="${param.documentation}"></span> + <br/> + </span> + <span th:if="${param.hasProfile()}"> + <b>profile: </b> + <span th:narrative="${param.profile}"></span> + <br/> + </span> + <p style="margin-bottom: 5px;"></p> + </td> + </tr> + </table> + + <table th:each="dataReq : ${resource.dataRequirement}" class="grid dict"> + <tr> + <td><b>Data Requirements: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${dataReq}"></td> + </tr> + </table> + + <table th:each="con : ${resource.content}" class="grid dict"> + <tr> + <td><b>Content: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${con}"></td> + </tr> + </table> + + <p th:if="${resource.hasContent()}"></p> +</div> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/measure.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/measure.html new file mode 100644 index 00000000000..625e26f5e10 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/measure.html @@ -0,0 +1,363 @@ +<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> + <table th:if="${resource.hasId()}" class="grid dict"> + <tr> + <td><b>Id: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.id}"></td> + </tr> + </table> + + <p th:if="${resource.hasId()}"></p> + + <table th:each="ident : ${resource.identifier}" class="grid dict"> + <tr> + <td><b>Identifier: </b></td> + </tr> + <tr th:if="${ident.hasSystem()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>system: </b> <span th:narrative="${ident.system}"></span> + </td> + </tr> + <tr th:if="${ident.hasValue()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>value: </b> <span th:narrative="${ident.value}"></span> + </td> + </tr> + </table> + + <p th:if="${resource.hasIdentifier()}"></p> + + <table th:if="${resource.hasTitle()}" class="grid dict"> + <tr> + <td><b>Title: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.title}"></td> + </tr> + </table> + + <p th:if="${resource.hasTitle()}"></p> + + <table th:if="${resource.hasStatus()}" class="grid dict"> + <tr> + <td><b>Status: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.status.toCode()}"></td> + </tr> + </table> + + <p th:if="${resource.hasStatus()}"></p> + + <table th:if="${resource.hasDescription()}" class="grid dict"> + <tr> + <td><b>Description: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.description}"></td> + </tr> + </table> + + <p th:if="${resource.hasDescription()}"></p> + + <table th:if="${resource.hasPurpose()}" class="grid dict"> + <tr> + <td><b>Purpose: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.purpose}"></td> + </tr> + </table> + + <p th:if="${resource.hasPurpose()}"></p> + + <table th:if="${resource.hasUsage()}" class="grid dict"> + <tr> + <td><b>Usage: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.usage}"></td> + </tr> + </table> + + <p th:if="${resource.hasUsage()}"></p> + + <table th:each="context : ${resource.useContext}" class="grid dict"> + <tr> + <td><b>Use Context: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${context}"></td> + </tr> + </table> + + <p th:if="${resource.hasUseContext()}"></p> + + <table th:each="topics : ${resource.topic}" class="grid dict"> + <tr> + <td><b>Topic: </b></td> + </tr> + <tr> + <td style="padding-right: 25px;" th:narrative="${topics}"></td> + </tr> + </table> + + <p th:if="${resource.hasTopic()}"></p> + + <table th:each="cont : ${resource.contributor}" class="grid dict"> + <tr> + <td><b>Contributor: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;"><b><span th:narrative="${cont.type.toCode()}"></span>: </b></td> + </tr> + <tr> + <td style="padding-left: 50px; padding-right: 25px;" th:narrative="${cont.name}"></td> + </tr> + </table> + + <p th:if="${resource.hasContributor()}"></p> + + <table th:each="related : ${resource.relatedArtifact}" class="grid dict"> + <tr> + <td><b>Related: </b></td> + </tr> + <tr style="vertical-align: top;"> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${related}"></td> + </tr> + </table> + + <p th:if="${resource.hasRelatedArtifact()}"></p> + + <table th:each="lib : ${resource.library}" class="grid dict"> + <tr> + <td><b>Library: </b></td> + </tr> + <tr th:if="${lib.hasReference()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>reference: </b> + <span th:narrative="${lib.reference}"></span> + </td> + </tr> + <tr th:if="${lib.hasIdentifier()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>identifier: </b> + <span th:narrative="${lib.identifier}"></span> + </td> + </tr> + <tr th:if="${lib.hasDisplay()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>display: </b> + <span th:narrative="${lib.display}"></span> + </td> + </tr> + </table> + + <p th:if="${resource.hasLibrary()}"></p> + + <table th:if="${resource.hasDisclaimer()}" class="grid dict"> + <tr> + <td><b>Disclaimer: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.disclaimer}"></td> + </tr> + </table> + + <p th:if="${resource.hasDisclaimer()}"></p> + + <table th:if="${resource.hasScoring()}" class="grid dict"> + <tr> + <td><b>Scoring: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.scoring.toCode()}"></td> + </tr> + </table> + + <p th:if="${resource.hasScoring()}"></p> + + <table th:if="${resource.hasCompositeScoring()}" class="grid dict"> + <tr> + <td><b>Composite Scoring: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.compositeScoring.toCode()}"></td> + </tr> + </table> + + <p th:if="${resource.hasCompositeScoring()}"></p> + + <table th:each="types : ${resource.type}" class="grid dict"> + <tr> + <td><b>Type: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${types.getValue().toCode()}"></td> + </tr> + </table> + + <p th:if="${not resource.type.empty}"></p> + + <table th:if="${resource.hasRiskAdjustment()}" class="grid dict"> + <tr> + <td><b>Risk Adjustment: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.riskAdjustment}"></td> + </tr> + </table> + + <p th:if="${resource.hasRiskAdjustment()}"></p> + + <table th:if="${resource.hasRateAggregation()}" class="grid dict"> + <tr> + <td><b>Rate Aggregation: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.rateAggregation}"></td> + </tr> + </table> + + <p th:if="${resource.hasRateAggregation()}"></p> + + <table th:if="${resource.hasRationale()}" class="grid dict"> + <tr> + <td><b>Rationale: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.rationale}"></td> + </tr> + </table> + + <p th:if="${resource.hasRationale()}"></p> + + <table th:if="${resource.hasClinicalRecommendationStatement()}" class="grid dict"> + <tr> + <td><b>Clinical Recommendation: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.clinicalRecommendationStatement}"></td> + </tr> + </table> + + <p th:if="${resource.hasClinicalRecommendationStatement()}"></p> + + <table th:if="${resource.hasDefinition()}" class="grid dict"> + <tr> + <td><b>Definition: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.definition}"></td> + </tr> + </table> + + <p th:if="${resource.hasDefinition()}"></p> + + <table th:if="${resource.hasGuidance()}" class="grid dict"> + <tr> + <td><b>Guidance: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.guidance}"></td> + </tr> + </table> + + <p th:if="${resource.hasGuidance()}"></p> + + <table th:if="${resource.hasSet()}" class="grid dict"> + <tr> + <td><b>Set: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.set}"></td> + </tr> + </table> + + <p th:if="${resource.hasSet()}"></p> + + <table th:each="groups : ${resource.group}" class="grid dict"> + <tr> + <td><b>Group:</b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${groups.identifier}"></td> + </tr> + <tr th:if="${groups.hasName()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>name: </b> + <span th:narrative="${groups.name}"></span> + </td> + </tr> + <tr th:if="${groups.hasDescription()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>description: </b> + <span th:narrative="${groups.description}"></span> + </td> + </tr> + <tr th:each="pops : ${groups.population}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>Population:</b> + <br/> + <p style="margin-bottom: 5px; padding-left: 25px;"> + <b>type:</b> + <span th:narrative="${pops.type.toCode()}"></span> + </p> + <p style="margin-bottom: 5px; padding-left: 25px;" th:narrative="${pops.identifier}"></p> + <p style="margin-bottom: 5px; padding-left: 25px;" th:if="${pops.hasName()}"> + <b>name: </b> + <span th:narrative="${pops.name}"></span> + </p> + <p style="margin-bottom: 5px; padding-left: 25px;" th:if="${pops.hasDescription()}"> + <b>description: </b> + <span th:narrative="${pops.description}"></span> + </p> + <p style="margin-bottom: 5px; padding-left: 25px;"> + <b>criteria: </b> + <span th:narrative="${pops.criteria}"></span> + </p> + </td> + </tr> + <tr th:each="strats : ${groups.stratifier}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>Stratifier:</b> + <br/> + <p style="padding-left: 25px; margin-bottom: 5px;" th:narrative="${strats.identifier}"></p> + <p style="margin-bottom: 5px; padding-left: 25px;" th:if="${strats.hasCriteria()}"> + <b>criteria: </b> + <span th:narrative="${strats.criteria}"></span> + </p> + <p style="margin-bottom: 5px; padding-left: 25px;" th:if="${strats.hasPath()}"> + <b>path: </b> + <span th:narrative="${strats.path}"></span> + </p> + </td> + </tr> + </table> + + <p th:if="${resource.hasGroup()}"></p> + + <table th:each="supples : ${resource.supplementalData}" class="grid dict"> + <tr> + <td><b>Supplemental Data:</b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;"> + <p style="margin-bottom: 5px;" th:narrative="${supples.identifier}"></p> + <p style="margin-bottom: 5px;" th:each="uses : ${supples.usage}"> + <b>usage: </b> + <span th:narrative="${uses.getValue().toCode()}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${supples.hasCriteria()}"> + <b>criteria: </b> + <span th:narrative="${supples.criteria}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${supples.hasPath()}"> + <b>path: </b> + <span th:narrative="${supples.path}"></span> + </p> + </td> + </tr> + </table> +</div> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/measurereport.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/measurereport.html new file mode 100644 index 00000000000..6f441653880 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/measurereport.html @@ -0,0 +1,226 @@ +<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> + + <table th:if="${resource.hasId()}" class="grid dict"> + <tr> + <td><b>Id: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.id}"></td> + </tr> + </table> + + <p th:if="${resource.hasId()}"></p> + + <table class="grid dict"> + <tr> + <td><b>Measure: </b></td> + </tr> + <tr> + <td style="padding-right: 25px;" th:narrative="${resource.measure}"></td> + </tr> + </table> + + <p></p> + + <table class="grid dict"> + <tr> + <td><b>Type: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.type.toCode()}"></td> + </tr> + </table> + + <p></p> + + <table th:if="${resource.hasPatient()}" class="grid dict"> + <tr> + <td><b>Patient: </b></td> + </tr> + <tr> + <td style="padding-right: 25px;" th:narrative="${resource.patient}"></td> + </tr> + </table> + + <p th:if="${resource.hasPatient()}"></p> + + <table class="grid dict"> + <tr> + <td><b>Period: </b></td> + </tr> + <tr th:if="${resource.period.hasStart()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>start: </b> + <span th:narrative="${resource.period.start}"></span> + </td> + </tr> + <tr th:if="${resource.period.hasEnd()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>end: </b> + <span th:narrative="${resource.period.end}"></span> + </td> + </tr> + </table> + + <p></p> + + <table class="grid dict"> + <tr> + <td><b>Status: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.status.toCode()}"></td> + </tr> + </table> + + <p></p> + + <table th:if="${resource.hasReportingOrganization()}" class="grid dict"> + <tr> + <td><b>Reporting Organization: </b></td> + </tr> + <tr th:if="${resource.reportingOrganization.hasReference()}"> + <td style="padding-left: 25px; padding-right: 25px;" th:if="${resource.reportingOrganization.reference.contains("#")}"> + <p style="margin-bottom: 5px;" th:each="contain : ${resource.contained}"> + <span th:if="${resource.reportingOrganization.reference.contains(contain.id) and contain.hasName()}"> + <b>name: </b> + <span th:narrative="${contain.name}"></span> + </span> + </p> + </td> + <td style="padding-left: 25px; padding-right: 25px;" th:unless="${resource.reportingOrganization.reference.contains("#")}"> + <p style="margin-bottom: 5px;" th:narrative="${resource.reportingOrganization.reference}"></p> + </td> + </tr> + </table> + + <table th:each="group1 : ${resource.group}" class="grid dict"> + <tr> + <td><b>Group:</b></td> + </tr> + <tr th:each="ident : ${group1.identifier}"> + <td style="padding-left: 25px;"> + <p style="margin-bottom: 5px;" th:if="${ident.hasSystem()}"> + <b>system: </b> + <span th:narrative="${ident.system}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${ident.hasValue()}"> + <b>value: </b> + <span th:narrative="${ident.value}"></span> + </p> + </td> + </tr> + <tr th:each="pop : ${group1.population}"> + <td style="padding-left: 25px;"> + <b>Population:</b> + <p style="padding-left: 25px; margin-bottom: 5px;"> + <b>type: </b> + <span th:narrative="${pop.type}"></span> + </p> + <p style="padding-left: 25px; margin-bottom: 5px;" th:if="${pop.hasCount()}"> + <b>count: </b> + <span th:narrative="${pop.count}"></span> + </p> + <p style="padding-left: 25px; margin-bottom: 5px;" th:if="${pop.hasPatients()}"> + <b>patients: </b> + <br/> + <span th:narrative="${pop.patients}"></span> + </p> + </td> + </tr> + <tr th:if="${group1.hasMeasureScore()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>Measure Score: </b> + <span th:narrative="${group1.measureReport}"></span> + </td> + </tr> + <tr th:each="strats : ${group1.stratifier}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>Stratifier:</b> + <p style="padding-left: 25px; margin-bottom: 5px;" th:each="ident : ${group1.identifier}"> + <span th:if="${ident.hasSystem()}"> + <b>system: </b> + <span th:narrative="${ident.system}"></span> + <br/> + </span> + <span th:if="${ident.hasValue()}"> + <b>value: </b> + <span th:narrative="${ident.value}"></span> + </span> + </p> + <p style="padding-left: 25px; margin-bottom: 5px;" th:each="group2 : ${strats.group}"> + <b>Group:</b> + <br/> + <span style="padding-left: 25px;"><b>value: </b></span> + <span th:narrative="${group2.value}"></span> + <br/> + <span th:each="pops : ${group2.population}"> + <span style="padding-left: 25px;"><b>Population:</b></span> + <br/> + <span style="padding-left: 50px;"><b>type: </b></span> + <span th:narrative="${pops.type}"></span> + <span th:if="${pops.hasCount()}"> + <br/> + <span style="padding-left: 50px;"><b>count: </b></span> + <span th:narrative="${pops.count}"></span> + </span> + <span th:if="${pops.hasPatients()}"> + <br/> + <span style="padding-left: 50px;"><b>patients: </b></span> + <br/> + <span style="padding-left: 50px;" th:narrative="${pops.patients}"></span> + </span> + <br/> + </span> + </p> + </td> + </tr> + <tr th:each="supples : ${group1.supplementalData}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>Supplemental:</b> + <p style="padding-left: 25px; margin-bottom: 5px;" th:each="ident : ${supples.identifier}"> + <span th:if="${ident.hasSystem()}"> + <b>system: </b> + <span th:narrative="${ident.system}"></span> + <br/> + </span> + <span th:if="${ident.hasValue()}"> + <b>value: </b> + <span th:narrative="${ident.value}"></span> + </span> + </p> + <p style="padding-left: 25px; margin-bottom: 5px;" th:each="group3 : ${supples.group}"> + <b>Group:</b> + <br/> + <span style="padding-left: 25px;"><b>value: </b></span> + <span th:narrative="${group3.value}"></span> + <span th:if="${group3.hasCount()}"> + <br/> + <span style="padding-left: 25px;"><b>count: </b></span> + <span th:narrative="${group3.count}"></span> + </span> + <span th:if="${group3.hasPatients()}"> + <br/> + <span style="padding-left: 25px;"><b>patients: </b></span> + <br/> + <span style="padding-left: 25px;" th:narrative="${group3.patients}"></span> + </span> + </p> + </td> + </tr> + </table> + + <p th:if="${resource.hasGroup()}"></p> + + <table th:if="${resource.hasEvaluatedResources()}" class="grid dict"> + <tr> + <td> + <b>Evaluated Resources: </b> + </td> + </tr> + <tr> + <td style="padding-right: 25px;" th:narrative="${resource.evaluatedResources}"></td> + </tr> + </table> + +</div> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/medication.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/medication.html new file mode 100644 index 00000000000..e0d28322817 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/medication.html @@ -0,0 +1,36 @@ +<th:block th:if="${not resource.empty}"> + <!-- INVALID - NEEDS WORK --> + <div th:if="${resource.hasId()}"> + <b>id: </b> + <span th:narrative="${resource.id}"></span> + </div> + + <div th:if="${resource.hasCode()}"> + <b>code:</b> + <div style="padding-left: 25px;" th:narrative="${resource.code}"></div> + </div> + + <!-- TODO: There is an issue with HAPI here - it doesn't recognize form and ingredient tags --> + <div th:if="${resource.hasProduct()}"> + <div th:if="${resource.getProduct().hasForm()}"> + <b>form:</b> + <div style="padding-left: 25px;" th:narrative="${resource.getProduct().form}"></div> + </div> + + <div th:if="${resource.getProduct().hasIngredient()}"> + <b>ingredient:</b> + <div th:if="${resource.getProduct().ingredient.hasItemCodeableConcept()}"> + <b>concept:</b> + <div style="padding-left: 25px;" th:narrative="${resource.getProduct().ingredient.itemCodeableConcept}"></div> + </div> + <div th:if="${resource.getProduct().ingredient.hasItemReference()}"> + <b>reference:</b> + <div style="padding-left: 25px;" th:narrative="${resource.getProduct().ingredient.itemReference}"></div> + </div> + <div th:if="${resource.getProduct().ingredient.hasAmount()}"> + <b>amount:</b> + <div style="padding-left: 25px;" th:narrative="${resource.getProduct().ingredient.amount}"></div> + </div> + </div> + </div> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/plandef.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/plandef.html new file mode 100644 index 00000000000..c3b7c4c7c44 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/plandef.html @@ -0,0 +1,180 @@ +<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> + + <table th:if="${resource.hasId()}" class="grid dict"> + <tr> + <td><b>Id: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.id}"></td> + </tr> + </table> + + <p/> + + <table th:each="ident : ${resource.identifier}" class="grid dict"> + <tr> + <td><b>Identifier: </b></td> + </tr> + <tr th:if="${ident.hasSystem()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>system: </b> <span th:narrative="${ident.system}"></span> + </td> + </tr> + <tr th:if="${ident.hasValue()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>value: </b> <span th:narrative="${ident.value}"></span> + </td> + </tr> + </table> + + <p th:if="${resource.hasIdentifier()}"></p> + + <table th:if="${resource.hasTitle()}" class="grid dict"> + <tr> + <td><b>Title: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.title}"></td> + </tr> + </table> + + <p th:if="${resource.hasTitle()}"></p> + + <table th:if="${not resource.type.empty}" class="grid dict"> + <tr> + <td><b>Type: </b></td> + </tr> + <tr th:if="${resource.hasText()}"> + <td><b>text: </b></td> + <td style="padding-left: 25px; padding-right: 25px;" th:text="${resource.text}"></td> + </tr> + <tr th:each="codings : ${resource.coding}"> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${codings}"></td> + </tr> + </table> + + <p th:if="${not resource.type.empty}"></p> + + <table th:if="${resource.hasStatus()}" class="grid dict"> + <tr> + <td><b>Status: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.status.toCode()}"></td> + </tr> + </table> + + <p th:if="${resource.hasStatus()}"></p> + + <table th:if="${resource.hasDescription()}" class="grid dict"> + <tr> + <td><b>Description: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.description}"></td> + </tr> + </table> + + <p th:if="${resource.hasDescription()}"></p> + + <table th:if="${resource.hasPurpose()}" class="grid dict"> + <tr> + <td><b>Purpose: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.purpose}"></td> + </tr> + </table> + + <p th:if="${resource.hasPurpose()}"></p> + + <table th:if="${resource.hasUsage()}" class="grid dict"> + <tr> + <td><b>Usage: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.usage}"></td> + </tr> + </table> + + <p th:if="${resource.hasUsage()}"></p> + + <table th:each="context : ${resource.useContext}" class="grid dict"> + <tr> + <td><b>Context: </b></td> + </tr> + <tr style="vertical-align: top;"> + <td style="padding-right: 25px;" th:narrative="${context}"></td> + </tr> + </table> + + <p th:if="${resource.hasUseContext()}"></p> + + <table th:each="top : ${resource.topic}" class="grid dict"> + <tr> + <td><b>Topic: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${top}"></td> + </tr> + </table> + + <p th:if="${resource.hasTopic()}"></p> + + <table th:each="cont : ${resource.contributor}" class="grid dict"> + <tr> + <td><b>Contributor: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;"><b><span th:narrative="${cont.type.toCode()}"></span>: </b></td> + </tr> + <tr> + <td style="padding-left: 50px; padding-right: 25px;" th:narrative="${cont.name}"></td> + </tr> + </table> + + <p th:if="${resource.hasContributor()}"></p> + + <table th:each="related : ${resource.relatedArtifact}" class="grid dict"> + <tr> + <td><b>Related: </b></td> + </tr> + <tr style="vertical-align: top;"> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${related}"></td> + </tr> + </table> + + <p th:if="${resource.hasRelated()}"></p> + + <table th:each="lib : ${resource.library}" class="grid dict"> + <tr> + <td><b>Library: </b></td> + </tr> + <tr th:if="${lib.hasReference()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>reference: </b> + <span th:narrative="${lib.reference}"></span> + </td> + </tr> + <tr th:if="${lib.hasIdentifier()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>identifier: </b> + <span th:narrative="${lib.identifier}"></span> + </td> + </tr> + <tr th:if="${lib.hasDisplay()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>display: </b> + <span th:narrative="${lib.display}"></span> + </td> + </tr> + </table> + + <p th:if="${resource.hasLibrary()}"></p> + + <h2>Actions</h2> + + <p th:include="actiondefcomponent :: actionDefFrag(${resource.actionDefinition}, ${resource.contained}, 1)" style="width: 100%;" class="hierarchy"></p> + + +</div> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/plandefinition.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/plandefinition.html new file mode 100644 index 00000000000..2fce5da9c47 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/plandefinition.html @@ -0,0 +1,107 @@ +<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> + <!-- style="padding-left: 25px; padding-top: 25px; padding-right: 25px; word-wrap: break-word; max-width: 50%;" --> + <div th:if="${resource.hasId()}"> + <b>id: </b> + <span th:narrative="${resource.id}"></span> + </div> + + <br th:if="${resource.hasId()}" /> + + <div th:each="ident : ${resource.identifier}"> + <span th:narrative="${ident}"></span> + </div> + + <br th:if="${resource.hasIdentifier()}" /> + + <div th:if="${resource.hasTitle()}"> + <b>title: </b> + <span th:narrative="${resource.title}"></span> + </div> + + <br th:if="${resource.hasTitle()}" /> + + <div th:if="${not resource.type.empty}"> + <b>type: </b> + <span th:narrative="${resource.type}"></span> + </div> + + <br th:if="${not resource.type.empty}" /> + + <div th:if="${not resource.status.toCode().empty}"> + <b>status: </b> + <span th:narrative="${resource.status.toCode()}"></span> + </div> + + <br th:if="${not resource.status.toCode().empty}" /> + + <div th:if="${not resource.type.coding.empty}"> + <b>type: </b> + <span th:narrative="${resource.type.coding[0].code}"></span> + </div> + + <br th:if="${not resource.type.coding.empty}" /> + + <div th:if="${resource.hasDescription()}"> + <b>description: </b> + <span th:narrative="${resource.description}"></span> + </div> + + <br th:if="${resource.hasDescription()}" /> + + <div th:if="${resource.hasPurpose()}"> + <b>purpose: </b> + <span th:narrative="${resource.purpose}"></span> + </div> + + <br th:if="${resource.hasPurpose()}" /> + + <div th:if="${resource.hasUsage()}"> + <b>usage: </b> + <div style="padding-left: 25px;" th:narrative="${resource.usage}"></div> + </div> + + <br th:if="${resource.hasUsage()}" /> + + <div th:each="context : ${resource.useContext}"> + <div th:narrative="${context}"></div> + </div> + + <br th:if="${resource.hasUseContext()}" /> + + <div th:each="topics : ${resource.topic}"> + <b>topic: </b> + <div style="padding-left: 25px;" th:narrative="${topics}"></div> + </div> + + <br th:if="${resource.hasTopic()}" /> + + <div th:each="contrib : ${resource.contributor}"> + <div> + <b><span th:narrative="${contrib.type.toCode()}"></span>: </b> + <div style="padding-left: 25px;"> + <b>display: </b> + <span th:narrative="${contrib.name}"></span> + </div> + </div> + </div> + + <br th:if="${resource.hasContributor()}" /> + + <div th:each="lib : ${resource.library}"> + <b>library: </b> + <div style="padding-left: 25px;" th:narrative="${lib}"></div> + </div> + + <br th:if="${resource.hasLibrary()}" /> + + <div th:each="related : ${resource.relatedArtifact}"> + <b>related:</b> + <div style="padding-left: 25px;" th:narrative="${related}"></div> + </div> + + <br th:if="${resource.hasRelatedArtifact()}" /> + + <!-- STEPS --> + <div th:include="actiondefcomponent :: actionDefFrag(${resource.actionDefinition}, ${resource.contained})"></div> + +</div> diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/ratio.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/ratio.html new file mode 100644 index 00000000000..5c3584a231d --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/ratio.html @@ -0,0 +1,20 @@ +<th:block th:if="${not resource.empty}"> + <!-- INVALID - NEEDS WORK --> + <div th:if="${resource.hasNumerator()}"> + <div th:if="${resource.hasDenominator()"> + <span th:if="${resource.numerator.hasValue()"> + <span th:narrative="${resource.numerator.value}"></span> + </span> + <span th:if="${resource.numerator.hasUnit()"> + <span th:narrative="${resource.numerator.unit}"></span> + </span> + <span th:if="${resource.denominator.hasValue()"> + <span> per </span> + <span th:narrative="${resource.denominator.value}"></span> + </span> + <span th:if="${resource.denominator.hasUnit()"> + <span th:narrative="${resource.denominator.unit}"></span> + </span> + </div> + </div> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/reference.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/reference.html new file mode 100644 index 00000000000..eb0c9495ace --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/reference.html @@ -0,0 +1,15 @@ +<th:block th:if="${not resource.empty}"> + <span style="padding-left: 25px;" th:if="${resource.hasReference()}"> + <b>reference: </b> + <span th:narrative="${resource.reference}"></span> + <br th:if="${resource.hasIdentifier() or resource.hasDisplay()}" /> + </span> + <span style="padding-left: 25px;" th:if="${resource.hasIdentifier()}"> + <span th:narrative="${resource.identifier}"></span> + <br th:if="${resource.hasDisplay()}" /> + </span> + <span style="padding-left: 25px;" th:if="${resource.hasDisplay()}"> + <b>display: </b> + <span th:narrative="${resource.display}"></span> + </span> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/relatedartifact.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/relatedartifact.html new file mode 100644 index 00000000000..dd20049cadb --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/relatedartifact.html @@ -0,0 +1,23 @@ +<th:block th:if="${not resource.empty}"> + <p style="margin-bottom: 5px;"> + <b>type: </b> + <span th:narrative="${resource.type.toCode()}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${resource.hasDisplay()}"> + <b>display: </b> + <span th:narrative="${resource.display}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${resource.hasUrl()}"> + <b>url: </b> + <span th:narrative="${resource.url}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${resource.hasDocument()}"> + <b>document: </b> + <span th:narrative="${resource.document}"></span> + </p> + <p style="margin-bottom: 5px;" th:if="${resource.hasResource()}"> + <b>Resource: </b> + <br/> + <span th:narrative="${resource.getResource()}"></span> + </p> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/servicedefinition.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/servicedefinition.html new file mode 100644 index 00000000000..b1910cf1817 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/servicedefinition.html @@ -0,0 +1,153 @@ +<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> + + <table th:if="${resource.hasId()}" class="grid dict"> + <tr> + <td><b>Id: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.id}"></td> + </tr> + </table> + + <p th:if="${resource.hasId()}"></p> + + <table th:each="ident : ${resource.identifier}" class="grid dict"> + <tr> + <td><b>Identifier: </b></td> + </tr> + <tr th:if="${ident.hasSystem()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>system: </b> <span th:narrative="${ident.system}"></span> + </td> + </tr> + <tr th:if="${ident.hasValue()}"> + <td style="padding-left: 25px; padding-right: 25px;"> + <b>value: </b> <span th:narrative="${ident.value}"></span> + </td> + </tr> + </table> + + <p th:if="${resource.hasIdentifier()}"></p> + + <table th:if="${resource.hasTitle()}" class="grid dict"> + <tr> + <td><b>Title: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.title}"></td> + </tr> + </table> + + <p th:if="${resource.hasTitle()}"></p> + + <table th:if="${resource.hasStatus()}" class="grid dict"> + <tr> + <td><b>Status: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.status.toCode()}"></td> + </tr> + </table> + + <p th:if="${resource.hasStatus()}"></p> + + <table th:if="${resource.hasDescription()}" class="grid dict"> + <tr> + <td><b>Description: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.description}"></td> + </tr> + </table> + + <p th:if="${resource.hasDescription()}"></p> + + <table th:if="${resource.hasPurpose()}" class="grid dict"> + <tr> + <td><b>Purpose: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.purpose}"></td> + </tr> + </table> + + <p th:if="${resource.hasPurpose()}"></p> + + <table th:if="${resource.hasUsage()}" class="grid dict"> + <tr> + <td><b>Usage: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.usage}"></td> + </tr> + </table> + + <p th:if="${resource.hasUsage()}"></p> + + <table th:each="context : ${resource.useContext}" class="grid dict"> + <tr> + <td><b>Use Context: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${context}"></td> + </tr> + </table> + + <p th:if="${resource.hasUseContext()}"></p> + + <table th:each="topics : ${resource.topic}" class="grid dict"> + <tr> + <td><b>Topic: </b></td> + </tr> + <tr> + <td style="padding-right: 25px;" th:narrative="${topics}"></td> + </tr> + </table> + + <p th:if="${resource.hasTopic()}"></p> + + <table th:each="cont : ${resource.contributor}" class="grid dict"> + <tr> + <td><b>Contributor: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;"><b><span th:narrative="${cont.type.toCode()}"></span>: </b></td> + </tr> + <tr> + <td style="padding-left: 50px; padding-right: 25px;" th:narrative="${cont.name}"></td> + </tr> + </table> + + <p th:if="${resource.hasContributor()}"></p> + + <table th:each="related : ${resource.relatedArtifact}" class="grid dict"> + <tr> + <td><b>Related: </b></td> + </tr> + <tr style="vertical-align: top;"> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${related}"></td> + </tr> + </table> + + <p th:if="${resource.hasRelatedArtifact()}"></p> + + <table th:each="dataReq : ${resource.dataRequirement}" class="grid dict"> + <tr> + <td><b>Data Requirements: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${dataReq}"></td> + </tr> + </table> + + <p th:if="${resource.hasDataRequirement()}"></p> + + <table th:if="${resource.hasOperationDefinition()}" class="grid dict"> + <tr> + <td><b>Operation Definition: </b></td> + </tr> + <tr> + <td style="padding-left: 25px; padding-right: 25px;" th:narrative="${resource.operationDefinition}"></td> + </tr> + </table> +</div> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/string.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/string.html new file mode 100644 index 00000000000..4ebdae3b3db --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/string.html @@ -0,0 +1 @@ +<th:block th:if="${not resource.empty}" th:text="${resource}"/> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/usagecontext.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/usagecontext.html new file mode 100644 index 00000000000..0c4cd957018 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/narratives/templates/usagecontext.html @@ -0,0 +1,40 @@ +<th:block th:if="${not resource.empty}"> + <p style="padding-left: 25px; margin-bottom: 5px;" th:if="${resource.code.hasSystem()}"> + <b>system: </b> + <span th:narrative="${resource.code.system}"></span> + </p> + <p style="padding-left: 25px; margin-bottom: 5px;" th:if="${resource.code.hasCode()}"> + <b>code: </b> + <span th:narrative="${resource.code.code}"></span> + </p> + <p style="padding-left: 25px; margin-bottom: 5px;" th:if="${resource.code.hasDisplay()}"> + <b>display: </b> + <span th:narrative="${resource.code.display}"></span> + </p> + <p style="padding-left: 25px; margin-bottom: 5px;" th:if="${resource.hasValueCodeableConcept()}"> + <b>value: </b> + <br/> + <span th:narrative="${resource.valueCodeableConcept}"></span> + </p> + <p style="padding-left: 25px; margin-bottom: 5px;" th:if="${resource.hasValueQuantity()}"> + <b>quantity: </b> + <span th:if="${resource.valueQuantity.hasComparator()}"> + <span style="padding-left: 25px;" th:narrative="${resource.valueQuantity.comparator}"></span> + </span> + <span th:if="${resource.valueQuantity.hasValue()}"> + <span style="padding-left: 25px;" th:narrative="${resource.valueQuantity.value}"></span> + </span> + <span th:if="${resource.valueQuantity.hasUnit()}"> + <span style="padding-left: 25px;" th:narrative="${resource.valueQuantity.unit}"></span> + </span> + </p> + <p style="padding-left: 25px; margin-bottom: 5px;" th:if="${resource.hasValueRange()}"> + <b>range: </b> + <span th:if="${resource.valueRange.hasLow()}"> + <span style="padding-left: 25px;" th:narrative="${resource.valueRange.low}"></span> + </span> + <span th:if="${resource.valueRange.hasHigh()}"> + <span style="padding-left: 25px;" th:narrative="${resource.valueRange.high}"></span> + </span> + </p> +</th:block> \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.113883.3.464.1003.103.12.1001.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.113883.3.464.1003.103.12.1001.json new file mode 100644 index 00000000000..bfd3f822f7d --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.113883.3.464.1003.103.12.1001.json @@ -0,0 +1,4710 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.113883.3.464.1003.103.12.1001", + "status": "draft", + "compose": { + "include": [ + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250", + "display": "Diabetes mellitus without mention of complication, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.01", + "display": "Diabetes mellitus without mention of complication, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.02", + "display": "Diabetes mellitus without mention of complication, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.03", + "display": "Diabetes mellitus without mention of complication, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.1", + "display": "Diabetes with ketoacidosis, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.11", + "display": "Diabetes with ketoacidosis, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.12", + "display": "Diabetes with ketoacidosis, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.13", + "display": "Diabetes with ketoacidosis, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.2", + "display": "Diabetes with hyperosmolarity, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.21", + "display": "Diabetes with hyperosmolarity, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.22", + "display": "Diabetes with hyperosmolarity, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.23", + "display": "Diabetes with hyperosmolarity, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.3", + "display": "Diabetes with other coma, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.31", + "display": "Diabetes with other coma, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.32", + "display": "Diabetes with other coma, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.33", + "display": "Diabetes with other coma, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.4", + "display": "Diabetes with renal manifestations, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.41", + "display": "Diabetes with renal manifestations, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.42", + "display": "Diabetes with renal manifestations, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.43", + "display": "Diabetes with renal manifestations, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.5", + "display": "Diabetes with ophthalmic manifestations, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.51", + "display": "Diabetes with ophthalmic manifestations, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.52", + "display": "Diabetes with ophthalmic manifestations, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.53", + "display": "Diabetes with ophthalmic manifestations, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.6", + "display": "Diabetes with neurological manifestations, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.61", + "display": "Diabetes with neurological manifestations, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.62", + "display": "Diabetes with neurological manifestations, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.63", + "display": "Diabetes with neurological manifestations, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.7", + "display": "Diabetes with peripheral circulatory disorders, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.71", + "display": "Diabetes with peripheral circulatory disorders, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.72", + "display": "Diabetes with peripheral circulatory disorders, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.73", + "display": "Diabetes with peripheral circulatory disorders, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.8", + "display": "Diabetes with other specified manifestations, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.81", + "display": "Diabetes with other specified manifestations, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.82", + "display": "Diabetes with other specified manifestations, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.83", + "display": "Diabetes with other specified manifestations, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.9", + "display": "Diabetes with unspecified complication, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.91", + "display": "Diabetes with unspecified complication, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.92", + "display": "Diabetes with unspecified complication, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.93", + "display": "Diabetes with unspecified complication, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "357.2", + "display": "Polyneuropathy in diabetes" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.01", + "display": "Background diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.02", + "display": "Proliferative diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.03", + "display": "Nonproliferative diabetic retinopathy NOS" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.04", + "display": "Mild nonproliferative diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.05", + "display": "Moderate nonproliferative diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.06", + "display": "Severe nonproliferative diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.07", + "display": "Diabetic macular edema" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "366.41", + "display": "Diabetic cataract" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, unspecified as to episode of care or not applicable" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648.01", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, delivered, with or without mention of antepartum condition" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648.02", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, delivered, with mention of postpartum complication" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648.03", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, antepartum condition or complication" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648.04", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, postpartum condition or complication" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "4783006", + "display": "Maternal diabetes mellitus with hypoglycemia affecting fetus OR newborn (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "9859006", + "display": "Type 2 diabetes mellitus with acanthosis nigricans (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "23045005", + "display": "Insulin dependent diabetes mellitus type IA (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "28032008", + "display": "Insulin dependent diabetes mellitus type IB (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "44054006", + "display": "Diabetes mellitus type 2 (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "46635009", + "display": "Diabetes mellitus type 1 (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "75682002", + "display": "Diabetes mellitus caused by insulin receptor antibodies (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "76751001", + "display": "Diabetes mellitus in mother complicating pregnancy, childbirth AND/OR puerperium (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "81531005", + "display": "Diabetes mellitus type 2 in obese (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190330002", + "display": "Type 1 diabetes mellitus with hyperosmolar coma (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190331003", + "display": "Type 2 diabetes mellitus with hyperosmolar coma (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190368000", + "display": "Type I diabetes mellitus with ulcer (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190369008", + "display": "Type I diabetes mellitus with gangrene (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190372001", + "display": "Type I diabetes mellitus maturity onset (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190389009", + "display": "Type II diabetes mellitus with ulcer (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190390000", + "display": "Type II diabetes mellitus with gangrene (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199223000", + "display": "Diabetes mellitus during pregnancy, childbirth and the puerperium (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199225007", + "display": "Diabetes mellitus during pregnancy - baby delivered (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199226008", + "display": "Diabetes mellitus in the puerperium - baby delivered during current episode of care (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199227004", + "display": "Diabetes mellitus during pregnancy - baby not yet delivered (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199228009", + "display": "Diabetes mellitus in the puerperium - baby delivered during previous episode of care (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199229001", + "display": "Pre-existing type 1 diabetes mellitus (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199230006", + "display": "Pre-existing type 2 diabetes mellitus (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "237599002", + "display": "Insulin treated type 2 diabetes mellitus (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "237618001", + "display": "Insulin-dependent diabetes mellitus secretory diarrhea syndrome (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "237627000", + "display": "Pregnancy and type 2 diabetes mellitus (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "313435000", + "display": "Type I diabetes mellitus without complication (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "313436004", + "display": "Type II diabetes mellitus without complication (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314771006", + "display": "Type I diabetes mellitus with hypoglycemic coma (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314772004", + "display": "Type II diabetes mellitus with hypoglycemic coma (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314893005", + "display": "Type I diabetes mellitus with arthropathy (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314902007", + "display": "Type II diabetes mellitus with peripheral angiopathy (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314903002", + "display": "Type II diabetes mellitus with arthropathy (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314904008", + "display": "Type II diabetes mellitus with neuropathic arthropathy (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "359642000", + "display": "Diabetes mellitus type 2 in nonobese (disorder)" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.8", + "display": "Type 1 diabetes mellitus with unspecified complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.9", + "display": "Type 1 diabetes mellitus without complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.10", + "display": "Type 1 diabetes mellitus with ketoacidosis without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.11", + "display": "Type 1 diabetes mellitus with ketoacidosis with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.21", + "display": "Type 1 diabetes mellitus with diabetic nephropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.22", + "display": "Type 1 diabetes mellitus with diabetic chronic kidney disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.29", + "display": "Type 1 diabetes mellitus with other diabetic kidney complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.36", + "display": "Type 1 diabetes mellitus with diabetic cataract" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.39", + "display": "Type 1 diabetes mellitus with other diabetic ophthalmic complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.40", + "display": "Type 1 diabetes mellitus with diabetic neuropathy, unspecified" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.41", + "display": "Type 1 diabetes mellitus with diabetic mononeuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.42", + "display": "Type 1 diabetes mellitus with diabetic polyneuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.43", + "display": "Type 1 diabetes mellitus with diabetic autonomic (poly)neuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.44", + "display": "Type 1 diabetes mellitus with diabetic amyotrophy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.49", + "display": "Type 1 diabetes mellitus with other diabetic neurological complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.51", + "display": "Type 1 diabetes mellitus with diabetic peripheral angiopathy without gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.52", + "display": "Type 1 diabetes mellitus with diabetic peripheral angiopathy with gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.59", + "display": "Type 1 diabetes mellitus with other circulatory complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.65", + "display": "Type 1 diabetes mellitus with hyperglycemia" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.69", + "display": "Type 1 diabetes mellitus with other specified complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.311", + "display": "Type 1 diabetes mellitus with unspecified diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.319", + "display": "Type 1 diabetes mellitus with unspecified diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.321", + "display": "Type 1 diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.329", + "display": "Type 1 diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.331", + "display": "Type 1 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.339", + "display": "Type 1 diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.341", + "display": "Type 1 diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.349", + "display": "Type 1 diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.351", + "display": "Type 1 diabetes mellitus with proliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.359", + "display": "Type 1 diabetes mellitus with proliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.610", + "display": "Type 1 diabetes mellitus with diabetic neuropathic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.618", + "display": "Type 1 diabetes mellitus with other diabetic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.620", + "display": "Type 1 diabetes mellitus with diabetic dermatitis" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.621", + "display": "Type 1 diabetes mellitus with foot ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.622", + "display": "Type 1 diabetes mellitus with other skin ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.628", + "display": "Type 1 diabetes mellitus with other skin complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.630", + "display": "Type 1 diabetes mellitus with periodontal disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.638", + "display": "Type 1 diabetes mellitus with other oral complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.641", + "display": "Type 1 diabetes mellitus with hypoglycemia with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.649", + "display": "Type 1 diabetes mellitus with hypoglycemia without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.00", + "display": "Type 2 diabetes mellitus with hyperosmolarity without nonketotic hyperglycemic-hyperosmolar coma (NKHHC)" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.01", + "display": "Type 2 diabetes mellitus with hyperosmolarity with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.8", + "display": "Type 2 diabetes mellitus with unspecified complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.9", + "display": "Type 2 diabetes mellitus without complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.21", + "display": "Type 2 diabetes mellitus with diabetic nephropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.22", + "display": "Type 2 diabetes mellitus with diabetic chronic kidney disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.29", + "display": "Type 2 diabetes mellitus with other diabetic kidney complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.36", + "display": "Type 2 diabetes mellitus with diabetic cataract" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.39", + "display": "Type 2 diabetes mellitus with other diabetic ophthalmic complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.40", + "display": "Type 2 diabetes mellitus with diabetic neuropathy, unspecified" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.41", + "display": "Type 2 diabetes mellitus with diabetic mononeuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.42", + "display": "Type 2 diabetes mellitus with diabetic polyneuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.43", + "display": "Type 2 diabetes mellitus with diabetic autonomic (poly)neuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.44", + "display": "Type 2 diabetes mellitus with diabetic amyotrophy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.49", + "display": "Type 2 diabetes mellitus with other diabetic neurological complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.51", + "display": "Type 2 diabetes mellitus with diabetic peripheral angiopathy without gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.52", + "display": "Type 2 diabetes mellitus with diabetic peripheral angiopathy with gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.59", + "display": "Type 2 diabetes mellitus with other circulatory complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.65", + "display": "Type 2 diabetes mellitus with hyperglycemia" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.69", + "display": "Type 2 diabetes mellitus with other specified complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.311", + "display": "Type 2 diabetes mellitus with unspecified diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.319", + "display": "Type 2 diabetes mellitus with unspecified diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.321", + "display": "Type 2 diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.329", + "display": "Type 2 diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.331", + "display": "Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.339", + "display": "Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.341", + "display": "Type 2 diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.349", + "display": "Type 2 diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.351", + "display": "Type 2 diabetes mellitus with proliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.359", + "display": "Type 2 diabetes mellitus with proliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.610", + "display": "Type 2 diabetes mellitus with diabetic neuropathic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.618", + "display": "Type 2 diabetes mellitus with other diabetic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.620", + "display": "Type 2 diabetes mellitus with diabetic dermatitis" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.621", + "display": "Type 2 diabetes mellitus with foot ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.622", + "display": "Type 2 diabetes mellitus with other skin ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.628", + "display": "Type 2 diabetes mellitus with other skin complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.630", + "display": "Type 2 diabetes mellitus with periodontal disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.638", + "display": "Type 2 diabetes mellitus with other oral complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.641", + "display": "Type 2 diabetes mellitus with hypoglycemia with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.649", + "display": "Type 2 diabetes mellitus with hypoglycemia without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.00", + "display": "Other specified diabetes mellitus with hyperosmolarity without nonketotic hyperglycemic-hyperosmolar coma (NKHHC)" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.01", + "display": "Other specified diabetes mellitus with hyperosmolarity with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.8", + "display": "Other specified diabetes mellitus with unspecified complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.9", + "display": "Other specified diabetes mellitus without complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.10", + "display": "Other specified diabetes mellitus with ketoacidosis without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.11", + "display": "Other specified diabetes mellitus with ketoacidosis with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.21", + "display": "Other specified diabetes mellitus with diabetic nephropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.22", + "display": "Other specified diabetes mellitus with diabetic chronic kidney disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.29", + "display": "Other specified diabetes mellitus with other diabetic kidney complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.36", + "display": "Other specified diabetes mellitus with diabetic cataract" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.39", + "display": "Other specified diabetes mellitus with other diabetic ophthalmic complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.40", + "display": "Other specified diabetes mellitus with diabetic neuropathy, unspecified" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.41", + "display": "Other specified diabetes mellitus with diabetic mononeuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.42", + "display": "Other specified diabetes mellitus with diabetic polyneuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.43", + "display": "Other specified diabetes mellitus with diabetic autonomic (poly)neuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.44", + "display": "Other specified diabetes mellitus with diabetic amyotrophy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.49", + "display": "Other specified diabetes mellitus with other diabetic neurological complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.51", + "display": "Other specified diabetes mellitus with diabetic peripheral angiopathy without gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.52", + "display": "Other specified diabetes mellitus with diabetic peripheral angiopathy with gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.59", + "display": "Other specified diabetes mellitus with other circulatory complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.65", + "display": "Other specified diabetes mellitus with hyperglycemia" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.69", + "display": "Other specified diabetes mellitus with other specified complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.311", + "display": "Other specified diabetes mellitus with unspecified diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.319", + "display": "Other specified diabetes mellitus with unspecified diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.321", + "display": "Other specified diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.329", + "display": "Other specified diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.331", + "display": "Other specified diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.339", + "display": "Other specified diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.341", + "display": "Other specified diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.349", + "display": "Other specified diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.351", + "display": "Other specified diabetes mellitus with proliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.359", + "display": "Other specified diabetes mellitus with proliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.610", + "display": "Other specified diabetes mellitus with diabetic neuropathic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.618", + "display": "Other specified diabetes mellitus with other diabetic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.620", + "display": "Other specified diabetes mellitus with diabetic dermatitis" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.621", + "display": "Other specified diabetes mellitus with foot ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.622", + "display": "Other specified diabetes mellitus with other skin ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.628", + "display": "Other specified diabetes mellitus with other skin complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.630", + "display": "Other specified diabetes mellitus with periodontal disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.638", + "display": "Other specified diabetes mellitus with other oral complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.641", + "display": "Other specified diabetes mellitus with hypoglycemia with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.649", + "display": "Other specified diabetes mellitus with hypoglycemia without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.019", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, unspecified trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.02", + "display": "Pre-existing type 1 diabetes mellitus, in childbirth" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.03", + "display": "Pre-existing type 1 diabetes mellitus, in the puerperium" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.011", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, first trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.012", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, second trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.013", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, third trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.12", + "display": "Pre-existing type 2 diabetes mellitus, in childbirth" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.13", + "display": "Pre-existing type 2 diabetes mellitus, in the puerperium" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.32", + "display": "Unspecified pre-existing diabetes mellitus in childbirth" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.33", + "display": "Unspecified pre-existing diabetes mellitus in the puerperium" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.82", + "display": "Other pre-existing diabetes mellitus in childbirth" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.83", + "display": "Other pre-existing diabetes mellitus in the puerperium" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.111", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, first trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.112", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, second trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.113", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, third trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.119", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, unspecified trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.311", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, first trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.312", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, second trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.313", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, third trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.319", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, unspecified trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.811", + "display": "Other pre-existing diabetes mellitus in pregnancy, first trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.812", + "display": "Other pre-existing diabetes mellitus in pregnancy, second trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.813", + "display": "Other pre-existing diabetes mellitus in pregnancy, third trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.819", + "display": "Other pre-existing diabetes mellitus in pregnancy, unspecified trimester" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250", + "display": "Diabetes mellitus without mention of complication, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.01", + "display": "Diabetes mellitus without mention of complication, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.02", + "display": "Diabetes mellitus without mention of complication, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.03", + "display": "Diabetes mellitus without mention of complication, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.1", + "display": "Diabetes with ketoacidosis, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.11", + "display": "Diabetes with ketoacidosis, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.12", + "display": "Diabetes with ketoacidosis, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.13", + "display": "Diabetes with ketoacidosis, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.2", + "display": "Diabetes with hyperosmolarity, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.21", + "display": "Diabetes with hyperosmolarity, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.22", + "display": "Diabetes with hyperosmolarity, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.23", + "display": "Diabetes with hyperosmolarity, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.3", + "display": "Diabetes with other coma, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.31", + "display": "Diabetes with other coma, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.32", + "display": "Diabetes with other coma, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.33", + "display": "Diabetes with other coma, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.4", + "display": "Diabetes with renal manifestations, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.41", + "display": "Diabetes with renal manifestations, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.42", + "display": "Diabetes with renal manifestations, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.43", + "display": "Diabetes with renal manifestations, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.5", + "display": "Diabetes with ophthalmic manifestations, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.51", + "display": "Diabetes with ophthalmic manifestations, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.52", + "display": "Diabetes with ophthalmic manifestations, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.53", + "display": "Diabetes with ophthalmic manifestations, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.6", + "display": "Diabetes with neurological manifestations, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.61", + "display": "Diabetes with neurological manifestations, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.62", + "display": "Diabetes with neurological manifestations, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.63", + "display": "Diabetes with neurological manifestations, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.7", + "display": "Diabetes with peripheral circulatory disorders, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.71", + "display": "Diabetes with peripheral circulatory disorders, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.72", + "display": "Diabetes with peripheral circulatory disorders, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.73", + "display": "Diabetes with peripheral circulatory disorders, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.8", + "display": "Diabetes with other specified manifestations, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.81", + "display": "Diabetes with other specified manifestations, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.82", + "display": "Diabetes with other specified manifestations, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.83", + "display": "Diabetes with other specified manifestations, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.9", + "display": "Diabetes with unspecified complication, type II or unspecified type, not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.91", + "display": "Diabetes with unspecified complication, type I [juvenile type], not stated as uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.92", + "display": "Diabetes with unspecified complication, type II or unspecified type, uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "250.93", + "display": "Diabetes with unspecified complication, type I [juvenile type], uncontrolled" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "357.2", + "display": "Polyneuropathy in diabetes" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.01", + "display": "Background diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.02", + "display": "Proliferative diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.03", + "display": "Nonproliferative diabetic retinopathy NOS" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.04", + "display": "Mild nonproliferative diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.05", + "display": "Moderate nonproliferative diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.06", + "display": "Severe nonproliferative diabetic retinopathy" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "362.07", + "display": "Diabetic macular edema" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "366.41", + "display": "Diabetic cataract" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, unspecified as to episode of care or not applicable" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648.01", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, delivered, with or without mention of antepartum condition" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648.02", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, delivered, with mention of postpartum complication" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648.03", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, antepartum condition or complication" + } + ] + }, + { + "system": "ICD9CM", + "version": "2013", + "concept": [ + { + "code": "648.04", + "display": "Diabetes mellitus of mother, complicating pregnancy, childbirth, or the puerperium, postpartum condition or complication" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "4783006", + "display": "Maternal diabetes mellitus with hypoglycemia affecting fetus OR newborn (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "9859006", + "display": "Type 2 diabetes mellitus with acanthosis nigricans (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "23045005", + "display": "Insulin dependent diabetes mellitus type IA (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "28032008", + "display": "Insulin dependent diabetes mellitus type IB (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "44054006", + "display": "Diabetes mellitus type 2 (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "46635009", + "display": "Diabetes mellitus type 1 (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "75682002", + "display": "Diabetes mellitus caused by insulin receptor antibodies (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "76751001", + "display": "Diabetes mellitus in mother complicating pregnancy, childbirth AND/OR puerperium (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "81531005", + "display": "Diabetes mellitus type 2 in obese (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190330002", + "display": "Type 1 diabetes mellitus with hyperosmolar coma (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190331003", + "display": "Type 2 diabetes mellitus with hyperosmolar coma (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190368000", + "display": "Type I diabetes mellitus with ulcer (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190369008", + "display": "Type I diabetes mellitus with gangrene (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190372001", + "display": "Type I diabetes mellitus maturity onset (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190389009", + "display": "Type II diabetes mellitus with ulcer (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "190390000", + "display": "Type II diabetes mellitus with gangrene (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199223000", + "display": "Diabetes mellitus during pregnancy, childbirth and the puerperium (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199225007", + "display": "Diabetes mellitus during pregnancy - baby delivered (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199226008", + "display": "Diabetes mellitus in the puerperium - baby delivered during current episode of care (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199227004", + "display": "Diabetes mellitus during pregnancy - baby not yet delivered (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199228009", + "display": "Diabetes mellitus in the puerperium - baby delivered during previous episode of care (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199229001", + "display": "Pre-existing type 1 diabetes mellitus (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "199230006", + "display": "Pre-existing type 2 diabetes mellitus (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "237599002", + "display": "Insulin treated type 2 diabetes mellitus (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "237618001", + "display": "Insulin-dependent diabetes mellitus secretory diarrhea syndrome (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "237627000", + "display": "Pregnancy and type 2 diabetes mellitus (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "313435000", + "display": "Type I diabetes mellitus without complication (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "313436004", + "display": "Type II diabetes mellitus without complication (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314771006", + "display": "Type I diabetes mellitus with hypoglycemic coma (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314772004", + "display": "Type II diabetes mellitus with hypoglycemic coma (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314893005", + "display": "Type I diabetes mellitus with arthropathy (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314902007", + "display": "Type II diabetes mellitus with peripheral angiopathy (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314903002", + "display": "Type II diabetes mellitus with arthropathy (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "314904008", + "display": "Type II diabetes mellitus with neuropathic arthropathy (disorder)" + } + ] + }, + { + "system": "SNOMEDCT", + "version": "2016-09", + "concept": [ + { + "code": "359642000", + "display": "Diabetes mellitus type 2 in nonobese (disorder)" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.8", + "display": "Type 1 diabetes mellitus with unspecified complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.9", + "display": "Type 1 diabetes mellitus without complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.10", + "display": "Type 1 diabetes mellitus with ketoacidosis without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.11", + "display": "Type 1 diabetes mellitus with ketoacidosis with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.21", + "display": "Type 1 diabetes mellitus with diabetic nephropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.22", + "display": "Type 1 diabetes mellitus with diabetic chronic kidney disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.29", + "display": "Type 1 diabetes mellitus with other diabetic kidney complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.36", + "display": "Type 1 diabetes mellitus with diabetic cataract" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.39", + "display": "Type 1 diabetes mellitus with other diabetic ophthalmic complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.40", + "display": "Type 1 diabetes mellitus with diabetic neuropathy, unspecified" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.41", + "display": "Type 1 diabetes mellitus with diabetic mononeuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.42", + "display": "Type 1 diabetes mellitus with diabetic polyneuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.43", + "display": "Type 1 diabetes mellitus with diabetic autonomic (poly)neuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.44", + "display": "Type 1 diabetes mellitus with diabetic amyotrophy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.49", + "display": "Type 1 diabetes mellitus with other diabetic neurological complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.51", + "display": "Type 1 diabetes mellitus with diabetic peripheral angiopathy without gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.52", + "display": "Type 1 diabetes mellitus with diabetic peripheral angiopathy with gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.59", + "display": "Type 1 diabetes mellitus with other circulatory complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.65", + "display": "Type 1 diabetes mellitus with hyperglycemia" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.69", + "display": "Type 1 diabetes mellitus with other specified complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.311", + "display": "Type 1 diabetes mellitus with unspecified diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.319", + "display": "Type 1 diabetes mellitus with unspecified diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.321", + "display": "Type 1 diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.329", + "display": "Type 1 diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.331", + "display": "Type 1 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.339", + "display": "Type 1 diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.341", + "display": "Type 1 diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.349", + "display": "Type 1 diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.351", + "display": "Type 1 diabetes mellitus with proliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.359", + "display": "Type 1 diabetes mellitus with proliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.610", + "display": "Type 1 diabetes mellitus with diabetic neuropathic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.618", + "display": "Type 1 diabetes mellitus with other diabetic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.620", + "display": "Type 1 diabetes mellitus with diabetic dermatitis" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.621", + "display": "Type 1 diabetes mellitus with foot ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.622", + "display": "Type 1 diabetes mellitus with other skin ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.628", + "display": "Type 1 diabetes mellitus with other skin complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.630", + "display": "Type 1 diabetes mellitus with periodontal disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.638", + "display": "Type 1 diabetes mellitus with other oral complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.641", + "display": "Type 1 diabetes mellitus with hypoglycemia with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E10.649", + "display": "Type 1 diabetes mellitus with hypoglycemia without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.00", + "display": "Type 2 diabetes mellitus with hyperosmolarity without nonketotic hyperglycemic-hyperosmolar coma (NKHHC)" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.01", + "display": "Type 2 diabetes mellitus with hyperosmolarity with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.8", + "display": "Type 2 diabetes mellitus with unspecified complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.9", + "display": "Type 2 diabetes mellitus without complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.21", + "display": "Type 2 diabetes mellitus with diabetic nephropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.22", + "display": "Type 2 diabetes mellitus with diabetic chronic kidney disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.29", + "display": "Type 2 diabetes mellitus with other diabetic kidney complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.36", + "display": "Type 2 diabetes mellitus with diabetic cataract" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.39", + "display": "Type 2 diabetes mellitus with other diabetic ophthalmic complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.40", + "display": "Type 2 diabetes mellitus with diabetic neuropathy, unspecified" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.41", + "display": "Type 2 diabetes mellitus with diabetic mononeuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.42", + "display": "Type 2 diabetes mellitus with diabetic polyneuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.43", + "display": "Type 2 diabetes mellitus with diabetic autonomic (poly)neuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.44", + "display": "Type 2 diabetes mellitus with diabetic amyotrophy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.49", + "display": "Type 2 diabetes mellitus with other diabetic neurological complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.51", + "display": "Type 2 diabetes mellitus with diabetic peripheral angiopathy without gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.52", + "display": "Type 2 diabetes mellitus with diabetic peripheral angiopathy with gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.59", + "display": "Type 2 diabetes mellitus with other circulatory complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.65", + "display": "Type 2 diabetes mellitus with hyperglycemia" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.69", + "display": "Type 2 diabetes mellitus with other specified complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.311", + "display": "Type 2 diabetes mellitus with unspecified diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.319", + "display": "Type 2 diabetes mellitus with unspecified diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.321", + "display": "Type 2 diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.329", + "display": "Type 2 diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.331", + "display": "Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.339", + "display": "Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.341", + "display": "Type 2 diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.349", + "display": "Type 2 diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.351", + "display": "Type 2 diabetes mellitus with proliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.359", + "display": "Type 2 diabetes mellitus with proliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.610", + "display": "Type 2 diabetes mellitus with diabetic neuropathic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.618", + "display": "Type 2 diabetes mellitus with other diabetic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.620", + "display": "Type 2 diabetes mellitus with diabetic dermatitis" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.621", + "display": "Type 2 diabetes mellitus with foot ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.622", + "display": "Type 2 diabetes mellitus with other skin ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.628", + "display": "Type 2 diabetes mellitus with other skin complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.630", + "display": "Type 2 diabetes mellitus with periodontal disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.638", + "display": "Type 2 diabetes mellitus with other oral complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.641", + "display": "Type 2 diabetes mellitus with hypoglycemia with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E11.649", + "display": "Type 2 diabetes mellitus with hypoglycemia without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.00", + "display": "Other specified diabetes mellitus with hyperosmolarity without nonketotic hyperglycemic-hyperosmolar coma (NKHHC)" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.01", + "display": "Other specified diabetes mellitus with hyperosmolarity with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.8", + "display": "Other specified diabetes mellitus with unspecified complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.9", + "display": "Other specified diabetes mellitus without complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.10", + "display": "Other specified diabetes mellitus with ketoacidosis without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.11", + "display": "Other specified diabetes mellitus with ketoacidosis with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.21", + "display": "Other specified diabetes mellitus with diabetic nephropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.22", + "display": "Other specified diabetes mellitus with diabetic chronic kidney disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.29", + "display": "Other specified diabetes mellitus with other diabetic kidney complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.36", + "display": "Other specified diabetes mellitus with diabetic cataract" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.39", + "display": "Other specified diabetes mellitus with other diabetic ophthalmic complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.40", + "display": "Other specified diabetes mellitus with diabetic neuropathy, unspecified" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.41", + "display": "Other specified diabetes mellitus with diabetic mononeuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.42", + "display": "Other specified diabetes mellitus with diabetic polyneuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.43", + "display": "Other specified diabetes mellitus with diabetic autonomic (poly)neuropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.44", + "display": "Other specified diabetes mellitus with diabetic amyotrophy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.49", + "display": "Other specified diabetes mellitus with other diabetic neurological complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.51", + "display": "Other specified diabetes mellitus with diabetic peripheral angiopathy without gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.52", + "display": "Other specified diabetes mellitus with diabetic peripheral angiopathy with gangrene" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.59", + "display": "Other specified diabetes mellitus with other circulatory complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.65", + "display": "Other specified diabetes mellitus with hyperglycemia" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.69", + "display": "Other specified diabetes mellitus with other specified complication" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.311", + "display": "Other specified diabetes mellitus with unspecified diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.319", + "display": "Other specified diabetes mellitus with unspecified diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.321", + "display": "Other specified diabetes mellitus with mild nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.329", + "display": "Other specified diabetes mellitus with mild nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.331", + "display": "Other specified diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.339", + "display": "Other specified diabetes mellitus with moderate nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.341", + "display": "Other specified diabetes mellitus with severe nonproliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.349", + "display": "Other specified diabetes mellitus with severe nonproliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.351", + "display": "Other specified diabetes mellitus with proliferative diabetic retinopathy with macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.359", + "display": "Other specified diabetes mellitus with proliferative diabetic retinopathy without macular edema" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.610", + "display": "Other specified diabetes mellitus with diabetic neuropathic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.618", + "display": "Other specified diabetes mellitus with other diabetic arthropathy" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.620", + "display": "Other specified diabetes mellitus with diabetic dermatitis" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.621", + "display": "Other specified diabetes mellitus with foot ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.622", + "display": "Other specified diabetes mellitus with other skin ulcer" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.628", + "display": "Other specified diabetes mellitus with other skin complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.630", + "display": "Other specified diabetes mellitus with periodontal disease" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.638", + "display": "Other specified diabetes mellitus with other oral complications" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.641", + "display": "Other specified diabetes mellitus with hypoglycemia with coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "E13.649", + "display": "Other specified diabetes mellitus with hypoglycemia without coma" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.019", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, unspecified trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.02", + "display": "Pre-existing type 1 diabetes mellitus, in childbirth" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.03", + "display": "Pre-existing type 1 diabetes mellitus, in the puerperium" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.011", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, first trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.012", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, second trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.013", + "display": "Pre-existing type 1 diabetes mellitus, in pregnancy, third trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.12", + "display": "Pre-existing type 2 diabetes mellitus, in childbirth" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.13", + "display": "Pre-existing type 2 diabetes mellitus, in the puerperium" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.32", + "display": "Unspecified pre-existing diabetes mellitus in childbirth" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.33", + "display": "Unspecified pre-existing diabetes mellitus in the puerperium" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.82", + "display": "Other pre-existing diabetes mellitus in childbirth" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.83", + "display": "Other pre-existing diabetes mellitus in the puerperium" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.111", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, first trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.112", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, second trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.113", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, third trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.119", + "display": "Pre-existing type 2 diabetes mellitus, in pregnancy, unspecified trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.311", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, first trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.312", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, second trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.313", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, third trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.319", + "display": "Unspecified pre-existing diabetes mellitus in pregnancy, unspecified trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.811", + "display": "Other pre-existing diabetes mellitus in pregnancy, first trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.812", + "display": "Other pre-existing diabetes mellitus in pregnancy, second trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.813", + "display": "Other pre-existing diabetes mellitus in pregnancy, third trimester" + } + ] + }, + { + "system": "ICD10CM", + "version": "2017", + "concept": [ + { + "code": "O24.819", + "display": "Other pre-existing diabetes mellitus in pregnancy, unspecified trimester" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.113883.3.464.1003.198.11.1024.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.113883.3.464.1003.198.11.1024.json new file mode 100644 index 00000000000..661647b2a79 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.113883.3.464.1003.198.11.1024.json @@ -0,0 +1,64 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.113883.3.464.1003.198.11.1024", + "status": "draft", + "compose": { + "include": [ + { + "system": "LOINC", + "concept": [ + { + "code": "17856-6", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood by HPLC" + } + ] + }, + { + "system": "LOINC", + "concept": [ + { + "code": "4548-4", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood" + } + ] + }, + { + "system": "LOINC", + "concept": [ + { + "code": "4549-2", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood by Electrophoresis" + } + ] + }, + { + "system": "LOINC", + "concept": [ + { + "code": "17856-6", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood by HPLC" + } + ] + }, + { + "system": "LOINC", + "concept": [ + { + "code": "4548-4", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood" + } + ] + }, + { + "system": "LOINC", + "concept": [ + { + "code": "4549-2", + "display": "Hemoglobin A1c/Hemoglobin.total in Blood by Electrophoresis" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4003.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4003.json new file mode 100644 index 00000000000..fc43c7a9634 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4003.json @@ -0,0 +1,250 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.4003", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "243617008", + "display": "Bunyavirus serogroup California" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "64979004", + "display": "California encephalitis virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "243601002", + "display": "Eastern equine encephalitis virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "9194001", + "display": "Jamestown Canyon virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "61399004", + "display": "Keystone virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "30434006", + "display": "La Crosse virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "45838003", + "display": "Powassan virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "58432001", + "display": "St. Louis encephalitis virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "28732002", + "display": "Snowshoe hare virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "87919008", + "display": "Trivittatus virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "57311007", + "display": "West Nile virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "11428003", + "display": "Western equine encephalomyelitis virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "243617008", + "display": "Bunyavirus serogroup California" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "64979004", + "display": "California encephalitis virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "243601002", + "display": "Eastern equine encephalitis virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "9194001", + "display": "Jamestown Canyon virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "61399004", + "display": "Keystone virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "30434006", + "display": "La Crosse virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "45838003", + "display": "Powassan virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "58432001", + "display": "St. Louis encephalitis virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "28732002", + "display": "Snowshoe hare virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "87919008", + "display": "Trivittatus virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "57311007", + "display": "West Nile virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "11428003", + "display": "Western equine encephalomyelitis virus" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4025.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4025.json new file mode 100644 index 00000000000..8b8eae7b640 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4025.json @@ -0,0 +1,130 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.4025", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "34348001", + "display": "Dengue virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "243604005", + "display": "Dengue virus subgroup" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "60588009", + "display": "Dengue virus, type 1" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "41328007", + "display": "Dengue virus, type 2" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "8467002", + "display": "Dengue virus, type 3" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "36700002", + "display": "Dengue virus, type 4" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "34348001", + "display": "Dengue virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "243604005", + "display": "Dengue virus subgroup" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "60588009", + "display": "Dengue virus, type 1" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "41328007", + "display": "Dengue virus, type 2" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "8467002", + "display": "Dengue virus, type 3" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "36700002", + "display": "Dengue virus, type 4" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4120.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4120.json new file mode 100644 index 00000000000..c2aa03d541b --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4120.json @@ -0,0 +1,570 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.4120", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "51663-3", + "display": "Alphavirus RNA [Presence] in Unspecified specimen by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "44074-3", + "display": "Arbovirus Ab [Interpretation] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "36899-3", + "display": "Arbovirus Ab [Identifier] in Unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "36895-1", + "display": "Arbovirus Ab [Identifier] in Unspecified specimen by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "50034-8", + "display": "Arbovirus Ab [Identifier] in Unspecified specimen by Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6309-9", + "display": "Arbovirus identified in Blood by Organism specific culture" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "53804-1", + "display": "Arbovirus IgG panel - Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "53802-5", + "display": "Arbovirus IgG Ab [Interpretation] in Serum by Immunofluorescence Narrative" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "43905-9", + "display": "Arbovirus IgG Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "49094-6", + "display": "Arbovirus IgG and IgM panel - Cerebral spinal fluid by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "49093-8", + "display": "Arbovirus IgG and IgM panel - Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "74032-4", + "display": "Arbovirus IgM panel - Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "40584-5", + "display": "Arbovirus IgM Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "74033-2", + "display": "Arbovirus IgM Ab [Presence] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31223-1", + "display": "Arbovirus NOS Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "43092-6", + "display": "Arbovirus NOS Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "26014-1", + "display": "Arbovirus NOS Ab [Titer] in Serum by Complement fixation" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "74031-6", + "display": "Arbovirus identified in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6310-7", + "display": "Arbovirus identified in Unspecified specimen by Organism specific culture" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "71699-3", + "display": "Flavivirus Ag [Presence] in Unspecified specimen by Immune stain" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86857-0", + "display": "Flavivirus neutralizing antibody [Presence] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "51665-8", + "display": "Flavivirus RNA [Presence] in Unspecified specimen by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "49114-2", + "display": "Flavivirus rRNA [Units/volume] (viral load) in Blood by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6406-3", + "display": "Flavivirus identified in Unspecified specimen by Organism specific culture" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80205-8", + "display": "Japanese encephalitis+Tick-borne encephalitis+West Nile+Yellow fever virus \nIgG Ab [Presence] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80206-6", + "display": "Japanese encephalitis+Tick-borne encephalitis+West Nile+Yellow fever virus \nIgM Ab [Presence] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82465-6", + "display": "Mosquito identified [Type] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82464-9", + "display": "Mosquito count [#] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "51663-3", + "display": "Alphavirus RNA [Presence] in Unspecified specimen by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "44074-3", + "display": "Arbovirus Ab [Interpretation] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "36899-3", + "display": "Arbovirus Ab [Identifier] in Unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "36895-1", + "display": "Arbovirus Ab [Identifier] in Unspecified specimen by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "50034-8", + "display": "Arbovirus Ab [Identifier] in Unspecified specimen by Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6309-9", + "display": "Arbovirus identified in Blood by Organism specific culture" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "53804-1", + "display": "Arbovirus IgG panel - Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "53802-5", + "display": "Arbovirus IgG Ab [Interpretation] in Serum by Immunofluorescence Narrative" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "43905-9", + "display": "Arbovirus IgG Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "49094-6", + "display": "Arbovirus IgG and IgM panel - Cerebral spinal fluid by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "49093-8", + "display": "Arbovirus IgG and IgM panel - Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "74032-4", + "display": "Arbovirus IgM panel - Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "40584-5", + "display": "Arbovirus IgM Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "74033-2", + "display": "Arbovirus IgM Ab [Presence] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31223-1", + "display": "Arbovirus NOS Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "43092-6", + "display": "Arbovirus NOS Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "26014-1", + "display": "Arbovirus NOS Ab [Titer] in Serum by Complement fixation" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "74031-6", + "display": "Arbovirus identified in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6310-7", + "display": "Arbovirus identified in Unspecified specimen by Organism specific culture" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "71699-3", + "display": "Flavivirus Ag [Presence] in Unspecified specimen by Immune stain" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86857-0", + "display": "Flavivirus neutralizing antibody [Presence] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "51665-8", + "display": "Flavivirus RNA [Presence] in Unspecified specimen by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "49114-2", + "display": "Flavivirus rRNA [Units/volume] (viral load) in Blood by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6406-3", + "display": "Flavivirus identified in Unspecified specimen by Organism specific culture" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80205-8", + "display": "Japanese encephalitis+Tick-borne encephalitis+West Nile+Yellow fever virus \nIgG Ab [Presence] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80206-6", + "display": "Japanese encephalitis+Tick-borne encephalitis+West Nile+Yellow fever virus \nIgM Ab [Presence] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82465-6", + "display": "Mosquito identified [Type] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82464-9", + "display": "Mosquito count [#] in Environmental specimen" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4141.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4141.json new file mode 100644 index 00000000000..ccf8a004c06 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.4141.json @@ -0,0 +1,1470 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.4141", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81154-7", + "display": "Dengue and Chikungunya and Zika virus panel by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81151-3", + "display": "Dengue virus 1+2+3+4 5' UTR RNA [Presence] in Cerebral spinal fluid by \nProbe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81150-5", + "display": "Dengue virus 1+2+3+4 5' UTR RNA [Presence] in Serum by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "77958-7", + "display": "Dengue virus 1 and 2 and 3 and 4 RNA [Identifier] in Cerebral spinal fluid \nby Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82519-0", + "display": "Dengue virus 1+3 and 2+4 panel - Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82384-9", + "display": "Dengue virus 1+3 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82383-1", + "display": "Dengue virus 2+4 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16740-3", + "display": "Dengue virus Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "40748-6", + "display": "Dengue virus Ab [Presence] in Serum by Hemagglutination inhibition" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7859-2", + "display": "Dengue virus Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "33606-5", + "display": "Dengue virus Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "40515-9", + "display": "Dengue virus Ab [Titer] in Serum by Complement fixation" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "55369-3", + "display": "Dengue virus Ab [Titer] in Serum by Hemagglutination inhibition" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "33578-6", + "display": "Dengue virus Ab [Titer] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "55438-6", + "display": "Dengue virus Ab [Titer] in Serum by Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31343-7", + "display": "Dengue virus Ab [Presence] in Unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "50036-3", + "display": "Dengue virus Ab [Presence] in Unspecified specimen by Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31342-9", + "display": "Dengue virus Ab [Units/volume] in Unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31798-2", + "display": "Dengue virus Ag [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6384-2", + "display": "Dengue virus Ag [Presence] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31799-0", + "display": "Dengue virus Ag [Presence] in Unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6385-9", + "display": "Dengue virus Ag [Presence] in Unspecified specimen by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6386-7", + "display": "Dengue virus DNA [Presence] in Serum by DNA probe" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6387-5", + "display": "Dengue virus DNA [Presence] in Unspecified specimen by DNA probe" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "23991-3", + "display": "Dengue virus IgG Ab [Units/volume] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "29676-4", + "display": "Dengue virus IgG Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "29661-6", + "display": "Dengue virus IgG Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "23958-2", + "display": "Dengue virus IgG Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6811-4", + "display": "Dengue virus IgG Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "41878-0", + "display": "Dengue virus IgG and IgM panel [Units/volume] - Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "51785-4", + "display": "Dengue virus IgG and IgM [Interpretation] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "75223-8", + "display": "Dengue virus IgG and IgM [Identifier] in Serum, Plasma or Blood by Rapid \nimmunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "34721-1", + "display": "Dengue virus IgM Ab [Presence] in Cerebral spinal fluid" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "23992-1", + "display": "Dengue virus IgM Ab [Units/volume] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "25338-5", + "display": "Dengue virus IgM Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "29663-2", + "display": "Dengue virus IgM Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "25392-2", + "display": "Dengue virus IgM Ab [Presence] in Serum by Immunoblot" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "23968-1", + "display": "Dengue virus IgM Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6812-2", + "display": "Dengue virus IgM Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "75377-2", + "display": "Dengue virus NS1 Ag [Presence] in Serum, Plasma or Blood by Rapid immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "22250-5", + "display": "Dengue virus 1 Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7854-3", + "display": "Dengue virus 1 Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31338-7", + "display": "Dengue virus 1 Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16736-1", + "display": "Dengue virus 1 Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86860-4", + "display": "Dengue virus 1 neutralizing antibody [Titer] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86865-3", + "display": "Dengue virus 1 neutralizing antibody [Presence] in Unspecified specimen \nby Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60262-3", + "display": "Dengue virus 1 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7855-0", + "display": "Dengue virus 1+2+3+4 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "22251-3", + "display": "Dengue virus 2 Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7856-8", + "display": "Dengue virus 2 Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31339-5", + "display": "Dengue virus 2 Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16737-9", + "display": "Dengue virus 2 Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86858-8", + "display": "Dengue virus 2 neutralizing antibody [Titer] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86864-6", + "display": "Dengue virus 2 neutralizing antibody [Presence] in Unspecified specimen \nby Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60420-7", + "display": "Dengue virus 2 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "22252-1", + "display": "Dengue virus 3 Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7857-6", + "display": "Dengue virus 3 Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31340-3", + "display": "Dengue virus 3 Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16738-7", + "display": "Dengue virus 3 Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86859-6", + "display": "Dengue virus 3 neutralizing antibody [Titer] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86863-8", + "display": "Dengue virus 3 neutralizing antibody [Presence] in Unspecified specimen \nby Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60419-9", + "display": "Dengue virus 3 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "22253-9", + "display": "Dengue virus 4 Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7858-4", + "display": "Dengue virus 4 Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31341-1", + "display": "Dengue virus 4 Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16739-5", + "display": "Dengue virus 4 Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86861-2", + "display": "Dengue virus 4 neutralizing antibody [Titer] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86862-0", + "display": "Dengue virus 4 neutralizing antibody [Presence] in Unspecified specimen \nby Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60418-1", + "display": "Dengue virus 4 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6382-6", + "display": "Deprecated Dengue virus Ab in serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6383-4", + "display": "Deprecated Dengue virus Ab in unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82465-6", + "display": "Mosquito identified [Type] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82464-9", + "display": "Mosquito count [#] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81154-7", + "display": "Dengue and Chikungunya and Zika virus panel by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81151-3", + "display": "Dengue virus 1+2+3+4 5' UTR RNA [Presence] in Cerebral spinal fluid by \nProbe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81150-5", + "display": "Dengue virus 1+2+3+4 5' UTR RNA [Presence] in Serum by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "77958-7", + "display": "Dengue virus 1 and 2 and 3 and 4 RNA [Identifier] in Cerebral spinal fluid \nby Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82519-0", + "display": "Dengue virus 1+3 and 2+4 panel - Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82384-9", + "display": "Dengue virus 1+3 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82383-1", + "display": "Dengue virus 2+4 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16740-3", + "display": "Dengue virus Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "40748-6", + "display": "Dengue virus Ab [Presence] in Serum by Hemagglutination inhibition" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7859-2", + "display": "Dengue virus Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "33606-5", + "display": "Dengue virus Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "40515-9", + "display": "Dengue virus Ab [Titer] in Serum by Complement fixation" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "55369-3", + "display": "Dengue virus Ab [Titer] in Serum by Hemagglutination inhibition" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "33578-6", + "display": "Dengue virus Ab [Titer] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "55438-6", + "display": "Dengue virus Ab [Titer] in Serum by Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31343-7", + "display": "Dengue virus Ab [Presence] in Unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "50036-3", + "display": "Dengue virus Ab [Presence] in Unspecified specimen by Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31342-9", + "display": "Dengue virus Ab [Units/volume] in Unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31798-2", + "display": "Dengue virus Ag [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6384-2", + "display": "Dengue virus Ag [Presence] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31799-0", + "display": "Dengue virus Ag [Presence] in Unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6385-9", + "display": "Dengue virus Ag [Presence] in Unspecified specimen by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6386-7", + "display": "Dengue virus DNA [Presence] in Serum by DNA probe" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6387-5", + "display": "Dengue virus DNA [Presence] in Unspecified specimen by DNA probe" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "23991-3", + "display": "Dengue virus IgG Ab [Units/volume] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "29676-4", + "display": "Dengue virus IgG Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "29661-6", + "display": "Dengue virus IgG Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "23958-2", + "display": "Dengue virus IgG Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6811-4", + "display": "Dengue virus IgG Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "41878-0", + "display": "Dengue virus IgG and IgM panel [Units/volume] - Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "51785-4", + "display": "Dengue virus IgG and IgM [Interpretation] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "75223-8", + "display": "Dengue virus IgG and IgM [Identifier] in Serum, Plasma or Blood by Rapid \nimmunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "34721-1", + "display": "Dengue virus IgM Ab [Presence] in Cerebral spinal fluid" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "23992-1", + "display": "Dengue virus IgM Ab [Units/volume] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "25338-5", + "display": "Dengue virus IgM Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "29663-2", + "display": "Dengue virus IgM Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "25392-2", + "display": "Dengue virus IgM Ab [Presence] in Serum by Immunoblot" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "23968-1", + "display": "Dengue virus IgM Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6812-2", + "display": "Dengue virus IgM Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "75377-2", + "display": "Dengue virus NS1 Ag [Presence] in Serum, Plasma or Blood by Rapid immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "22250-5", + "display": "Dengue virus 1 Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7854-3", + "display": "Dengue virus 1 Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31338-7", + "display": "Dengue virus 1 Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16736-1", + "display": "Dengue virus 1 Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86860-4", + "display": "Dengue virus 1 neutralizing antibody [Titer] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86865-3", + "display": "Dengue virus 1 neutralizing antibody [Presence] in Unspecified specimen \nby Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60262-3", + "display": "Dengue virus 1 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7855-0", + "display": "Dengue virus 1+2+3+4 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "22251-3", + "display": "Dengue virus 2 Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7856-8", + "display": "Dengue virus 2 Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31339-5", + "display": "Dengue virus 2 Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16737-9", + "display": "Dengue virus 2 Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86858-8", + "display": "Dengue virus 2 neutralizing antibody [Titer] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86864-6", + "display": "Dengue virus 2 neutralizing antibody [Presence] in Unspecified specimen \nby Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60420-7", + "display": "Dengue virus 2 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "22252-1", + "display": "Dengue virus 3 Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7857-6", + "display": "Dengue virus 3 Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31340-3", + "display": "Dengue virus 3 Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16738-7", + "display": "Dengue virus 3 Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86859-6", + "display": "Dengue virus 3 neutralizing antibody [Titer] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86863-8", + "display": "Dengue virus 3 neutralizing antibody [Presence] in Unspecified specimen \nby Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60419-9", + "display": "Dengue virus 3 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "22253-9", + "display": "Dengue virus 4 Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "7858-4", + "display": "Dengue virus 4 Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "31341-1", + "display": "Dengue virus 4 Ab [Units/volume] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "16739-5", + "display": "Dengue virus 4 Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86861-2", + "display": "Dengue virus 4 neutralizing antibody [Titer] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86862-0", + "display": "Dengue virus 4 neutralizing antibody [Presence] in Unspecified specimen \nby Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60418-1", + "display": "Dengue virus 4 RNA [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6382-6", + "display": "Deprecated Dengue virus Ab in serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "6383-4", + "display": "Deprecated Dengue virus Ab in unspecified specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82465-6", + "display": "Mosquito identified [Type] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82464-9", + "display": "Mosquito count [#] in Environmental specimen" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7339.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7339.json new file mode 100644 index 00000000000..ce7d5f64d1b --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7339.json @@ -0,0 +1,430 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.7339", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "26623-9", + "display": "Chikungunya virus Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "74821-0", + "display": "Chikungunya virus Ab [Presence] in Serum by Hemagglutination inhibition" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "43064-5", + "display": "Chikungunya virus Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "40505-0", + "display": "Chikungunya virus Ab [Titer] in Serum by Hemagglutination inhibition" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82297-3", + "display": "Chikungunya virus structural proteins (E1+E2) IgG Ab [Presence] in Serum \nby Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "83068-7", + "display": "Chikungunya virus structural proteins (E1+E2) IgG Ab [Units/volume] in \nSerum or Plasma by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "83067-9", + "display": "Chikungunya virus structural proteins (E1+E2) IgM Ab [Units/volume] in \nSerum or Plasma by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "56129-0", + "display": "Chikungunya virus IgG Ab [Presence] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "56128-2", + "display": "Chikungunya virus IgG Ab [Titer] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "57934-2", + "display": "Chikungunya virus IgM Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "56131-6", + "display": "Chikungunya virus IgM Ab [Presence] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "56130-8", + "display": "Chikungunya virus IgM Ab [Titer] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81153-9", + "display": "Chikungunya virus non-structural protein 1 (nsP1) RNA [Presence] in Cerebral \nspinal fluid by Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81152-1", + "display": "Chikungunya virus non-structural protein 1 (nsP1) RNA [Presence] in Serum \nby Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86514-7", + "display": "Chikungunya virus RNA [Presence] in Amniotic fluid by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60260-7", + "display": "Chikungunya virus RNA [Presence] in Serum or Plasma by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86515-4", + "display": "Chikungunya virus RNA [Presence] in Urine by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "51664-1", + "display": "Chikungunya virus RNA [Presence] in Unspecified specimen by Probe and \ntarget amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81154-7", + "display": "Dengue and Chikungunya and Zika virus panel by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82465-6", + "display": "Mosquito identified [Type] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82464-9", + "display": "Mosquito count [#] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "26623-9", + "display": "Chikungunya virus Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "74821-0", + "display": "Chikungunya virus Ab [Presence] in Serum by Hemagglutination inhibition" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "43064-5", + "display": "Chikungunya virus Ab [Titer] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "40505-0", + "display": "Chikungunya virus Ab [Titer] in Serum by Hemagglutination inhibition" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82297-3", + "display": "Chikungunya virus structural proteins (E1+E2) IgG Ab [Presence] in Serum \nby Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "83068-7", + "display": "Chikungunya virus structural proteins (E1+E2) IgG Ab [Units/volume] in \nSerum or Plasma by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "83067-9", + "display": "Chikungunya virus structural proteins (E1+E2) IgM Ab [Units/volume] in \nSerum or Plasma by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "56129-0", + "display": "Chikungunya virus IgG Ab [Presence] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "56128-2", + "display": "Chikungunya virus IgG Ab [Titer] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "57934-2", + "display": "Chikungunya virus IgM Ab [Presence] in Serum" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "56131-6", + "display": "Chikungunya virus IgM Ab [Presence] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "56130-8", + "display": "Chikungunya virus IgM Ab [Titer] in Serum or Plasma by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81153-9", + "display": "Chikungunya virus non-structural protein 1 (nsP1) RNA [Presence] in Cerebral \nspinal fluid by Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81152-1", + "display": "Chikungunya virus non-structural protein 1 (nsP1) RNA [Presence] in Serum \nby Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86514-7", + "display": "Chikungunya virus RNA [Presence] in Amniotic fluid by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "60260-7", + "display": "Chikungunya virus RNA [Presence] in Serum or Plasma by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86515-4", + "display": "Chikungunya virus RNA [Presence] in Urine by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "51664-1", + "display": "Chikungunya virus RNA [Presence] in Unspecified specimen by Probe and \ntarget amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81154-7", + "display": "Dengue and Chikungunya and Zika virus panel by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82465-6", + "display": "Mosquito identified [Type] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82464-9", + "display": "Mosquito count [#] in Environmental specimen" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7343.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7343.json new file mode 100644 index 00000000000..8e20cfc9a75 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7343.json @@ -0,0 +1,30 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.7343", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "2423009", + "display": "Chikungunya virus" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "2423009", + "display": "Chikungunya virus" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7457.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7457.json new file mode 100644 index 00000000000..69f9889e2e1 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7457.json @@ -0,0 +1,1190 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.7457", + "status": "draft", + "compose": { + "include": [ + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "VIR", + "display": "VIRGIN ISLANDS, U.S." + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ASM", + "display": "AMERICAN SAMOA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "AIA", + "display": "ANGUILLA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ATG", + "display": "ANTIGUA AND BARBUDA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ARG", + "display": "ARGENTINA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ABW", + "display": "ARUBA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BHS", + "display": "BAHAMAS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BRB", + "display": "BARBADOS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BLZ", + "display": "BELIZE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BOL", + "display": "BOLIVIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BES", + "display": "BONAIRE, SINT EUSTATIUS and SABA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BRA", + "display": "BRAZIL" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CPV", + "display": "CAPE VERDE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CYM", + "display": "CAYMAN ISLANDS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "COL", + "display": "COLOMBIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CRI", + "display": "COSTA RICA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CUB", + "display": "CUBA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CUW", + "display": "CURACAO" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "DMA", + "display": "DOMINICA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "DOM", + "display": "DOMINICAN REPUBLIC" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ECU", + "display": "ECUADOR" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "SLV", + "display": "EL SALVADOR" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "FJI", + "display": "FIJI" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GUF", + "display": "FRENCH GUIANA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GRD", + "display": "GRENADA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GLP", + "display": "GUADELOUPE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GTM", + "display": "GUATEMALA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GUY", + "display": "GUYANA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "HTI", + "display": "HAITI" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "HND", + "display": "HONDURAS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "JAM", + "display": "JAMAICA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "FSM", + "display": "KOSRAE, FEDERATED STATES OF MICRONESIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MHL", + "display": "MARSHALL ISLANDS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MTQ", + "display": "MARTINIQUE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MEX", + "display": "MEXICO" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MSR", + "display": "MONTSERRAT" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "NCL", + "display": "NEW CALEDONIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "NIC", + "display": "NICARAGUA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PLW", + "display": "PALAU" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PAN", + "display": "PANAMA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PNG", + "display": "PAPUA NEW GUINEA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PRY", + "display": "PARAGUAY" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PER", + "display": "PERU" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PRI", + "display": "PUERTO RICO" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BLM", + "display": "SAINT BARTHÉLEMY" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "KNA", + "display": "SAINT KITTS AND NEVIS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "LCA", + "display": "SAINT LUCIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MAF", + "display": "SAINT MARTIN (FRENCH PART)" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "VCT", + "display": "SAINT VINCENT AND THE GRENADINES" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "WSM", + "display": "SAMOA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "SGP", + "display": "SINGAPORE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "SXM", + "display": "SINT MAARTEN (DUTCH PART)" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "SUR", + "display": "SURINAME" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "TON", + "display": "TONGA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "TTO", + "display": "TRINIDAD AND TOBAGO" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "TCA", + "display": "TURKS AND CAICOS ISLANDS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "USA", + "display": "UNITED STATES" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "VEN", + "display": "VENEZUELA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "VGB", + "display": "VIRGIN ISLANDS, BRITISH" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "VIR", + "display": "VIRGIN ISLANDS, U.S." + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ASM", + "display": "AMERICAN SAMOA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "AIA", + "display": "ANGUILLA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ATG", + "display": "ANTIGUA AND BARBUDA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ARG", + "display": "ARGENTINA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ABW", + "display": "ARUBA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BHS", + "display": "BAHAMAS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BRB", + "display": "BARBADOS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BLZ", + "display": "BELIZE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BOL", + "display": "BOLIVIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BES", + "display": "BONAIRE, SINT EUSTATIUS and SABA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BRA", + "display": "BRAZIL" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CPV", + "display": "CAPE VERDE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CYM", + "display": "CAYMAN ISLANDS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "COL", + "display": "COLOMBIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CRI", + "display": "COSTA RICA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CUB", + "display": "CUBA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "CUW", + "display": "CURACAO" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "DMA", + "display": "DOMINICA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "DOM", + "display": "DOMINICAN REPUBLIC" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "ECU", + "display": "ECUADOR" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "SLV", + "display": "EL SALVADOR" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "FJI", + "display": "FIJI" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GUF", + "display": "FRENCH GUIANA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GRD", + "display": "GRENADA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GLP", + "display": "GUADELOUPE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GTM", + "display": "GUATEMALA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "GUY", + "display": "GUYANA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "HTI", + "display": "HAITI" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "HND", + "display": "HONDURAS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "JAM", + "display": "JAMAICA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "FSM", + "display": "KOSRAE, FEDERATED STATES OF MICRONESIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MHL", + "display": "MARSHALL ISLANDS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MTQ", + "display": "MARTINIQUE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MEX", + "display": "MEXICO" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MSR", + "display": "MONTSERRAT" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "NCL", + "display": "NEW CALEDONIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "NIC", + "display": "NICARAGUA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PLW", + "display": "PALAU" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PAN", + "display": "PANAMA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PNG", + "display": "PAPUA NEW GUINEA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PRY", + "display": "PARAGUAY" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PER", + "display": "PERU" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "PRI", + "display": "PUERTO RICO" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "BLM", + "display": "SAINT BARTHÉLEMY" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "KNA", + "display": "SAINT KITTS AND NEVIS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "LCA", + "display": "SAINT LUCIA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "MAF", + "display": "SAINT MARTIN (FRENCH PART)" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "VCT", + "display": "SAINT VINCENT AND THE GRENADINES" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "WSM", + "display": "SAMOA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "SGP", + "display": "SINGAPORE" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "SXM", + "display": "SINT MAARTEN (DUTCH PART)" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "SUR", + "display": "SURINAME" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "TON", + "display": "TONGA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "TTO", + "display": "TRINIDAD AND TOBAGO" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "TCA", + "display": "TURKS AND CAICOS ISLANDS" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "USA", + "display": "UNITED STATES" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "VEN", + "display": "VENEZUELA" + } + ] + }, + { + "system": "urn:iso:std:iso:3166", + "version": "1997", + "concept": [ + { + "code": "VGB", + "display": "VIRGIN ISLANDS, BRITISH" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7459.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7459.json new file mode 100644 index 00000000000..f2f4737a0f8 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7459.json @@ -0,0 +1,150 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.7459", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "84387000", + "display": "No Symptoms" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "271749004", + "display": "Acute rise of fever" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "47725002", + "display": "Maculopapular eruption" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "57676002", + "display": "Joint pain" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "9826008", + "display": "Inflammation of conjunctiva" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "68962001", + "display": "Muscle pain" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "25064002", + "display": "Pain in head" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "84387000", + "display": "No Symptoms" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "271749004", + "display": "Acute rise of fever" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "47725002", + "display": "Maculopapular eruption" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "57676002", + "display": "Joint pain" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "9826008", + "display": "Inflammation of conjunctiva" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "68962001", + "display": "Muscle pain" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "25064002", + "display": "Pain in head" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7460.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7460.json new file mode 100644 index 00000000000..fe6251b1076 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7460.json @@ -0,0 +1,550 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.7460", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "386661006", + "display": "Fever" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "43724002", + "display": "Chills/ Rigors" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "271795006", + "display": "Fatigue and Malaise" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "271807003", + "display": "Rash" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "68962001", + "display": "Myalgia" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "57676002", + "display": "Arthralgia" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "3723001", + "display": "Arthritis" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "25064002", + "display": "Headache" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "44695005", + "display": "Paralysis or Paresis" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "161882006", + "display": "Stiff Neck" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "20262006", + "display": "Ataxia" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "32798002", + "display": "Parkinsonism" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "419284004", + "display": "Altered Mental Status" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "91175000", + "display": "Seizures" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "9826008", + "display": "Conjunctivitis" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1400", + "display": "Retro-orbital Pain (pain behind eye)" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "422587007", + "display": "Nausea" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "422400008", + "display": "Emesis" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "62315008", + "display": "Diarrhea" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "21522001", + "display": "Abdominal pain / Tenderness" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "196746003", + "display": "Persistent vomiting" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "80515008", + "display": "Liver enlargement (Hepatomegaly)" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1401", + "display": "Extravascular Fluid Accumulation (e.g. Pleural, Pericardial effusion, \nAscites)" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1402", + "display": "Mucosal Bleeding (e.g. Epistaxis - nose bleeding, gastrointestinal bleeding)" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1403", + "display": "Severe plasma leakage (shock, pleural effusion)" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1404", + "display": "Severe bleeding" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1405", + "display": "Severe Organ Involvement (Liver, Heart, Neurologic  - central nervous \nsystem)" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "386661006", + "display": "Fever" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "43724002", + "display": "Chills/ Rigors" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "271795006", + "display": "Fatigue and Malaise" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "271807003", + "display": "Rash" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "68962001", + "display": "Myalgia" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "57676002", + "display": "Arthralgia" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "3723001", + "display": "Arthritis" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "25064002", + "display": "Headache" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "44695005", + "display": "Paralysis or Paresis" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "161882006", + "display": "Stiff Neck" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "20262006", + "display": "Ataxia" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "32798002", + "display": "Parkinsonism" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "419284004", + "display": "Altered Mental Status" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "91175000", + "display": "Seizures" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "9826008", + "display": "Conjunctivitis" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1400", + "display": "Retro-orbital Pain (pain behind eye)" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "422587007", + "display": "Nausea" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "422400008", + "display": "Emesis" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "62315008", + "display": "Diarrhea" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "21522001", + "display": "Abdominal pain / Tenderness" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "196746003", + "display": "Persistent vomiting" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "80515008", + "display": "Liver enlargement (Hepatomegaly)" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1401", + "display": "Extravascular Fluid Accumulation (e.g. Pleural, Pericardial effusion, \nAscites)" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1402", + "display": "Mucosal Bleeding (e.g. Epistaxis - nose bleeding, gastrointestinal bleeding)" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1403", + "display": "Severe plasma leakage (shock, pleural effusion)" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1404", + "display": "Severe bleeding" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1405", + "display": "Severe Organ Involvement (Liver, Heart, Neurologic  - central nervous \nsystem)" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7476.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7476.json new file mode 100644 index 00000000000..894406ad2f5 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7476.json @@ -0,0 +1,90 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.7476", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "42425007", + "display": "Equivocal" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "260385009", + "display": "Negative" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "10828004", + "display": "Positive" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "373121007", + "display": "Test not done" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "42425007", + "display": "Equivocal" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "260385009", + "display": "Negative" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "10828004", + "display": "Positive" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "373121007", + "display": "Test not done" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7477.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7477.json new file mode 100644 index 00000000000..fe1735c8c20 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7477.json @@ -0,0 +1,90 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.7477", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1446", + "display": ">= 4 fold rise" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "260385009", + "display": "Negative" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "10828004", + "display": "Positive" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "373121007", + "display": "Test not done" + } + ] + }, + { + "system": "http://example.com", + "version": "02/23/2017", + "concept": [ + { + "code": "PHC1446", + "display": ">= 4 fold rise" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "260385009", + "display": "Negative" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "10828004", + "display": "Positive" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "20160901", + "concept": [ + { + "code": "373121007", + "display": "Test not done" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7480.json b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7480.json new file mode 100644 index 00000000000..a9b93185530 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/resources/valuesets/2.16.840.1.114222.4.11.7480.json @@ -0,0 +1,590 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.114222.4.11.7480", + "status": "draft", + "compose": { + "include": [ + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81154-7", + "display": "Dengue and Chikungunya and Zika virus panel by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82465-6", + "display": "Mosquito identified [Type] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82464-9", + "display": "Mosquito count [#] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81149-7", + "display": "Zika virus envelope (E) gene [Presence] in Amniotic fluid by Probe and \ntarget amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80826-1", + "display": "Zika virus envelope (E) gene [Presence] in Cerebral spinal fluid by Probe \nand target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80825-3", + "display": "Zika virus envelope (E) gene [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81148-9", + "display": "Zika virus envelope (E) gene [Presence] in Urine by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80618-2", + "display": "Zika virus IgM Ab [Units/volume] in Cerebral spinal fluid by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80823-8", + "display": "Zika virus IgM Ab [Presence] in Cerebral spinal fluid by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80619-0", + "display": "Zika virus IgM Ab [Units/volume] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80824-6", + "display": "Zika virus IgM Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82731-1", + "display": "Zika virus IgM Ab [Presence] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80821-2", + "display": "Zika virus neutralizing antibody [Presence] in Cerebral spinal fluid by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80822-0", + "display": "Zika virus neutralizing antibody [Presence] in Serum by Neutralization \ntest" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80624-0", + "display": "Zika virus neutralizing antibody [Titer] in Cerebral spinal fluid by Neutralization \ntest --1st specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80622-4", + "display": "Zika virus neutralizing antibody [Titer] in Serum by Neutralization test \n--1st specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80625-7", + "display": "Zika virus neutralizing antibody [Titer] in Cerebral spinal fluid by Neutralization \ntest --2nd specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80623-2", + "display": "Zika virus neutralizing antibody [Titer] in Serum by Neutralization test \n--2nd specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80621-6", + "display": "Zika virus neutralizing antibody [Titer] in Cerebral spinal fluid by Neutralization \ntest" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80620-8", + "display": "Zika virus neutralizing antibody [Titer] in Serum by Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86321-7", + "display": "Zika virus neutralizing antibody [Titer] in Unspecified specimen by Neutralization \ntest" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86320-9", + "display": "Zika virus neutralizing antibody [Presence] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "83069-5", + "display": "Zika virus non-structural protein 1 IgG Ab [Units/volume] in Serum or \nPlasma by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "85621-1", + "display": "Zika virus RNA [Presence] in Amniotic fluid by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86594-9", + "display": "Zika virus RNA [Presence] in Cerebral spinal fluid by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86190-6", + "display": "Zika virus RNA [Presence] in Plasma from donor by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "85622-9", + "display": "Zika virus RNA [Presence] in Serum by Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "85623-7", + "display": "Zika virus RNA [Presence] in Urine by Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "79190-5", + "display": "Zika virus RNA [Presence] in Unspecified specimen by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81154-7", + "display": "Dengue and Chikungunya and Zika virus panel by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82465-6", + "display": "Mosquito identified [Type] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82464-9", + "display": "Mosquito count [#] in Environmental specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81149-7", + "display": "Zika virus envelope (E) gene [Presence] in Amniotic fluid by Probe and \ntarget amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80826-1", + "display": "Zika virus envelope (E) gene [Presence] in Cerebral spinal fluid by Probe \nand target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80825-3", + "display": "Zika virus envelope (E) gene [Presence] in Serum by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "81148-9", + "display": "Zika virus envelope (E) gene [Presence] in Urine by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80618-2", + "display": "Zika virus IgM Ab [Units/volume] in Cerebral spinal fluid by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80823-8", + "display": "Zika virus IgM Ab [Presence] in Cerebral spinal fluid by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80619-0", + "display": "Zika virus IgM Ab [Units/volume] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80824-6", + "display": "Zika virus IgM Ab [Presence] in Serum by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "82731-1", + "display": "Zika virus IgM Ab [Presence] in Serum by Immunofluorescence" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80821-2", + "display": "Zika virus neutralizing antibody [Presence] in Cerebral spinal fluid by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80822-0", + "display": "Zika virus neutralizing antibody [Presence] in Serum by Neutralization \ntest" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80624-0", + "display": "Zika virus neutralizing antibody [Titer] in Cerebral spinal fluid by Neutralization \ntest --1st specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80622-4", + "display": "Zika virus neutralizing antibody [Titer] in Serum by Neutralization test \n--1st specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80625-7", + "display": "Zika virus neutralizing antibody [Titer] in Cerebral spinal fluid by Neutralization \ntest --2nd specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80623-2", + "display": "Zika virus neutralizing antibody [Titer] in Serum by Neutralization test \n--2nd specimen" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80621-6", + "display": "Zika virus neutralizing antibody [Titer] in Cerebral spinal fluid by Neutralization \ntest" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "80620-8", + "display": "Zika virus neutralizing antibody [Titer] in Serum by Neutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86321-7", + "display": "Zika virus neutralizing antibody [Titer] in Unspecified specimen by Neutralization \ntest" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86320-9", + "display": "Zika virus neutralizing antibody [Presence] in Unspecified specimen by \nNeutralization test" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "83069-5", + "display": "Zika virus non-structural protein 1 IgG Ab [Units/volume] in Serum or \nPlasma by Immunoassay" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "85621-1", + "display": "Zika virus RNA [Presence] in Amniotic fluid by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86594-9", + "display": "Zika virus RNA [Presence] in Cerebral spinal fluid by Probe and target \namplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "86190-6", + "display": "Zika virus RNA [Presence] in Plasma from donor by Probe and target amplification \nmethod" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "85622-9", + "display": "Zika virus RNA [Presence] in Serum by Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "85623-7", + "display": "Zika virus RNA [Presence] in Urine by Probe and target amplification method" + } + ] + }, + { + "system": "http://loinc.org", + "version": "2.61", + "concept": [ + { + "code": "79190-5", + "display": "Zika virus RNA [Presence] in Unspecified specimen by Probe and target \namplification method" + } + ] + } + ] + } +} + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/about.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/about.html new file mode 100644 index 00000000000..33033992b9f --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/about.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"> + <head th:include="tmpl-head :: head"> + <title>About This Server + + + +
+
+ +
+
+
+ +
+ +
+ +
+
+

About This Server

+
+
+
+ +
+

+ This server provides a nearly complete implementation of the FHIR Specification + using a 100% open source software stack. It is hosted by University Health Network. +

+

+ The architecture in use here is shown in the image on the right. This server is built + from a number of modules of the + HAPI FHIR + project, which is a 100% open-source (Apache 2.0 Licensed) Java based + implementation of the FHIR specification. +

+

+ +

+
+
+
+
+

Data On This Server

+
+
+

+ This server is regularly loaded with a standard set of test data sourced + from UHN's own testing environment. Do not use this server to store any data + that you will need later, as we will be regularly resetting it. +

+

+ This is not a production server and it provides no privacy. Do not store any + confidential data here. +

+
+
+ +
+
+
+ +
+
+ + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/tmpl-footer.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/tmpl-footer.html new file mode 100644 index 00000000000..5b87f43f1eb --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/tmpl-footer.html @@ -0,0 +1,16 @@ + + +
+ +
+ diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/tmpl-home-welcome.html b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/tmpl-home-welcome.html new file mode 100644 index 00000000000..840a15d7e3f --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/templates/tmpl-home-welcome.html @@ -0,0 +1,52 @@ + + +
+ +

+ This is the home for the FHIR test server operated by + University Health Network. This server + (and the testing application you are currently using to access it) + is entirely built using + HAPI-FHIR, + a 100% open-source Java implementation of the + FHIR specification. +

+

+ Here are some things you might wish to try: +

+
    +
  • + View a + list of patients + on this server. +
  • +
  • + Construct a + search query + on this server. +
  • +
  • + Access a + different server + (use the Server menu at the top of the page to see a list of public FHIR servers) +
  • +
+
+ +

+ You are accessing the public FHIR server + . This server is hosted elsewhere on the internet + but is being accessed using the HAPI client implementation. +

+
+

+ + + This is not a production server! + + Do not store any information here that contains personal health information + or any other confidential information. This server will be regularly purged + and reloaded with fixed test data. +

+
+ diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/web.xml b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000000..8d9eea99fb1 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,122 @@ + + + + org.springframework.web.context.ContextLoaderListener + + + contextClass + + org.springframework.web.context.support.AnnotationConfigWebApplicationContext + + + + contextConfigLocation + + ca.uhn.fhir.jpa.cqf.ruler.config.FhirServerConfigDstu3 + + + + + + + cdsServicesServlet + ca.uhn.fhir.jpa.cqf.ruler.servlet.CdsServicesServlet + 3 + + + + spring + org.springframework.web.servlet.DispatcherServlet + + contextClass + org.springframework.web.context.support.AnnotationConfigWebApplicationContext + + + contextConfigLocation + ca.uhn.fhir.jpa.cqf.ruler.config.FhirTesterConfigDstu3 + + 2 + + + + + baseServlet + ca.uhn.fhir.jpa.cqf.ruler.servlet.BaseServlet + + ImplementationDescription + FHIR CQF Ruler-of-All-Knowledge JPA Server + + + FhirVersion + DSTU3 + + 1 + + + + baseServlet + /baseDstu3/* + + + + spring + /tester/* + + + + cdsServicesServlet + /cds-services + + + + cdsServicesServlet + /cds-services/* + + + + + CORS Filter + org.ebaysf.web.cors.CORSFilter + + A comma separated list of allowed origins. Note: An '*' cannot be used for an allowed origin when using credentials. + cors.allowed.origins + http://sandbox.cds-hooks.org, * + + + A comma separated list of HTTP verbs, using which a CORS request can be made. + cors.allowed.methods + GET,POST,PUT,DELETE,OPTIONS + + + A comma separated list of allowed headers when making a non simple CORS request. + cors.allowed.headers + X-FHIR-Starter,Origin,Accept,Authorization,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers + + + A comma separated list non-standard response headers that will be exposed to XHR2 object. + cors.exposed.headers + Location,Content-Location + + + A flag that suggests if CORS is supported with cookies + cors.support.credentials + true + + + A flag to control logging + cors.logging.enabled + true + + + Indicates how long (in seconds) the results of a preflight request can be cached in a preflight result cache. + cors.preflight.maxage + 300 + + + + CORS Filter + /* + + + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/javaee_6.xsd b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/javaee_6.xsd new file mode 100644 index 00000000000..9fb587749ce --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/javaee_6.xsd @@ -0,0 +1,2419 @@ + + + + + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved. + + The contents of this file are subject to the terms of either the + GNU General Public License Version 2 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with + the License. You can obtain a copy of the License at + https://glassfish.dev.java.net/public/CDDL+GPL.html or + glassfish/bootstrap/legal/LICENSE.txt. See the License for the + specific language governing permissions and limitations under the + License. + + When distributing the software, include this License Header + Notice in each file and include the License file at + glassfish/bootstrap/legal/LICENSE.txt. Sun designates this + particular file as subject to the "Classpath" exception as + provided by Sun in the GPL Version 2 section of the License file + that accompanied this code. If applicable, add the following + below the License Header, with the fields enclosed by brackets [] + replaced by your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + Contributor(s): + + If you wish your version of this file to be governed by only the + CDDL or only the GPL Version 2, indicate your decision by adding + "[Contributor] elects to include this software in this + distribution under the [CDDL or GPL Version 2] license." If you + don't indicate a single choice of license, a recipient has the + option to distribute your version of this file under either the + CDDL, the GPL Version 2 or to extend the choice of license to its + licensees as provided above. However, if you add GPL Version 2 + code and therefore, elected the GPL Version 2 license, then the + option applies only if the new code is made subject to such + option by the copyright holder. + + + + + + + + The following definitions that appear in the common + shareable schema(s) of Java EE deployment descriptors should be + interpreted with respect to the context they are included: + + Deployment Component may indicate one of the following: + java ee application; + application client; + web application; + enterprise bean; + resource adapter; + + Deployment File may indicate one of the following: + ear file; + war file; + jar file; + rar file; + + + + + + + + + + + This group keeps the usage of the contained description related + elements consistent across Java EE deployment descriptors. + + All elements may occur multiple times with different languages, + to support localization of the content. + + + + + + + + + + + + + + + This group keeps the usage of the contained JNDI environment + reference elements consistent across Java EE deployment descriptors. + + + + + + + + + + + + + + + + + + + + + + + This group collects elements that are common to most + JNDI resource elements. + + + + + + + + + + The JNDI name to be looked up to resolve a resource reference. + + + + + + + + + + + + This group collects elements that are common to all the + JNDI resource elements. It does not include the lookup-name + element, that is only applicable to some resource elements. + + + + + + + + + A product specific name that this resource should be + mapped to. The name of this resource, as defined by the + resource's name element or defaulted, is a name that is + local to the application component using the resource. + (It's a name in the JNDI java:comp/env namespace.) Many + application servers provide a way to map these local + names to names of resources known to the application + server. This mapped name is often a global JNDI name, + but may be a name of any form. + + Application servers are not required to support any + particular form or type of mapped name, nor the ability + to use mapped names. The mapped name is + product-dependent and often installation-dependent. No + use of a mapped name is portable. + + + + + + + + + + + + + + + + Configuration of a DataSource. + + + + + + + + + Description of this DataSource. + + + + + + + + + The name element specifies the JNDI name of the + data source being defined. + + + + + + + + + DataSource, XADataSource or ConnectionPoolDataSource + implementation class. + + + + + + + + + Database server name. + + + + + + + + + Port number where a server is listening for requests. + + + + + + + + + Name of a database on a server. + + + + + + + + url
property is specified + along with other standard DataSource properties + such as serverName, databaseName + and portNumber, the more specific properties will + take precedence and url will be ignored. + + ]]> + + + + + + + + User name to use for connection authentication. + + + + + + + + + Password to use for connection authentication. + + + + + + + + + JDBC DataSource property. This may be a vendor-specific + property or a less commonly used DataSource property. + + + + + + + + + Sets the maximum time in seconds that this data source + will wait while attempting to connect to a database. + + + + + + + + + Set to false if connections should not participate in + transactions. + + + + + + + + + Isolation level for connections. + + + + + + + + + Number of connections that should be created when a + connection pool is initialized. + + + + + + + + + Maximum number of connections that should be concurrently + allocated for a connection pool. + + + + + + + + + Minimum number of connections that should be concurrently + allocated for a connection pool. + + + + + + + + + The number of seconds that a physical connection should + remain unused in the pool before the connection is + closed for a connection pool. + + + + + + + + + The total number of statements that a connection pool + should keep open. + + + + + + + + + + + + + + + + The description type is used by a description element to + provide text describing the parent element. The elements + that use this type should include any information that the + Deployment Component's Deployment File file producer wants + to provide to the consumer of the Deployment Component's + Deployment File (i.e., to the Deployer). Typically, the + tools used by such a Deployment File consumer will display + the description when processing the parent element that + contains the description. + + The lang attribute defines the language that the + description is provided in. The default value is "en" (English). + + + + + + + + + + + + + + + This type defines a dewey decimal that is used + to describe versions of documents. + + + + + + + + + + + + + + + + Employee Self Service + + + The value of the xml:lang attribute is "en" (English) by default. + + ]]> + + + + + + + + + + + + + + + + EmployeeRecord + + ../products/product.jar#ProductEJB + + ]]> + + + + + + + + + + + + + + + The ejb-local-refType is used by ejb-local-ref elements for + the declaration of a reference to an enterprise bean's local + home or to the local business interface of a 3.0 bean. + The declaration consists of: + + - an optional description + - the EJB reference name used in the code of the Deployment + Component that's referencing the enterprise bean. + - the optional expected type of the referenced enterprise bean + - the optional expected local interface of the referenced + enterprise bean or the local business interface of the + referenced enterprise bean. + - the optional expected local home interface of the referenced + enterprise bean. Not applicable if this ejb-local-ref refers + to the local business interface of a 3.0 bean. + - optional ejb-link information, used to specify the + referenced enterprise bean + - optional elements to define injection of the named enterprise + bean into a component field or property. + + + + + + + + + + + + + + + + + + + + + + ejb/Payroll + + ]]> + + + + + + + + + + + + + + + The ejb-refType is used by ejb-ref elements for the + declaration of a reference to an enterprise bean's home or + to the remote business interface of a 3.0 bean. + The declaration consists of: + + - an optional description + - the EJB reference name used in the code of + the Deployment Component that's referencing the enterprise + bean. + - the optional expected type of the referenced enterprise bean + - the optional remote interface of the referenced enterprise bean + or the remote business interface of the referenced enterprise + bean + - the optional expected home interface of the referenced + enterprise bean. Not applicable if this ejb-ref + refers to the remote business interface of a 3.0 bean. + - optional ejb-link information, used to specify the + referenced enterprise bean + - optional elements to define injection of the named enterprise + bean into a component field or property + + + + + + + + + + + + + + + + + + + + + + + The ejb-ref-typeType contains the expected type of the + referenced enterprise bean. + + The ejb-ref-type designates a value + that must be one of the following: + + Entity + Session + + + + + + + + + + + + + + + + + + + This type is used to designate an empty + element when used. + + + + + + + + + + + + + + The env-entryType is used to declare an application's + environment entry. The declaration consists of an optional + description, the name of the environment entry, a type + (optional if the value is injected, otherwise required), and + an optional value. + + It also includes optional elements to define injection of + the named resource into fields or JavaBeans properties. + + If a value is not specified and injection is requested, + no injection will occur and no entry of the specified name + will be created. This allows an initial value to be + specified in the source code without being incorrectly + changed when no override has been specified. + + If a value is not specified and no injection is requested, + a value must be supplied during deployment. + + This type is used by env-entry elements. + + + + + + + + + minAmount + + ]]> + + + + + + + java.lang.Integer + + ]]> + + + + + + + 100.00 + + ]]> + + + + + + + + + + + + + + + java.lang.Boolean + java.lang.Class + com.example.Color + + ]]> + + + + + + + + + + + + + + + The elements that use this type designate the name of a + Java class or interface. The name is in the form of a + "binary name", as defined in the JLS. This is the form + of name used in Class.forName(). Tools that need the + canonical name (the name used in source code) will need + to convert this binary name to the canonical name. + + + + + + + + + + + + + + + + This type defines four different values which can designate + boolean values. This includes values yes and no which are + not designated by xsd:boolean + + + + + + + + + + + + + + + + + + + + + The icon type contains small-icon and large-icon elements + that specify the file names for small and large GIF, JPEG, + or PNG icon images used to represent the parent element in a + GUI tool. + + The xml:lang attribute defines the language that the + icon file names are provided in. Its value is "en" (English) + by default. + + + + + + + + employee-service-icon16x16.jpg + + ]]> + + + + + + + employee-service-icon32x32.jpg + + ]]> + + + + + + + + + + + + + + + + An injection target specifies a class and a name within + that class into which a resource should be injected. + + The injection target class specifies the fully qualified + class name that is the target of the injection. The + Java EE specifications describe which classes can be an + injection target. + + The injection target name specifies the target within + the specified class. The target is first looked for as a + JavaBeans property name. If not found, the target is + looked for as a field name. + + The specified resource will be injected into the target + during initialization of the class by either calling the + set method for the target property or by setting a value + into the named field. + + + + + + + + + + + + + + The following transaction isolation levels are allowed + (see documentation for the java.sql.Connection interface): + TRANSACTION_READ_UNCOMMITTED + TRANSACTION_READ_COMMITTED + TRANSACTION_REPEATABLE_READ + TRANSACTION_SERIALIZABLE + + + + + + + + + + + + + + + + + + + The java-identifierType defines a Java identifier. + The users of this type should further verify that + the content does not contain Java reserved keywords. + + + + + + + + + + + + + + + + + + This is a generic type that designates a Java primitive + type or a fully qualified name of a Java interface/type, + or an array of such types. + + + + + + + + + + + + + + + + + : + + Example: + + jdbc:mysql://localhost:3307/testdb + + ]]> + + + + + + + + + + + + + + + + + The jndi-nameType type designates a JNDI name in the + Deployment Component's environment and is relative to the + java:comp/env context. A JNDI name must be unique within the + Deployment Component. + + + + + + + + + + + + + + + com.aardvark.payroll.PayrollHome + + ]]> + + + + + + + + + + + + + + + The lifecycle-callback type specifies a method on a + class to be called when a lifecycle event occurs. + Note that each class may have only one lifecycle callback + method for any given event and that the method may not + be overloaded. + + If the lifefycle-callback-class element is missing then + the class defining the callback is assumed to be the + component class in scope at the place in the descriptor + in which the callback definition appears. + + + + + + + + + + + + + + + + + The listenerType indicates the deployment properties for a web + application listener bean. + + + + + + + + + + The listener-class element declares a class in the + application must be registered as a web + application listener bean. The value is the fully + qualified classname of the listener class. + + + + + + + + + + + + + + + + The localType defines the fully-qualified name of an + enterprise bean's local interface. + + + + + + + + + + + + + + + + The local-homeType defines the fully-qualified + name of an enterprise bean's local home interface. + + + + + + + + + + + + + + + + This type is a general type that can be used to declare + parameter/value lists. + + + + + + + + + + The param-name element contains the name of a + parameter. + + + + + + + + + The param-value element contains the value of a + parameter. + + + + + + + + + + + + + + + + The elements that use this type designate either a relative + path or an absolute path starting with a "/". + + In elements that specify a pathname to a file within the + same Deployment File, relative filenames (i.e., those not + starting with "/") are considered relative to the root of + the Deployment File's namespace. Absolute filenames (i.e., + those starting with "/") also specify names in the root of + the Deployment File's namespace. In general, relative names + are preferred. The exception is .war files where absolute + names are preferred for consistency with the Servlet API. + + + + + + + + + + + + + + + + myPersistenceContext + + + + + myPersistenceContext + + PersistenceUnit1 + + Extended + + + ]]> + + + + + + + + + The persistence-context-ref-name element specifies + the name of a persistence context reference; its + value is the environment entry name used in + Deployment Component code. The name is a JNDI name + relative to the java:comp/env context. + + + + + + + + + The Application Assembler(or BeanProvider) may use the + following syntax to avoid the need to rename persistence + units to have unique names within a Java EE application. + + The Application Assembler specifies the pathname of the + root of the persistence.xml file for the referenced + persistence unit and appends the name of the persistence + unit separated from the pathname by #. The pathname is + relative to the referencing application component jar file. + In this manner, multiple persistence units with the same + persistence unit name may be uniquely identified when the + Application Assembler cannot change persistence unit names. + + + + + + + + + + Used to specify properties for the container or persistence + provider. Vendor-specific properties may be included in + the set of properties. Properties that are not recognized + by a vendor must be ignored. Entries that make use of the + namespace javax.persistence and its subnamespaces must not + be used for vendor-specific properties. The namespace + javax.persistence is reserved for use by the specification. + + + + + + + + + + + + + + + + + The persistence-context-typeType specifies the transactional + nature of a persistence context reference. + + The value of the persistence-context-type element must be + one of the following: + Transaction + Extended + + + + + + + + + + + + + + + + + + + Specifies a name/value pair. + + + + + + + + + + + + + + + + + + + + myPersistenceUnit + + + + + myPersistenceUnit + + PersistenceUnit1 + + + + ]]> + + + + + + + + + The persistence-unit-ref-name element specifies + the name of a persistence unit reference; its + value is the environment entry name used in + Deployment Component code. The name is a JNDI name + relative to the java:comp/env context. + + + + + + + + + The Application Assembler(or BeanProvider) may use the + following syntax to avoid the need to rename persistence + units to have unique names within a Java EE application. + + The Application Assembler specifies the pathname of the + root of the persistence.xml file for the referenced + persistence unit and appends the name of the persistence + unit separated from the pathname by #. The pathname is + relative to the referencing application component jar file. + In this manner, multiple persistence units with the same + persistence unit name may be uniquely identified when the + Application Assembler cannot change persistence unit names. + + + + + + + + + + + + + + + + com.wombat.empl.EmployeeService + + ]]> + + + + + + + + + + + + + + + jms/StockQueue + + javax.jms.Queue + + + + ]]> + + + + + + + + + The resource-env-ref-name element specifies the name + of a resource environment reference; its value is + the environment entry name used in + the Deployment Component code. The name is a JNDI + name relative to the java:comp/env context and must + be unique within a Deployment Component. + + + + + + + + + The resource-env-ref-type element specifies the type + of a resource environment reference. It is the + fully qualified name of a Java language class or + interface. + + + + + + + + + + + + + + + + + jdbc/EmployeeAppDB + javax.sql.DataSource + Container + Shareable + + + ]]> + + + + + + + + + The res-ref-name element specifies the name of a + resource manager connection factory reference. + The name is a JNDI name relative to the + java:comp/env context. + The name must be unique within a Deployment File. + + + + + + + + + The res-type element specifies the type of the data + source. The type is specified by the fully qualified + Java language class or interface + expected to be implemented by the data source. + + + + + + + + + + + + + + + + + + + The res-authType specifies whether the Deployment Component + code signs on programmatically to the resource manager, or + whether the Container will sign on to the resource manager + on behalf of the Deployment Component. In the latter case, + the Container uses information that is supplied by the + Deployer. + + The value must be one of the two following: + + Application + Container + + + + + + + + + + + + + + + + + + + The res-sharing-scope type specifies whether connections + obtained through the given resource manager connection + factory reference can be shared. The value, if specified, + must be one of the two following: + + Shareable + Unshareable + + The default value is Shareable. + + + + + + + + + + + + + + + + + + + The run-asType specifies the run-as identity to be + used for the execution of a component. It contains an + optional description, and the name of a security role. + + + + + + + + + + + + + + + + + + The role-nameType designates the name of a security role. + + The name must conform to the lexical rules for a token. + + + + + + + + + + + + + + + + + This role includes all employees who are authorized + to access the employee service application. + + employee + + + ]]> + + + + + + + + + + + + + + + + + The security-role-refType contains the declaration of a + security role reference in a component's or a + Deployment Component's code. The declaration consists of an + optional description, the security role name used in the + code, and an optional link to a security role. If the + security role is not specified, the Deployer must choose an + appropriate security role. + + + + + + + + + + The value of the role-name element must be the String used + as the parameter to the + EJBContext.isCallerInRole(String roleName) method or the + HttpServletRequest.isUserInRole(String role) method. + + + + + + + + + The role-link element is a reference to a defined + security role. The role-link element must contain + the name of one of the security roles defined in the + security-role elements. + + + + + + + + + + + + + + + + This type adds an "id" attribute to xsd:QName. + + + + + + + + + + + + + + + + + + This type adds an "id" attribute to xsd:boolean. + + + + + + + + + + + + + + + + + + This type adds an "id" attribute to xsd:NMTOKEN. + + + + + + + + + + + + + + + + + + This type adds an "id" attribute to xsd:anyURI. + + + + + + + + + + + + + + + + + + This type adds an "id" attribute to xsd:integer. + + + + + + + + + + + + + + + + + + This type adds an "id" attribute to xsd:positiveInteger. + + + + + + + + + + + + + + + + + + This type adds an "id" attribute to xsd:nonNegativeInteger. + + + + + + + + + + + + + + + + + + This type adds an "id" attribute to xsd:string. + + + + + + + + + + + + + + + + + + This is a special string datatype that is defined by Java EE as + a base type for defining collapsed strings. When schemas + require trailing/leading space elimination as well as + collapsing the existing whitespace, this base type may be + used. + + + + + + + + + + + + + + + + + + This simple type designates a boolean with only two + permissible values + + - true + - false + + + + + + + + + + + + + + + + + + The url-patternType contains the url pattern of the mapping. + It must follow the rules specified in Section 11.2 of the + Servlet API Specification. This pattern is assumed to be in + URL-decoded form and must not contain CR(#xD) or LF(#xA). + If it contains those characters, the container must inform + the developer with a descriptive error message. + The container must preserve all characters including whitespaces. + + + + + + + + + + + + + + + + CorporateStocks + + + + ]]> + + + + + + + + + The message-destination-name element specifies a + name for a message destination. This name must be + unique among the names of message destinations + within the Deployment File. + + + + + + + + + A product specific name that this message destination + should be mapped to. Each message-destination-ref + element that references this message destination will + define a name in the namespace of the referencing + component or in one of the other predefined namespaces. + Many application servers provide a way to map these + local names to names of resources known to the + application server. This mapped name is often a global + JNDI name, but may be a name of any form. Each of the + local names should be mapped to this same global name. + + Application servers are not required to support any + particular form or type of mapped name, nor the ability + to use mapped names. The mapped name is + product-dependent and often installation-dependent. No + use of a mapped name is portable. + + + + + + + + + The JNDI name to be looked up to resolve the message destination. + + + + + + + + + + + + + + + + jms/StockQueue + + javax.jms.Queue + + Consumes + + CorporateStocks + + + + ]]> + + + + + + + + + The message-destination-ref-name element specifies + the name of a message destination reference; its + value is the environment entry name used in + Deployment Component code. + + + + + + + + + + + + + + + + + + + + The message-destination-usageType specifies the use of the + message destination indicated by the reference. The value + indicates whether messages are consumed from the message + destination, produced for the destination, or both. The + Assembler makes use of this information in linking producers + of a destination with its consumers. + + The value of the message-destination-usage element must be + one of the following: + Consumes + Produces + ConsumesProduces + + + + + + + + + + + + + + + + + + + javax.jms.Queue + + + ]]> + + + + + + + + + + + + + + + The message-destination-linkType is used to link a message + destination reference or message-driven bean to a message + destination. + + The Assembler sets the value to reflect the flow of messages + between producers and consumers in the application. + + The value must be the message-destination-name of a message + destination in the same Deployment File or in another + Deployment File in the same Java EE application unit. + + Alternatively, the value may be composed of a path name + specifying a Deployment File containing the referenced + message destination with the message-destination-name of the + destination appended and separated from the path name by + "#". The path name is relative to the Deployment File + containing Deployment Component that is referencing the + message destination. This allows multiple message + destinations with the same name to be uniquely identified. + + + + + + + + + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/jsp_2_2.xsd b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/jsp_2_2.xsd new file mode 100644 index 00000000000..fa41e4266f1 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/jsp_2_2.xsd @@ -0,0 +1,389 @@ + + + + + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved. + + The contents of this file are subject to the terms of either the + GNU General Public License Version 2 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with + the License. You can obtain a copy of the License at + https://glassfish.dev.java.net/public/CDDL+GPL.html or + glassfish/bootstrap/legal/LICENSE.txt. See the License for the + specific language governing permissions and limitations under the + License. + + When distributing the software, include this License Header + Notice in each file and include the License file at + glassfish/bootstrap/legal/LICENSE.txt. Sun designates this + particular file as subject to the "Classpath" exception as + provided by Sun in the GPL Version 2 section of the License file + that accompanied this code. If applicable, add the following + below the License Header, with the fields enclosed by brackets [] + replaced by your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + Contributor(s): + + If you wish your version of this file to be governed by only the + CDDL or only the GPL Version 2, indicate your decision by adding + "[Contributor] elects to include this software in this + distribution under the [CDDL or GPL Version 2] license." If you + don't indicate a single choice of license, a recipient has the + option to distribute your version of this file under either the + CDDL, the GPL Version 2 or to extend the choice of license to its + licensees as provided above. However, if you add GPL Version 2 + code and therefore, elected the GPL Version 2 license, then the + option applies only if the new code is made subject to such + option by the copyright holder. + + + + + + + + This is the XML Schema for the JSP 2.2 deployment descriptor + types. The JSP 2.2 schema contains all the special + structures and datatypes that are necessary to use JSP files + from a web application. + + The contents of this schema is used by the web-common_3_0.xsd + file to define JSP specific content. + + + + + + + + The following conventions apply to all Java EE + deployment descriptor elements unless indicated otherwise. + + - In elements that specify a pathname to a file within the + same JAR file, relative filenames (i.e., those not + starting with "/") are considered relative to the root of + the JAR file's namespace. Absolute filenames (i.e., those + starting with "/") also specify names in the root of the + JAR file's namespace. In general, relative names are + preferred. The exception is .war files where absolute + names are preferred for consistency with the Servlet API. + + + + + + + + + + + + + + The jsp-configType is used to provide global configuration + information for the JSP files in a web application. It has + two subelements, taglib and jsp-property-group. + + + + + + + + + + + + + + + + + + The jsp-file element contains the full path to a JSP file + within the web application beginning with a `/'. + + + + + + + + + + + + + + + + The jsp-property-groupType is used to group a number of + files so they can be given global property information. + All files so described are deemed to be JSP files. The + following additional properties can be described: + + - Control whether EL is ignored. + - Control whether scripting elements are invalid. + - Indicate pageEncoding information. + - Indicate that a resource is a JSP document (XML). + - Prelude and Coda automatic includes. + - Control whether the character sequence #{ is allowed + when used as a String literal. + - Control whether template text containing only + whitespaces must be removed from the response output. + - Indicate the default contentType information. + - Indicate the default buffering model for JspWriter + - Control whether error should be raised for the use of + undeclared namespaces in a JSP page. + + + + + + + + + + + Can be used to easily set the isELIgnored + property of a group of JSP pages. By default, the + EL evaluation is enabled for Web Applications using + a Servlet 2.4 or greater web.xml, and disabled + otherwise. + + + + + + + + + The valid values of page-encoding are those of the + pageEncoding page directive. It is a + translation-time error to name different encodings + in the pageEncoding attribute of the page directive + of a JSP page and in a JSP configuration element + matching the page. It is also a translation-time + error to name different encodings in the prolog + or text declaration of a document in XML syntax and + in a JSP configuration element matching the document. + It is legal to name the same encoding through + mulitple mechanisms. + + + + + + + + + Can be used to easily disable scripting in a + group of JSP pages. By default, scripting is + enabled. + + + + + + + + + If true, denotes that the group of resources + that match the URL pattern are JSP documents, + and thus must be interpreted as XML documents. + If false, the resources are assumed to not + be JSP documents, unless there is another + property group that indicates otherwise. + + + + + + + + + The include-prelude element is a context-relative + path that must correspond to an element in the + Web Application. When the element is present, + the given path will be automatically included (as + in an include directive) at the beginning of each + JSP page in this jsp-property-group. + + + + + + + + + The include-coda element is a context-relative + path that must correspond to an element in the + Web Application. When the element is present, + the given path will be automatically included (as + in an include directive) at the end of each + JSP page in this jsp-property-group. + + + + + + + + + The character sequence #{ is reserved for EL expressions. + Consequently, a translation error occurs if the #{ + character sequence is used as a String literal, unless + this element is enabled (true). Disabled (false) by + default. + + + + + + + + + Indicates that template text containing only whitespaces + must be removed from the response output. It has no + effect on JSP documents (XML syntax). Disabled (false) + by default. + + + + + + + + + The valid values of default-content-type are those of the + contentType page directive. It specifies the default + response contentType if the page directive does not include + a contentType attribute. + + + + + + + + + The valid values of buffer are those of the + buffer page directive. It specifies if buffering should be + used for the output to response, and if so, the size of the + buffer to use. + + + + + + + + + The default behavior when a tag with unknown namespace is used + in a JSP page (regular syntax) is to silently ignore it. If + set to true, then an error must be raised during the translation + time when an undeclared tag is used in a JSP page. Disabled + (false) by default. + + + + + + + + + + + + + + + + The taglibType defines the syntax for declaring in + the deployment descriptor that a tag library is + available to the application. This can be done + to override implicit map entries from TLD files and + from the container. + + + + + + + + + A taglib-uri element describes a URI identifying a + tag library used in the web application. The body + of the taglib-uri element may be either an + absolute URI specification, or a relative URI. + There should be no entries in web.xml with the + same taglib-uri value. + + + + + + + + + the taglib-location element contains the location + (as a resource relative to the root of the web + application) where to find the Tag Library + Description file for the tag library. + + + + + + + + + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/web-app_3_0.xsd b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/web-app_3_0.xsd new file mode 100644 index 00000000000..bbcdf43cd3a --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/web-app_3_0.xsd @@ -0,0 +1,272 @@ + + + + + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved. + + The contents of this file are subject to the terms of either the + GNU General Public License Version 2 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with + the License. You can obtain a copy of the License at + https://glassfish.dev.java.net/public/CDDL+GPL.html or + glassfish/bootstrap/legal/LICENSE.txt. See the License for the + specific language governing permissions and limitations under the + License. + + When distributing the software, include this License Header + Notice in each file and include the License file at + glassfish/bootstrap/legal/LICENSE.txt. Sun designates this + particular file as subject to the "Classpath" exception as + provided by Sun in the GPL Version 2 section of the License file + that accompanied this code. If applicable, add the following + below the License Header, with the fields enclosed by brackets [] + replaced by your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + Contributor(s): + + If you wish your version of this file to be governed by only the + CDDL or only the GPL Version 2, indicate your decision by adding + "[Contributor] elects to include this software in this + distribution under the [CDDL or GPL Version 2] license." If you + don't indicate a single choice of license, a recipient has the + option to distribute your version of this file under either the + CDDL, the GPL Version 2 or to extend the choice of license to its + licensees as provided above. However, if you add GPL Version 2 + code and therefore, elected the GPL Version 2 license, then the + option applies only if the new code is made subject to such + option by the copyright holder. + + + + + + + + ... + + + The instance documents may indicate the published version of + the schema using the xsi:schemaLocation attribute for Java EE + namespace with the following location: + + http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd + + ]]> + + + + + + + The following conventions apply to all Java EE + deployment descriptor elements unless indicated otherwise. + + - In elements that specify a pathname to a file within the + same JAR file, relative filenames (i.e., those not + starting with "/") are considered relative to the root of + the JAR file's namespace. Absolute filenames (i.e., those + starting with "/") also specify names in the root of the + JAR file's namespace. In general, relative names are + preferred. The exception is .war files where absolute + names are preferred for consistency with the Servlet API. + + + + + + + + + + + + + + The web-app element is the root of the deployment + descriptor for a web application. Note that the sub-elements + of this element can be in the arbitrary order. Because of + that, the multiplicity of the elements of distributable, + session-config, welcome-file-list, jsp-config, login-config, + and locale-encoding-mapping-list was changed from "?" to "*" + in this schema. However, the deployment descriptor instance + file must not contain multiple elements of session-config, + jsp-config, and login-config. When there are multiple elements of + welcome-file-list or locale-encoding-mapping-list, the container + must concatenate the element contents. The multiple occurence + of the element distributable is redundant and the container + treats that case exactly in the same way when there is only + one distributable. + + + + + + + + The servlet element contains the name of a servlet. + The name must be unique within the web application. + + + + + + + + + + + The filter element contains the name of a filter. + The name must be unique within the web application. + + + + + + + + + + + The ejb-local-ref-name element contains the name of an EJB + reference. The EJB reference is an entry in the web + application's environment and is relative to the + java:comp/env context. The name must be unique within + the web application. + + It is recommended that name is prefixed with "ejb/". + + + + + + + + + + + The ejb-ref-name element contains the name of an EJB + reference. The EJB reference is an entry in the web + application's environment and is relative to the + java:comp/env context. The name must be unique within + the web application. + + It is recommended that name is prefixed with "ejb/". + + + + + + + + + + + The resource-env-ref-name element specifies the name of + a resource environment reference; its value is the + environment entry name used in the web application code. + The name is a JNDI name relative to the java:comp/env + context and must be unique within a web application. + + + + + + + + + + + The message-destination-ref-name element specifies the name of + a message destination reference; its value is the + environment entry name used in the web application code. + The name is a JNDI name relative to the java:comp/env + context and must be unique within a web application. + + + + + + + + + + + The res-ref-name element specifies the name of a + resource manager connection factory reference. The name + is a JNDI name relative to the java:comp/env context. + The name must be unique within a web application. + + + + + + + + + + + The env-entry-name element contains the name of a web + application's environment entry. The name is a JNDI + name relative to the java:comp/env context. The name + must be unique within a web application. + + + + + + + + + + + A role-name-key is specified to allow the references + from the security-role-refs. + + + + + + + + + + + The keyref indicates the references from + security-role-ref to a specified role-name. + + + + + + + + + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/web-common_3_0.xsd b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/web-common_3_0.xsd new file mode 100644 index 00000000000..f994bc2c651 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/web-common_3_0.xsd @@ -0,0 +1,1575 @@ + + + + + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved. + + The contents of this file are subject to the terms of either the + GNU General Public License Version 2 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with + the License. You can obtain a copy of the License at + https://glassfish.dev.java.net/public/CDDL+GPL.html or + glassfish/bootstrap/legal/LICENSE.txt. See the License for the + specific language governing permissions and limitations under the + License. + + When distributing the software, include this License Header + Notice in each file and include the License file at + glassfish/bootstrap/legal/LICENSE.txt. Sun designates this + particular file as subject to the "Classpath" exception as + provided by Sun in the GPL Version 2 section of the License file + that accompanied this code. If applicable, add the following + below the License Header, with the fields enclosed by brackets [] + replaced by your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + Contributor(s): + + If you wish your version of this file to be governed by only the + CDDL or only the GPL Version 2, indicate your decision by adding + "[Contributor] elects to include this software in this + distribution under the [CDDL or GPL Version 2] license." If you + don't indicate a single choice of license, a recipient has the + option to distribute your version of this file under either the + CDDL, the GPL Version 2 or to extend the choice of license to its + licensees as provided above. However, if you add GPL Version 2 + code and therefore, elected the GPL Version 2 license, then the + option applies only if the new code is made subject to such + option by the copyright holder. + + + + + + + + ... + + + The instance documents may indicate the published version of + the schema using the xsi:schemaLocation attribute for Java EE + namespace with the following location: + + http://java.sun.com/xml/ns/javaee/web-common_3_0.xsd + + ]]> + + + + + + + The following conventions apply to all Java EE + deployment descriptor elements unless indicated otherwise. + + - In elements that specify a pathname to a file within the + same JAR file, relative filenames (i.e., those not + starting with "/") are considered relative to the root of + the JAR file's namespace. Absolute filenames (i.e., those + starting with "/") also specify names in the root of the + JAR file's namespace. In general, relative names are + preferred. The exception is .war files where absolute + names are preferred for consistency with the Servlet API. + + + + + + + + + + + + + + + + + The context-param element contains the declaration + of a web application's servlet context + initialization parameters. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The metadata-complete attribute defines whether this + deployment descriptor and other related deployment + descriptors for this module (e.g., web service + descriptors) are complete, or whether the class + files available to this module and packaged with + this application should be examined for annotations + that specify deployment information. + + If metadata-complete is set to "true", the deployment + tool must ignore any annotations that specify deployment + information, which might be present in the class files + of the application. + + If metadata-complete is not specified or is set to + "false", the deployment tool must examine the class + files of the application for annotations, as + specified by the specifications. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The auth-constraintType indicates the user roles that + should be permitted access to this resource + collection. The role-name used here must either correspond + to the role-name of one of the security-role elements + defined for this web application, or be the specially + reserved role-name "*" that is a compact syntax for + indicating all roles in the web application. If both "*" + and rolenames appear, the container interprets this as all + roles. If no roles are defined, no user is allowed access + to the portion of the web application described by the + containing security-constraint. The container matches + role names case sensitively when determining access. + + + + + + + + + + + + + + + + + + The auth-methodType is used to configure the authentication + mechanism for the web application. As a prerequisite to + gaining access to any web resources which are protected by + an authorization constraint, a user must have authenticated + using the configured mechanism. Legal values are "BASIC", + "DIGEST", "FORM", "CLIENT-CERT", or a vendor-specific + authentication scheme. + + Used in: login-config + + + + + + + + + + + + + + + + The dispatcher has five legal values: FORWARD, REQUEST, + INCLUDE, ASYNC, and ERROR. + + A value of FORWARD means the Filter will be applied under + RequestDispatcher.forward() calls. + A value of REQUEST means the Filter will be applied under + ordinary client calls to the path or servlet. + A value of INCLUDE means the Filter will be applied under + RequestDispatcher.include() calls. + A value of ASYNC means the Filter will be applied under + calls dispatched from an AsyncContext. + A value of ERROR means the Filter will be applied under the + error page mechanism. + + The absence of any dispatcher elements in a filter-mapping + indicates a default of applying filters only under ordinary + client calls to the path or servlet. + + + + + + + + + + + + + + + + + + + + + + The error-code contains an HTTP error code, ex: 404 + + Used in: error-page + + + + + + + + + + + + + + + + + + + The error-pageType contains a mapping between an error code + or exception type to the path of a resource in the web + application. + + Error-page declarations using the exception-type element in + the deployment descriptor must be unique up to the class name of + the exception-type. Similarly, error-page declarations using the + status-code element must be unique in the deployment descriptor + up to the status code. + + Used in: web-app + + + + + + + + + + + The exception-type contains a fully qualified class + name of a Java exception type. + + + + + + + + + + The location element contains the location of the + resource in the web application relative to the root of + the web application. The value of the location must have + a leading `/'. + + + + + + + + + + + + + + + + The filterType is used to declare a filter in the web + application. The filter is mapped to either a servlet or a + URL pattern in the filter-mapping element, using the + filter-name value to reference. Filters can access the + initialization parameters declared in the deployment + descriptor at runtime via the FilterConfig interface. + + Used in: web-app + + + + + + + + + + + The fully qualified classname of the filter. + + + + + + + + + + The init-param element contains a name/value pair as + an initialization param of a servlet filter + + + + + + + + + + + + + + + + Declaration of the filter mappings in this web + application is done by using filter-mappingType. + The container uses the filter-mapping + declarations to decide which filters to apply to a request, + and in what order. The container matches the request URI to + a Servlet in the normal way. To determine which filters to + apply it matches filter-mapping declarations either on + servlet-name, or on url-pattern for each filter-mapping + element, depending on which style is used. The order in + which filters are invoked is the order in which + filter-mapping declarations that match a request URI for a + servlet appear in the list of filter-mapping elements.The + filter-name value must be the value of the filter-name + sub-elements of one of the filter declarations in the + deployment descriptor. + + + + + + + + + + + + + + + + + + + + + + This type defines a string which contains at least one + character. + + + + + + + + + + + + + + + + + + The logical name of the filter is declare + by using filter-nameType. This name is used to map the + filter. Each filter name is unique within the web + application. + + Used in: filter, filter-mapping + + + + + + + + + + + + + + + + The form-login-configType specifies the login and error + pages that should be used in form based login. If form based + authentication is not used, these elements are ignored. + + Used in: login-config + + + + + + + + + The form-login-page element defines the location in the web + app where the page that can be used for login can be + found. The path begins with a leading / and is interpreted + relative to the root of the WAR. + + + + + + + + + The form-error-page element defines the location in + the web app where the error page that is displayed + when login is not successful can be found. + The path begins with a leading / and is interpreted + relative to the root of the WAR. + + + + + + + + + + + + + A HTTP method type as defined in HTTP 1.1 section 2.2. + + + + + + + + + + + + + + + + + + + + + + + + + + The login-configType is used to configure the authentication + method that should be used, the realm name that should be + used for this application, and the attributes that are + needed by the form login mechanism. + + Used in: web-app + + + + + + + + + + The realm name element specifies the realm name to + use in HTTP Basic authorization. + + + + + + + + + + + + + + + + + The mime-mappingType defines a mapping between an extension + and a mime type. + + Used in: web-app + + + + + + + + The extension element contains a string describing an + extension. example: "txt" + + + + + + + + + + + + + + + + + The mime-typeType is used to indicate a defined mime type. + + Example: + "text/plain" + + Used in: mime-mapping + + + + + + + + + + + + + + + + + + The security-constraintType is used to associate + security constraints with one or more web resource + collections + + Used in: web-app + + + + + + + + + + + + + + + + + + + + The servletType is used to declare a servlet. + It contains the declarative data of a + servlet. If a jsp-file is specified and the load-on-startup + element is present, then the JSP should be precompiled and + loaded. + + Used in: web-app + + + + + + + + + + + + The servlet-class element contains the fully + qualified class name of the servlet. + + + + + + + + + + + + The load-on-startup element indicates that this + servlet should be loaded (instantiated and have + its init() called) on the startup of the web + application. The optional contents of these + element must be an integer indicating the order in + which the servlet should be loaded. If the value + is a negative integer, or the element is not + present, the container is free to load the servlet + whenever it chooses. If the value is a positive + integer or 0, the container must load and + initialize the servlet as the application is + deployed. The container must guarantee that + servlets marked with lower integers are loaded + before servlets marked with higher integers. The + container may choose the order of loading of + servlets with the same load-on-start-up value. + + + + + + + + + + + + + + + + + + + + + The servlet-mappingType defines a mapping between a + servlet and a url pattern. + + Used in: web-app + + + + + + + + + + + + + + + + + + The servlet-name element contains the canonical name of the + servlet. Each servlet name is unique within the web + application. + + + + + + + + + + + + + + + + The session-configType defines the session parameters + for this web application. + + Used in: web-app + + + + + + + + + The session-timeout element defines the default + session timeout interval for all sessions created + in this web application. The specified timeout + must be expressed in a whole number of minutes. + If the timeout is 0 or less, the container ensures + the default behaviour of sessions is never to time + out. If this element is not specified, the container + must set its default timeout period. + + + + + + + + + The cookie-config element defines the configuration of the + session tracking cookies created by this web application. + + + + + + + + + The tracking-mode element defines the tracking modes + for sessions created by this web application + + + + + + + + + + + + + + + + The cookie-configType defines the configuration for the + session tracking cookies of this web application. + + Used in: session-config + + + + + + + + + The name that will be assigned to any session tracking + cookies created by this web application. + The default is JSESSIONID + + + + + + + + + The domain name that will be assigned to any session tracking + cookies created by this web application. + + + + + + + + + The path that will be assigned to any session tracking + cookies created by this web application. + + + + + + + + + The comment that will be assigned to any session tracking + cookies created by this web application. + + + + + + + + + Specifies whether any session tracking cookies created + by this web application will be marked as HttpOnly + + + + + + + + + Specifies whether any session tracking cookies created + by this web application will be marked as secure + even if the request that initiated the corresponding session + is using plain HTTP instead of HTTPS + + + + + + + + + The lifetime (in seconds) that will be assigned to any + session tracking cookies created by this web application. + Default is -1 + + + + + + + + + + + + + + + + The name that will be assigned to any session tracking + cookies created by this web application. + The default is JSESSIONID + + Used in: cookie-config + + + + + + + + + + + + + + + + The domain name that will be assigned to any session tracking + cookies created by this web application. + + Used in: cookie-config + + + + + + + + + + + + + + + + The path that will be assigned to any session tracking + cookies created by this web application. + + Used in: cookie-config + + + + + + + + + + + + + + + + The comment that will be assigned to any session tracking + cookies created by this web application. + + Used in: cookie-config + + + + + + + + + + + + + + + + The tracking modes for sessions created by this web + application + + Used in: session-config + + + + + + + + + + + + + + + + + + + + The transport-guaranteeType specifies that the communication + between client and server should be NONE, INTEGRAL, or + CONFIDENTIAL. NONE means that the application does not + require any transport guarantees. A value of INTEGRAL means + that the application requires that the data sent between the + client and server be sent in such a way that it can't be + changed in transit. CONFIDENTIAL means that the application + requires that the data be transmitted in a fashion that + prevents other entities from observing the contents of the + transmission. In most cases, the presence of the INTEGRAL or + CONFIDENTIAL flag will indicate that the use of SSL is + required. + + Used in: user-data-constraint + + + + + + + + + + + + + + + + + + + + The user-data-constraintType is used to indicate how + data communicated between the client and container should be + protected. + + Used in: security-constraint + + + + + + + + + + + + + + + + + + The elements that use this type designate a path starting + with a "/" and interpreted relative to the root of a WAR + file. + + + + + + + + + + + + + + + This type contains the recognized versions of + web-application supported. It is used to designate the + version of the web application. + + + + + + + + + + + + + + + + The web-resource-collectionType is used to identify the + resources and HTTP methods on those resources to which a + security constraint applies. If no HTTP methods are specified, + then the security constraint applies to all HTTP methods. + If HTTP methods are specified by http-method-omission + elements, the security constraint applies to all methods + except those identified in the collection. + http-method-omission and http-method elements are never + mixed in the same collection. + + Used in: security-constraint + + + + + + + + + The web-resource-name contains the name of this web + resource collection. + + + + + + + + + + + + Each http-method names an HTTP method to which the + constraint applies. + + + + + + + + + Each http-method-omission names an HTTP method to + which the constraint does not apply. + + + + + + + + + + + + + + + + + The welcome-file-list contains an ordered list of welcome + files elements. + + Used in: web-app + + + + + + + + + The welcome-file element contains file name to use + as a default welcome file, such as index.html + + + + + + + + + + + + + The localeType defines valid locale defined by ISO-639-1 + and ISO-3166. + + + + + + + + + + + + + The encodingType defines IANA character sets. + + + + + + + + + + + + + + + + The locale-encoding-mapping-list contains one or more + locale-encoding-mapping(s). + + + + + + + + + + + + + + + + + The locale-encoding-mapping contains locale name and + encoding name. The locale name must be either "Language-code", + such as "ja", defined by ISO-639 or "Language-code_Country-code", + such as "ja_JP". "Country code" is defined by ISO-3166. + + + + + + + + + + + + + + + + + + This element indicates that the ordering sub-element in which + it was placed should take special action regarding the ordering + of this application resource relative to other application + configuration resources. + See section 8.2.2 of the specification for details. + + + + + + + + + + + + + + Please see section 8.2.2 of the specification for details. + + + + + + + + + + + + + + + + + Please see section 8.2.2 of the specification for details. + + + + + + + + + + + + + + + + + This element contains a sequence of "name" elements, each of + which + refers to an application configuration resource by the "name" + declared on its web.xml fragment. This element can also contain + a single "others" element which specifies that this document + comes + before or after other documents within the application. + See section 8.2.2 of the specification for details. + + + + + + + + + + + + + + + + + This element specifies configuration information related to the + handling of multipart/form-data requests. + + + + + + + + + The directory location where uploaded files will be stored + + + + + + + + + The maximum size limit of uploaded files + + + + + + + + + The maximum size limit of multipart/form-data requests + + + + + + + + + The size threshold after which an uploaded file will be + written to disk + + + + + + + + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/xml.xsd b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/xml.xsd new file mode 100644 index 00000000000..aea7d0db0a4 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/main/webapp/WEB-INF/xsd/xml.xsd @@ -0,0 +1,287 @@ + + + + + + +
+

About the XML namespace

+ +
+

+ This schema document describes the XML namespace, in a form + suitable for import by other schema documents. +

+

+ See + http://www.w3.org/XML/1998/namespace.html and + + http://www.w3.org/TR/REC-xml for information + about this namespace. +

+

+ Note that local names in this namespace are intended to be + defined only by the World Wide Web Consortium or its subgroups. + The names currently defined in this namespace are listed below. + They should not be used with conflicting semantics by any Working + Group, specification, or document instance. +

+

+ See further below in this document for more information about how to refer to this schema document from your own + XSD schema documents and about the + namespace-versioning policy governing this schema document. +

+
+
+
+
+ + + + +
+ +

lang (as an attribute name)

+

+ denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification.

+ +
+
+

Notes

+

+ Attempting to install the relevant ISO 2- and 3-letter + codes as the enumerated possible values is probably never + going to be a realistic possibility. +

+

+ See BCP 47 at + http://www.rfc-editor.org/rfc/bcp/bcp47.txt + and the IANA language subtag registry at + + http://www.iana.org/assignments/language-subtag-registry + for further information. +

+

+ The union allows for the 'un-declaration' of xml:lang with + the empty string. +

+
+
+
+ + + + + + + + + +
+ + + + +
+ +

space (as an attribute name)

+

+ denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification.

+ +
+
+
+ + + + + + +
+ + + +
+ +

base (as an attribute name)

+

+ denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification.

+ +

+ See http://www.w3.org/TR/xmlbase/ + for information about this attribute. +

+
+
+
+
+ + + + +
+ +

id (as an attribute name)

+

+ denotes an attribute whose value + should be interpreted as if declared to be of type ID. + This name is reserved by virtue of its definition in the + xml:id specification.

+ +

+ See http://www.w3.org/TR/xml-id/ + for information about this attribute. +

+
+
+
+
+ + + + + + + + + + +
+ +

Father (in any context at all)

+ +
+

+ denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: +

+
+

+ In appreciation for his vision, leadership and + dedication the W3C XML Plenary on this 10th day of + February, 2000, reserves for Jon Bosak in perpetuity + the XML name "xml:Father". +

+
+
+
+
+
+ + + +
+

About this schema document

+ +
+

+ This schema defines attributes and an attribute group suitable + for use by schemas wishing to allow xml:base, + xml:lang, xml:space or + xml:id attributes on elements they define. +

+

+ To enable this, such a schema must import this schema for + the XML namespace, e.g. as follows: +

+
+          <schema . . .>
+           . . .
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+     
+

+ or +

+
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+     
+

+ Subsequently, qualified reference to any of the attributes or the + group defined below will have the desired effect, e.g. +

+
+          <type . . .>
+           . . .
+           <attributeGroup ref="xml:specialAttrs"/>
+     
+

+ will define a type which will schema-validate an instance element + with any of those attributes. +

+
+
+
+
+ + + +
+

Versioning policy for this schema document

+
+

+ In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + + http://www.w3.org/2009/01/xml.xsd. +

+

+ At the date of issue it can also be found at + + http://www.w3.org/2001/xml.xsd. +

+

+ The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML + Schema itself, or with the XML namespace itself. In other words, + if the XML Schema or XML namespaces change, the version of this + document at + http://www.w3.org/2001/xml.xsd + + will change accordingly; the version at + + http://www.w3.org/2009/01/xml.xsd + + will not change. +

+

+ Previous dated (and unchanging) versions of this schema + document are at: +

+ +
+
+
+
+ +
+ diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/java/ca/uhn/fhir/jpa/cqf/ruler/RulerHelperTests.java b/hapi-fhir-jpaserver-cqf-ruler/src/test/java/ca/uhn/fhir/jpa/cqf/ruler/RulerHelperTests.java new file mode 100644 index 00000000000..20e11044784 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/java/ca/uhn/fhir/jpa/cqf/ruler/RulerHelperTests.java @@ -0,0 +1,90 @@ +package ca.uhn.fhir.jpa.cqf.ruler; + +import org.hl7.fhir.dstu3.model.Bundle; +import org.junit.Assert; +import org.junit.Test; +import ca.uhn.fhir.jpa.cqf.ruler.helpers.XlsxToValueSet; + +import java.io.IOException; + +public class RulerHelperTests { + + @Test + public void XlsxToValueSetTest() throws IOException { + String[] args = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/test.xlsx", "-b=1", "-s=3", "-v=4", "-c=5", "-d=6"}; + Bundle bundle = XlsxToValueSet.convertVs(args); + XlsxToValueSet.main(args); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaAffectedAreasArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-affected-areas.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaAffectedAreasArgs); + XlsxToValueSet.main(zikaAffectedAreasArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaSignsSymptomsArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-virus-signs-symptoms.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaSignsSymptomsArgs); + XlsxToValueSet.main(zikaSignsSymptomsArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaArboSignsSymptomsArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-signs-symptoms.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaArboSignsSymptomsArgs); + XlsxToValueSet.main(zikaArboSignsSymptomsArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaVirusTestArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-virus-tests.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaVirusTestArgs); + XlsxToValueSet.main(zikaVirusTestArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaArbovirusTestArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-tests.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaArbovirusTestArgs); + XlsxToValueSet.main(zikaArbovirusTestArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaChikungunyaTestsArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-chikungunya-tests.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaChikungunyaTestsArgs); + XlsxToValueSet.main(zikaChikungunyaTestsArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaDengueTestsArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-dengue-tests.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaDengueTestsArgs); + XlsxToValueSet.main(zikaDengueTestsArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaIgmELISAResultsArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-igm-elisa-results.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaIgmELISAResultsArgs); + XlsxToValueSet.main(zikaIgmELISAResultsArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaNeutralizingAntibodyResultsArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-neutralizing-antibody-results.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaNeutralizingAntibodyResultsArgs); + XlsxToValueSet.main(zikaNeutralizingAntibodyResultsArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaArbovirusTestResultsArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-test-results.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaArbovirusTestResultsArgs); + XlsxToValueSet.main(zikaArbovirusTestResultsArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaChikungunyaTestResultsArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-chikungunya-test-results.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaChikungunyaTestResultsArgs); + XlsxToValueSet.main(zikaChikungunyaTestResultsArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] zikaDengueTestResultsArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-dengue-test-results.xlsx", "-b=1", "-o=9", "-s=10", "-v=7", "-c=0", "-d=2" }; + bundle = XlsxToValueSet.convertVs(zikaDengueTestResultsArgs); + XlsxToValueSet.main(zikaDengueTestResultsArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + String[] csArgs = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/test.xlsx", "-b=1", "-o=8", "-u=7", "-v=4", "-c=5", "-d=6", "-cs", "-outDir=src/main/resources/codesystems/"}; + bundle = XlsxToValueSet.convertCs(csArgs); + XlsxToValueSet.main(csArgs); + Assert.assertTrue(!bundle.getEntry().isEmpty()); + + // TODO - fix this +// String[] csArgsZika = { "src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-codesystem.xlsx", "-b=1", "-cs", "-outDir=src/main/resources/codesystems/"}; +// bundle = XlsxToValueSet.convertCs(csArgsZika); +// XlsxToValueSet.main(csArgsZika); +// Assert.assertTrue(!bundle.getEntry().isEmpty()); + } +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/java/ca/uhn/fhir/jpa/cqf/ruler/RulerTestBase.java b/hapi-fhir-jpaserver-cqf-ruler/src/test/java/ca/uhn/fhir/jpa/cqf/ruler/RulerTestBase.java new file mode 100644 index 00000000000..d001cfc0550 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/java/ca/uhn/fhir/jpa/cqf/ruler/RulerTestBase.java @@ -0,0 +1,320 @@ +package ca.uhn.fhir.jpa.cqf.ruler; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.model.primitive.IdDt; +import ca.uhn.fhir.rest.client.api.IGenericClient; +import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum; +import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor; +import ca.uhn.fhir.rest.server.IResourceProvider; +import org.cqframework.cql.elm.execution.Library; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppContext; +import org.hl7.fhir.dstu3.model.*; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opencds.cqf.cql.data.fhir.BaseFhirDataProvider; +import org.opencds.cqf.cql.data.fhir.FhirDataProviderStu3; +import org.opencds.cqf.cql.execution.Context; +import org.opencds.cqf.cql.execution.CqlLibraryReader; +import org.opencds.cqf.cql.terminology.fhir.FhirTerminologyProvider; +import ca.uhn.fhir.jpa.cqf.ruler.helpers.FhirMeasureEvaluator; + +import javax.xml.bind.JAXBException; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.ServerSocket; +import java.net.URL; +import java.net.URLDecoder; +import java.nio.file.Paths; +import java.util.*; + +public class RulerTestBase { + private static IGenericClient ourClient; + private static FhirContext ourCtx = FhirContext.forDstu3(); + + protected static int ourPort; + + private static Server ourServer; + private static String ourServerBase; + + private static Collection providers; + + @BeforeClass + public static void beforeClass() throws Exception { + + String path = Paths.get("").toAbsolutePath().toString(); + + ourPort = RandomServerPortProvider.findFreePort(); + ourServer = new Server(ourPort); + + WebAppContext webAppContext = new WebAppContext(); + webAppContext.setContextPath("/cqf-ruler"); + webAppContext.setDescriptor(path + "/src/main/webapp/WEB-INF/web.xml"); + webAppContext.setResourceBase(path + "/target/cqf-ruler"); + webAppContext.setParentLoaderPriority(true); + + ourServer.setHandler(webAppContext); + ourServer.start(); + + ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER); + ourCtx.getRestfulClientFactory().setSocketTimeout(1200 * 1000); + ourServerBase = "http://localhost:" + ourPort + "/cqf-ruler/baseDstu3"; + ourClient = ourCtx.newRestfulGenericClient(ourServerBase); + ourClient.registerInterceptor(new LoggingInterceptor(true)); + + // Load test data + // Normally, I would use a transaction bundle, but issues with the random ports prevents that... + // So, doing it the old-fashioned way =) + + // General + putResource("general-practitioner.json", "Practitioner-12208"); + putResource("general-patient.json", "Patient-12214"); + putResource("general-fhirhelpers-3.json", "FHIRHelpers"); + } + + @AfterClass + public static void afterClass() throws Exception { + ourServer.stop(); + } + + private static void putResource(String resourceFileName, String id) { + InputStream is = RulerTestBase.class.getResourceAsStream(resourceFileName); + Scanner scanner = new Scanner(is).useDelimiter("\\A"); + String json = scanner.hasNext() ? scanner.next() : ""; + IBaseResource resource = ourCtx.newJsonParser().parseResource(json); + ourClient.update(id, resource); + } + + // this test requires the OpioidManagementTerminologyKnowledge.db file to be located in the src/main/resources/cds folder + //@Test + public void CdcOpioidGuidanceTest() throws IOException { + putResource("cdc-opioid-guidance-library-omtk.json", "OMTKLogic"); + putResource("cdc-opioid-guidance-library-primary.json", "OpioidCdsStu3"); + putResource("cdc-opioid-5.json", "cdc-opioid-guidance"); + + // Get the CDS Hooks request + InputStream is = this.getClass().getResourceAsStream("cdc-opioid-guidance-cds-hooks-request.json"); + Scanner scanner = new Scanner(is).useDelimiter("\\A"); + String cdsHooksRequest = scanner.hasNext() ? scanner.next() : ""; + byte[] data = cdsHooksRequest.getBytes("UTF-8"); + + // Unsure how to use Hapi to make this request... + URL url = new URL("http://localhost:" + ourPort + "/cqf-ruler/cds-services/cdc-opioid-guidance"); + + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Content-Length", String.valueOf(data.length)); + conn.setDoOutput(true); + conn.getOutputStream().write(data); + + StringBuilder response = new StringBuilder(); + try(Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"))) + { + for (int i; (i = in.read()) >= 0;) { + response.append((char) i); + } + } + + String expected = "{\n" + + " \"cards\": [\n" + + " {\n" + + " \"summary\": \"High risk for opioid overdose - taper now\",\n" + + " \"indicator\": \"warning\",\n" + + " \"detail\": \"Total morphine milligram equivalent (MME) is 20200.700mg/d. Taper to less than 50.\"\n" + + " }\n" + + " ]\n" + + "}"; + + Assert.assertTrue( + response.toString().replaceAll("\\s+", "") + .equals(expected.replaceAll("\\s+", "")) + ); + } + + @Test + public void MeasureProcessingTest() { + putResource("measure-processing-library.json", "col-logic"); + putResource("measure-processing-measure.json", "col"); + putResource("measure-processing-procedure.json", "Procedure-9"); + putResource("measure-processing-condition.json", "Condition-13"); + putResource("measure-processing-valueset-1.json", "2.16.840.1.113883.3.464.1003.108.11.1001"); + putResource("measure-processing-valueset-2.json", "2.16.840.1.113883.3.464.1003.198.12.1019"); + putResource("measure-processing-valueset-3.json", "2.16.840.1.113883.3.464.1003.108.12.1020"); + putResource("measure-processing-valueset-4.json", "2.16.840.1.113883.3.464.1003.198.12.1010"); + putResource("measure-processing-valueset-5.json", "2.16.840.1.113883.3.464.1003.198.12.1011"); + + Parameters inParams = new Parameters(); + inParams.addParameter().setName("patient").setValue(new StringType("Patient-12214")); + inParams.addParameter().setName("startPeriod").setValue(new DateType("2001-01-01")); + inParams.addParameter().setName("endPeriod").setValue(new DateType("2015-03-01")); + + Parameters outParams = ourClient + .operation() + .onInstance(new IdDt("Measure", "col")) + .named("$evaluate") + .withParameters(inParams) + .useHttpGet() + .execute(); + + List response = outParams.getParameter(); + + Assert.assertTrue(!response.isEmpty()); + + Parameters.ParametersParameterComponent component = response.get(0); + + Assert.assertTrue(component.getResource() instanceof MeasureReport); + + MeasureReport report = (MeasureReport) component.getResource(); + + Assert.assertTrue(report.getEvaluatedResources() != null); + + for (MeasureReport.MeasureReportGroupComponent group : report.getGroup()) { + if (group.getIdentifier().getValue().equals("history-of-colorectal-cancer")) { + Assert.assertTrue(group.getPopulation().get(0).getCount() > 0); + } + + if (group.getIdentifier().getValue().equals("history-of-total-colectomy")) { + Assert.assertTrue(group.getPopulation().get(0).getCount() > 0); + } + } + } + + // TODO - fix this ... + // ca.uhn.fhir.rest.server.exceptions.InvalidRequestException: HTTP 400 Bad Request: No Content-Type header was provided in the request. This is required for "EXTENDED_OPERATION_INSTANCE" operation + @Test + public void PlanDefinitionApplyTest() throws ClassNotFoundException { + putResource("plandefinition-apply-library.json", "plandefinitionApplyTest"); + putResource("plandefinition-apply.json", "apply-example"); + + Parameters inParams = new Parameters(); + inParams.addParameter().setName("patient").setValue(new StringType("Patient-12214")); + + Parameters outParams = ourClient + .operation() + .onInstance(new IdDt("PlanDefinition", "apply-example")) + .named("$apply") + .withParameters(inParams) + .useHttpGet() + .execute(); + + List response = outParams.getParameter(); + + Assert.assertTrue(!response.isEmpty()); + + Resource resource = response.get(0).getResource(); + + Assert.assertTrue(resource instanceof CarePlan); + + CarePlan carePlan = (CarePlan) resource; + + Assert.assertTrue(carePlan.getTitle().equals("This is a dynamic definition!")); + } + + @Test + public void ActivityDefinitionApplyTest() { + putResource("activitydefinition-apply-library.json", "activityDefinitionApplyTest"); + putResource("activitydefinition-apply.json", "ad-apply-example"); + + Parameters inParams = new Parameters(); + inParams.addParameter().setName("patient").setValue(new StringType("Patient-12214")); + + Parameters outParams = ourClient + .operation() + .onInstance(new IdDt("ActivityDefinition", "ad-apply-example")) + .named("$apply") + .withParameters(inParams) + .useHttpGet() + .execute(); + + List response = outParams.getParameter(); + + Assert.assertTrue(!response.isEmpty()); + + Resource resource = response.get(0).getResource(); + + Assert.assertTrue(resource instanceof ProcedureRequest); + + ProcedureRequest procedureRequest = (ProcedureRequest) resource; + + Assert.assertTrue(procedureRequest.getDoNotPerform()); + } + + @Test + public void TestMeasureEvaluator() throws IOException, JAXBException { + File xmlFile = new File(URLDecoder.decode(RulerHelperTests.class.getResource("library-col.elm.xml").getFile(), "UTF-8")); + Library library = CqlLibraryReader.read(xmlFile); + + Context context = new Context(library); + + BaseFhirDataProvider provider = new FhirDataProviderStu3().setEndpoint(ourServerBase); + + FhirTerminologyProvider terminologyProvider = new FhirTerminologyProvider().withEndpoint(ourServerBase); + provider.setTerminologyProvider(terminologyProvider); +// provider.setExpandValueSets(true); + + context.registerDataProvider("http://hl7.org/fhir", provider); + context.registerTerminologyProvider(terminologyProvider); + + xmlFile = new File(URLDecoder.decode(RulerHelperTests.class.getResource("measure-col.xml").getFile(), "UTF-8")); + Measure measure = provider.getFhirClient().getFhirContext().newXmlParser().parseResource(Measure.class, new FileReader(xmlFile)); + + String patientId = "Patient-12214"; + Patient patient = provider.getFhirClient().read().resource(Patient.class).withId(patientId).execute(); + // TODO: Couldn't figure out what matcher to use here, gave up. + if (patient == null) { + throw new RuntimeException("Patient is null"); + } + + context.setContextValue("Patient", patientId); + + FhirMeasureEvaluator evaluator = new FhirMeasureEvaluator(); + + // Java's date support is _so_ bad. + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(0); + cal.set(2014, Calendar.JANUARY, 1, 0, 0, 0); + Date periodStart = cal.getTime(); + cal.set(2014, Calendar.DECEMBER, 31, 11, 59, 59); + Date periodEnd = cal.getTime(); + + org.hl7.fhir.dstu3.model.MeasureReport report = evaluator.evaluate(context, measure, patient, periodStart, periodEnd); + + if (report == null) { + throw new RuntimeException("MeasureReport is null"); + } + + if (report.getEvaluatedResources() == null) { + throw new RuntimeException("EvaluatedResources is null"); + } + + System.out.println(String.format("Bundle url: %s", report.getEvaluatedResources().getReference())); + } +} + +class RandomServerPortProvider { + + private static List ourPorts = new ArrayList<>(); + + static int findFreePort() { + ServerSocket server; + try { + server = new ServerSocket(0); + int port = server.getLocalPort(); + ourPorts.add(port); + server.close(); + Thread.sleep(500); + return port; + } catch (IOException | InterruptedException e) { + throw new Error(e); + } + } + + public static List list() { + return ourPorts; + } + +} diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply-library.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply-library.json new file mode 100644 index 00000000000..c116f8788b6 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply-library.json @@ -0,0 +1,19 @@ +{ + "resourceType": "Library", + "id": "activityDefinitionApplyTest", + "version": "1.0", + "status": "draft", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "content": [ + { + "contentType": "text/cql", + "data": "bGlicmFyeSBhY3Rpdml0eURlZmluaXRpb25BcHBseVRlc3QgdmVyc2lvbiAnMS4wJw0KDQpkZWZpbmUgIkR5bmFtaWMgZG9Ob3RQZXJmb3JtIFNldHRpbmciOg0KICAgIHRydWU=" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply-test.cql b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply-test.cql new file mode 100644 index 00000000000..9e73e8f4130 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply-test.cql @@ -0,0 +1,4 @@ +library activityDefinitionApplyTest version '1.0' + +define "Dynamic doNotPerform Setting": + true \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply.json new file mode 100644 index 00000000000..0d5243f6375 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/activitydefinition-apply.json @@ -0,0 +1,32 @@ +{ + "resourceType": "ActivityDefinition", + "id": "ad-apply-example", + "text": { + "status": "generated", + "div": "
ActivityDefinition $apply operation example.
" + }, + "status": "draft", + "description": "This is a test.", + "library": [ + { + "reference": "Library/activityDefinitionApplyTest" + } + ], + "kind": "ProcedureRequest", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "303653007", + "display": "Computed tomography of head" + } + ] + }, + "dynamicValue": [ + { + "description": "Set ProcedureRequest doNotPerform property", + "path": "doNotPerform", + "expression": "activityDefinitionApplyTest.\"Dynamic doNotPerform Setting\"" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-5.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-5.json new file mode 100644 index 00000000000..0dbe05b03ff --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-5.json @@ -0,0 +1,144 @@ +{ + "resourceType": "PlanDefinition", + "id": "cdc-opioid-guidance", + "text": { + "status": "generated", + "div": "
CDC Opioid Prescribing Guideline Recommendation #5
" + }, + "url": "http://hl7.org/fhir/ig/opioid-cds/PlanDefinition/cdc-opioid-05", + "identifier": [ + { + "use": "official", + "value": "cdc-opioid-guidance" + } + ], + "version": "0.1.0", + "name": "cdc-opioid-05", + "title": "CDC Opioid Prescribing Guideline Recommendation #5", + "type": { + "coding": [ + { + "system": "http://hl7.org/fhir/plan-definition-type", + "code": "eca-rule", + "display": "ECA Rule" + } + ] + }, + "status": "draft", + "date": "2017-04-23", + "publisher": "Centers for Disease Control and Prevention (CDC)", + "description": "When opioids are started, providers should prescribe the lowest effective dosage.", + "purpose": "CDC’s Guideline for Prescribing Opioids for Chronic Pain is intended to improve communication between providers and patients about the risks and benefits of opioid therapy for chronic pain, improve the safety and effectiveness of pain treatment, and reduce the risks associated with long-term opioid therapy, including opioid use disorder and overdose. The Guideline is not intended for patients who are in active cancer treatment, palliative care, or end-of-life care.", + "usage": "Providers should use caution when prescribing opioids at any dosage, should carefully reassess evidence of individual benefits and risks when considering increasing dosage to ≥50 morphine milligram equivalents (MME)/day, and should avoid increasing dosage to ≥90 MME/day or carefully justify a decision to titrate dosage to >90 MME/day", + "topic": [ + { + "text": "Opioid Prescribing" + } + ], + "relatedArtifact": [ + { + "type": "documentation", + "display": "CDC guideline for prescribing opioids for chronic pain", + "url": "https://guidelines.gov/summaries/summary/50153/cdc-guideline-for-prescribing-opioids-for-chronic-pain---united-states-2016#420" + }, + { + "type": "documentation", + "display": "MME Conversion Tables", + "url": "https://www.cdc.gov/drugoverdose/pdf/calculating_total_daily_dose-a.pdf" + } + ], + "library": [ + { + "reference": "Library/OpioidCdsStu3" + } + ], + "action": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-strengthOfRecommendation", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/recommendation-strength", + "code": "strong", + "display": "Strong" + } + ] + } + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-qualityOfEvidence", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/evidence-quality", + "code": "low", + "display": "Low quality" + } + ] + } + } + ], + "title": "High risk for opioid overdose.", + "_title": { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "'High risk for opioid overdose - ' + case when MME >= 90 then 'taper now' else 'consider tapering' end" + } + ] + }, + "description": "Total morphine milligram equivalent (MME) exceeds recommended amount. Taper to less than 50.", + "_description": { + "fhir_comments": [ + " TODO: This description needs to include the table for MME? " + ], + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/cqif-cqlExpression", + "valueString": "'Total morphine milligram equivalent (MME) is ' + ToString(MME) + '. Taper to less than 50.'" + } + ] + }, + "documentation": [ + { + "type": "documentation", + "display": "CDC guideline for prescribing opioids for chronic pain", + "url": "https://guidelines.gov/summaries/summary/50153/cdc-guideline-for-prescribing-opioids-for-chronic-pain---united-states-2016#420" + }, + { + "type": "documentation", + "display": "MME Conversion Tables", + "url": "https://www.cdc.gov/drugoverdose/pdf/calculating_total_daily_dose-a.pdf" + } + ], + "triggerDefinition": [ + { + "type": "named-event", + "eventName": "medication-prescribe" + } + ], + "condition": [ + { + "kind": "applicability", + "description": "Is total MME >= 50?", + "language": "text/cql", + "expression": "IsMME50OrMore" + } + ], + "groupingBehavior": "visual-group", + "selectionBehavior": "exactly-one", + "dynamicValue": [ + { + "description": "Dynamic title generation", + "expression": "DynamicTitle" + }, + { + "description": "Dynamic description generation", + "expression": "DynamicDescription" + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-cds-hooks-request.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-cds-hooks-request.json new file mode 100644 index 00000000000..131b8e56f03 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-cds-hooks-request.json @@ -0,0 +1,132 @@ +{ + "hookInstance": "d1577c69-dfbe-44ad-ba6d-3e05e953b2ea", + "fhirServer": "https://sb-fhir-dstu2.smarthealthit.org/smartdstu2/open", + "hook": "medication-prescribe", + "user": "Practitioner/example", + "context": [ + { + "resourceType": "MedicationOrder", + "id": "medrx001", + "dateWritten": "2017-05-05", + "status": "draft", + "patient": { + "reference": "Patient/Patient-12214" + }, + "medicationCodeableConcept": { + "coding": [ + { + "system": "http://www.nlm.nih.gov/research/umls/rxnorm", + "code": "197696" + } + ] + }, + "dosageInstruction": [ + { + "text": "Take 40mg three times daily", + "timing": { + "repeat": { + "frequency": 3, + "frequencyMax": 3, + "period": 1, + "unit": "d" + } + }, + "asNeededBoolean": false, + "doseQuantity": { + "value": 40, + "unit": "mg", + "system": "http://unitsofmeasure.org", + "code": "mg" + } + } + ], + "dispenseRequest": { + "quantity": { + "value": 3000, + "unit": "mg", + "system": "http://unitsofmeasure.org", + "code": "mg" + } + } + } + ], + "patient": "Patient/Patient-12214", + "prefetch": { + "medication": { + "resource": { + "resourceType": "Bundle", + "id": "25c04bfd-8996-445f-9bbd-3725614c1508", + "meta": { + "lastUpdated": "2017-10-21T20:55:54.241+00:00" + }, + "type": "searchset", + "total": 1, + "link": [ + { + "relation": "self", + "url": "https://sb-fhir-dstu2.smarthealthit.org/smartdstu2/open/MedicationOrder?patient=Patient-12214&status=active" + } + ], + "entry": [ + { + "fullUrl": "https://sb-fhir-dstu2.smarthealthit.org/smartdstu2/open/MedicationOrder/medrx002", + "resource": { + "resourceType": "MedicationOrder", + "id": "medrx002", + "meta": { + "versionId": "1", + "lastUpdated": "2017-10-21T20:55:38.000+00:00" + }, + "dateWritten": "2017-04-25", + "status": "active", + "patient": { + "reference": "Patient/Patient-12214" + }, + "medicationCodeableConcept": { + "coding": [ + { + "system": "http://www.nlm.nih.gov/research/umls/rxnorm", + "code": "199789" + } + ] + }, + "dosageInstruction": [ + { + "text": "Take 50mg twice daily", + "timing": { + "repeat": { + "frequency": 2, + "period": 1, + "periodUnits": "d" + } + }, + "asNeededBoolean": false, + "doseQuantity": { + "value": 55, + "unit": "mg", + "system": "http://unitsofmeasure.org", + "code": "mg" + } + } + ], + "dispenseRequest": { + "quantity": { + "value": 3000, + "unit": "mg", + "system": "http://unitsofmeasure.org", + "code": "mg" + } + } + }, + "search": { + "mode": "match" + } + } + ] + }, + "response": { + "status": "200 HTTP/1.1 200" + } + } + } +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-library-omtk.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-library-omtk.json new file mode 100644 index 00000000000..c9d48ebfed8 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-library-omtk.json @@ -0,0 +1,23 @@ +{ + "resourceType": "Library", + "id": "OMTKLogic", + "meta": { + "versionId": "3", + "lastUpdated": "2017-07-25T09:54:33.579+00:00" + }, + "version": "0.1.0", + "status": "draft", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "content": [ + { + "contentType": "application/elm+xml", + "data": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxsaWJyYXJ5IHhtbG5zPSJ1cm46aGw3LW9yZzplbG06cjEiIHhtbG5zOnQ9InVybjpobDctb3JnOmVsbS10eXBlczpyMSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6Zmhpcj0iaHR0cDovL2hsNy5vcmcvZmhpciIgeG1sbnM6YT0idXJuOmhsNy1vcmc6Y3FsLWFubm90YXRpb25zOnIxIj4NCiAgIDxpZGVudGlmaWVyIGlkPSJPTVRLTG9naWMiIHZlcnNpb249IjAuMS4wIi8+DQogICA8c2NoZW1hSWRlbnRpZmllciBpZD0idXJuOmhsNy1vcmc6ZWxtIiB2ZXJzaW9uPSJyMSIvPg0KICAgPHVzaW5ncz4NCiAgICAgIDxkZWYgbG9jYWxJZGVudGlmaWVyPSJTeXN0ZW0iIHVyaT0idXJuOmhsNy1vcmc6ZWxtLXR5cGVzOnIxIi8+DQogICAgICA8ZGVmIGxvY2FsSWRlbnRpZmllcj0iT01USyIgdXJpPSJodHRwOi8vb3JnLm9wZW5jZHMvb3Bpb2lkLWNkcyIgdmVyc2lvbj0iMC4xLjAiLz4NCiAgIDwvdXNpbmdzPg0KICAgPGNvZGVTeXN0ZW1zPg0KICAgICAgPGRlZiBuYW1lPSJSeE5vcm0iIGlkPSJodHRwOi8vd3d3Lm5sbS5uaWguZ292L3Jlc2VhcmNoL3VtbHMvcnhub3JtIiBhY2Nlc3NMZXZlbD0iUHVibGljIi8+DQogICA8L2NvZGVTeXN0ZW1zPg0KICAgPHN0YXRlbWVudHM+DQogICAgICA8ZGVmIG5hbWU9IlRvVUNVTSIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyIgeHNpOnR5cGU9IkZ1bmN0aW9uRGVmIj4NCiAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJDYXNlIj4NCiAgICAgICAgICAgIDxjb21wYXJhbmQgbmFtZT0idW5pdCIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJNRyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJtZyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iTUcvQUNUVUFUIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4gdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Im1nL3thY3R1YXR9IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJNRy9IUiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJtZy9oIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJNRy9NTCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJtZy9tTCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8ZWxzZSB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJ1bmtub3dueyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9InVuaXQiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0ifSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgIDwvZWxzZT4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgIDxvcGVyYW5kIG5hbWU9InVuaXQiPg0KICAgICAgICAgICAgPG9wZXJhbmRUeXBlU3BlY2lmaWVyIG5hbWU9InQ6U3RyaW5nIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iVG9EYWlseSIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyIgeHNpOnR5cGU9IkZ1bmN0aW9uRGVmIj4NCiAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJDYXNlIj4NCiAgICAgICAgICAgIDxjb21wYXJhbmQgcGF0aD0idW5pdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0icGVyaW9kIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgPC9jb21wYXJhbmQ+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iaCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJNdWx0aXBseSI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImZyZXF1ZW5jeSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJEaXZpZGUiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIyNC4wIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InBlcmlvZCIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0ibWluIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9Ik11bHRpcGx5Ij4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJNdWx0aXBseSI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImZyZXF1ZW5jeSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJEaXZpZGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIyNC4wIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InBlcmlvZCIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSI2MCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0icyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJNdWx0aXBseSI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTXVsdGlwbHkiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ik11bHRpcGx5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZnJlcXVlbmN5IiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkRpdmlkZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6RGVjaW1hbCIgdmFsdWU9IjI0LjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0icGVyaW9kIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjYwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjYwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJkIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IkRpdmlkZSI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTXVsdGlwbHkiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJmcmVxdWVuY3kiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iRGl2aWRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpEZWNpbWFsIiB2YWx1ZT0iMjQuMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJwZXJpb2QiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMjQiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IndrIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IkRpdmlkZSI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTXVsdGlwbHkiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJmcmVxdWVuY3kiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iRGl2aWRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpEZWNpbWFsIiB2YWx1ZT0iMjQuMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJwZXJpb2QiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJNdWx0aXBseSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjI0IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSI3IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJtbyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJEaXZpZGUiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ik11bHRpcGx5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZnJlcXVlbmN5IiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkRpdmlkZSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6RGVjaW1hbCIgdmFsdWU9IjI0LjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0icGVyaW9kIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTXVsdGlwbHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIyNCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMzAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9ImEiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iRGl2aWRlIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJNdWx0aXBseSI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImZyZXF1ZW5jeSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJEaXZpZGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIyNC4wIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InBlcmlvZCIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ik11bHRpcGx5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMjQiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjM2NSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8ZWxzZSBhc1R5cGU9InQ6RGVjaW1hbCIgeHNpOnR5cGU9IkFzIj4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJOdWxsIi8+DQogICAgICAgICAgICAgICA8YXNUeXBlU3BlY2lmaWVyIG5hbWU9InQ6RGVjaW1hbCIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgICAgPC9lbHNlPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZnJlcXVlbmN5Ij4NCiAgICAgICAgICAgIDxvcGVyYW5kVHlwZVNwZWNpZmllciBuYW1lPSJ0OkludGVnZXIiIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgIDxvcGVyYW5kIG5hbWU9InBlcmlvZCI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpRdWFudGl0eSIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9IklzUGF0Y2giIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiIHhzaTp0eXBlPSJGdW5jdGlvbkRlZiI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iRXF1YWwiPg0KICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvSW50ZWdlciI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJjb2RlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NlRm9ybUNvZGUiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjMxNjk4NyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImRvc2VGb3JtQ29kZSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpDb2RlIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iR2V0Q29udmVyc2lvbkZhY3RvciIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyIgeHNpOnR5cGU9IkZ1bmN0aW9uRGVmIj4NCiAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJDYXNlIj4NCiAgICAgICAgICAgIDxjb21wYXJhbmQgeHNpOnR5cGU9IlRvSW50ZWdlciI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJjb2RlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJpbmdyZWRpZW50Q29kZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgIDwvY29tcGFyYW5kPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIxNjEiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjExOTEiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjEyMjMiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjE3NjciIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjE4MTkiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iQ2FzZSI+DQogICAgICAgICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICAgICA8d2hlbiB4c2k6dHlwZT0iRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvSW50ZWdlciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJjb2RlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NlRm9ybUNvZGUiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjMxNjk4NyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvd2hlbj4NCiAgICAgICAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpEZWNpbWFsIiB2YWx1ZT0iMTIuNiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICA8ZWxzZSB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMzAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICA8L2Vsc2U+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIxODQxIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjciIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIxODg2IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIyMTAxIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIyMzU0IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIyNDAwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIyNjcwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4gdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIwLjE1IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMzQyMyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSI0IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMzQ5OCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNDMzNyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJDYXNlIj4NCiAgICAgICAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgICAgICAgIDx3aGVuIHhzaTp0eXBlPSJJbiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9JbnRlZ2VyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImNvZGUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9ImRvc2VGb3JtQ29kZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJMaXN0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iOTcwNzg5IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIzMTcwMDciIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjMxNjk5MiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDwvd2hlbj4NCiAgICAgICAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpEZWNpbWFsIiB2YWx1ZT0iMC4xMyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICAgICA8d2hlbiB4c2k6dHlwZT0iRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvSW50ZWdlciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJjb2RlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NlRm9ybUNvZGUiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjM0NjE2MyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvd2hlbj4NCiAgICAgICAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpEZWNpbWFsIiB2YWx1ZT0iMC4xOCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICAgICA8d2hlbiB4c2k6dHlwZT0iSW4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvSW50ZWdlciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJjb2RlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NlRm9ybUNvZGUiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTGlzdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjEyNjU0MiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMzQ2MTYzIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPC93aGVuPg0KICAgICAgICAgICAgICAgICAgICAgPHRoZW4gdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIwLjE2IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgICAgICAgIDx3aGVuIG5hbWU9IklzUGF0Y2giIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJkb3NlRm9ybUNvZGUiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICA8L3doZW4+DQogICAgICAgICAgICAgICAgICAgICA8dGhlbiB2YWx1ZVR5cGU9InQ6RGVjaW1hbCIgdmFsdWU9IjcuMiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICA8ZWxzZSB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMTAwMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDwvZWxzZT4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjUwMzIiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjU0ODkiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjU2NDAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjYxMDIiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjYzNzgiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMTEiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSI2NzU0IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4gdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIwLjEiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSI2ODEzIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ2FzZSI+DQogICAgICAgICAgICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICAgICAgICA8d2hlbiB4c2k6dHlwZT0iQW5kIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJHcmVhdGVyT3JFcXVhbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZGFpbHlEb3NlIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjEiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTGVzc09yRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9ImRhaWx5RG9zZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIyMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvd2hlbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICAgICAgICA8d2hlbiB4c2k6dHlwZT0iQW5kIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJHcmVhdGVyT3JFcXVhbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZGFpbHlEb3NlIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjIxIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ikxlc3NPckVxdWFsIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkYWlseURvc2UiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNDAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3doZW4+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGhlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjgiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHdoZW4geHNpOnR5cGU9IkFuZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iR3JlYXRlck9yRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9ImRhaWx5RG9zZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSI0MSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJMZXNzT3JFcXVhbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZGFpbHlEb3NlIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjYwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC93aGVuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIxMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICAgICAgICAgICA8d2hlbiB4c2k6dHlwZT0iR3JlYXRlck9yRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9ImRhaWx5RG9zZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSI2MSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvd2hlbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMTIiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgICAgICAgICAgPGVsc2UgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIxMDAwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNzA1MiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIxIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNzI0MiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNzI0MyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNzgwNCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpEZWNpbWFsIiB2YWx1ZT0iMS41IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNzgxNCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIzIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iODAwMSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpEZWNpbWFsIiB2YWx1ZT0iMC4zNyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjgxNjMiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjgxNzUiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9Ijg3NDUiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9Ijg4OTYiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjkwMDkiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjEwNjg5IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4gdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIwLjEiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIxMDg0OSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMTk3NTkiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjE5ODYwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIyMjY5NiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMjI2OTciIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjIzMDg4IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4gdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIwLjI1IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMjcwODQiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjM1NzgwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIyMzcwMDUiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iOCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjYzNjgyNyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNzg3MzkwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPHRoZW4gdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIwLjQiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGVsc2UgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICA8L2Vsc2U+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICA8b3BlcmFuZCBuYW1lPSJpbmdyZWRpZW50Q29kZSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpDb2RlIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICA8b3BlcmFuZCBuYW1lPSJkYWlseURvc2UiPg0KICAgICAgICAgICAgPG9wZXJhbmRUeXBlU3BlY2lmaWVyIG5hbWU9InQ6UXVhbnRpdHkiIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImRvc2VGb3JtQ29kZSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpDb2RlIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iRW5zdXJlTWljcm9ncmFtUXVhbnRpdHkiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiIHhzaTp0eXBlPSJGdW5jdGlvbkRlZiI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iSWYiPg0KICAgICAgICAgICAgPGNvbmRpdGlvbiBhc1R5cGU9InQ6Qm9vbGVhbiIgeHNpOnR5cGU9IkFzIj4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJBbmQiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ikxlc3MiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkRlY2ltYWwiIHZhbHVlPSIwLjEiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlBvc2l0aW9uT2YiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4gdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Im1nIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmluZyBwYXRoPSJ1bml0IiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJzdHJlbmd0aCIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RyaW5nPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPGFzVHlwZVNwZWNpZmllciBuYW1lPSJ0OkJvb2xlYW4iIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgICAgIDwvY29uZGl0aW9uPg0KICAgICAgICAgICAgPHRoZW4gY2xhc3NUeXBlPSJ0OlF1YW50aXR5IiB4c2k6dHlwZT0iSW5zdGFuY2UiPg0KICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiPg0KICAgICAgICAgICAgICAgICAgPHZhbHVlIHhzaTp0eXBlPSJNdWx0aXBseSI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0ic3RyZW5ndGgiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMTAwMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1bml0Ij4NCiAgICAgICAgICAgICAgICAgIDx2YWx1ZSB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Im1jZyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJTdWJzdHJpbmciPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1RvU3ViIHBhdGg9InVuaXQiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHJpbmdUb1N1Yj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzdGFydEluZGV4IHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8ZWxzZSBuYW1lPSJzdHJlbmd0aCIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgIDxvcGVyYW5kIG5hbWU9InN0cmVuZ3RoIj4NCiAgICAgICAgICAgIDxvcGVyYW5kVHlwZVNwZWNpZmllciBuYW1lPSJ0OlF1YW50aXR5IiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iR2V0SW5ncmVkaWVudHMiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiIHhzaTp0eXBlPSJGdW5jdGlvbkRlZiI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iUXVlcnkiPg0KICAgICAgICAgICAgPHNvdXJjZSBhbGlhcz0iQyI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iUXVlcnkiPg0KICAgICAgICAgICAgICAgICAgPHNvdXJjZSBhbGlhcz0iU0QiPg0KICAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24geG1sbnM6bnMwPSJodHRwOi8vb3JnLm9wZW5jZHMvb3Bpb2lkLWNkcyIgZGF0YVR5cGU9Im5zMDpNRURfU0NEQ19GT1JfRFJVRyIgY29kZVByb3BlcnR5PSJEUlVHX1JYQ1VJIiB4c2k6dHlwZT0iUmV0cmlldmUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGVzIHhzaTp0eXBlPSJUb0xpc3QiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0icnhOb3JtQ29kZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvY29kZXM+DQogICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgIDx3aGVyZSB4c2k6dHlwZT0iRXhpc3RzIj4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhtbG5zOm5zMT0iaHR0cDovL29yZy5vcGVuY2RzL29waW9pZC1jZHMiIGRhdGFUeXBlPSJuczE6Tk9OX1NVUkdJQ0FMX09QSU9JRF9UT19JTkNMVURFIiBjb2RlUHJvcGVydHk9IkRSVUdfUlhDVUkiIHhzaTp0eXBlPSJSZXRyaWV2ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8Y29kZXMgeHNpOnR5cGU9IlRvTGlzdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJEUlVHX1JYQ1VJIiBzY29wZT0iU0QiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2Rlcz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDwvd2hlcmU+DQogICAgICAgICAgICAgICAgICA8cmV0dXJuPg0KICAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IlR1cGxlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJ4Tm9ybUNvZGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIG5hbWU9InJ4Tm9ybUNvZGUiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHhzaTp0eXBlPSJTaW5nbGV0b25Gcm9tIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhtbG5zOm5zMj0iaHR0cDovL29yZy5vcGVuY2RzL29waW9pZC1jZHMiIGRhdGFUeXBlPSJuczI6TUVEX1NDREMiIGNvZGVQcm9wZXJ0eT0iU0NEQ19SWENVSSIgeHNpOnR5cGU9IlJldHJpZXZlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlcyB4c2k6dHlwZT0iVG9MaXN0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9IlNDRENfUlhDVUkiIHNjb3BlPSJTRCIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvZGVzPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImluZ3JlZGllbnRDb2RlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJJTkdSRURJRU5UX1JYQ1VJIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSB4c2k6dHlwZT0iU2luZ2xldG9uRnJvbSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4bWxuczpuczM9Imh0dHA6Ly9vcmcub3BlbmNkcy9vcGlvaWQtY2RzIiBkYXRhVHlwZT0ibnMzOk1FRF9JTkdSRURJRU5UX0ZPUl9TQ0RDIiBjb2RlUHJvcGVydHk9IlNDRENfUlhDVUkiIHhzaTp0eXBlPSJSZXRyaWV2ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZXMgeHNpOnR5cGU9IlRvTGlzdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJTQ0RDX1JYQ1VJIiBzY29wZT0iU0QiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2Rlcz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRvc2VGb3JtQ29kZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0iRE9TRV9GT1JNX1JYQ1VJIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSB4c2k6dHlwZT0iU2luZ2xldG9uRnJvbSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4bWxuczpuczQ9Imh0dHA6Ly9vcmcub3BlbmNkcy9vcGlvaWQtY2RzIiBkYXRhVHlwZT0ibnM0Ok1FRF9EUlVHX0RPU0VfRk9STSIgY29kZVByb3BlcnR5PSJEUlVHX1JYQ1VJIiB4c2k6dHlwZT0iUmV0cmlldmUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGVzIHhzaTp0eXBlPSJUb0xpc3QiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0iRFJVR19SWENVSSIgc2NvcGU9IlNEIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29kZXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgICA8L3JldHVybj4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgPGxldCBpZGVudGlmaWVyPSJpbmdyZWRpZW50Ij4NCiAgICAgICAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJTaW5nbGV0b25Gcm9tIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhtbG5zOm5zNT0iaHR0cDovL29yZy5vcGVuY2RzL29waW9pZC1jZHMiIGRhdGFUeXBlPSJuczU6TUVEX0lOR1JFRElFTlQiIGNvZGVQcm9wZXJ0eT0iSU5HUkVESUVOVF9SWENVSSIgeHNpOnR5cGU9IlJldHJpZXZlIj4NCiAgICAgICAgICAgICAgICAgICAgIDxjb2RlcyB4c2k6dHlwZT0iVG9MaXN0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImluZ3JlZGllbnRDb2RlIiBzY29wZT0iQyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICA8L2NvZGVzPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgPC9sZXQ+DQogICAgICAgICAgICA8bGV0IGlkZW50aWZpZXI9ImRvc2VGb3JtIj4NCiAgICAgICAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJTaW5nbGV0b25Gcm9tIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhtbG5zOm5zNj0iaHR0cDovL29yZy5vcGVuY2RzL29waW9pZC1jZHMiIGRhdGFUeXBlPSJuczY6TUVEX0RPU0VfRk9STSIgY29kZVByb3BlcnR5PSJET1NFX0ZPUk1fUlhDVUkiIHhzaTp0eXBlPSJSZXRyaWV2ZSI+DQogICAgICAgICAgICAgICAgICAgICA8Y29kZXMgeHNpOnR5cGU9IlRvTGlzdCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJkb3NlRm9ybUNvZGUiIHNjb3BlPSJDIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvY29kZXM+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICA8L2xldD4NCiAgICAgICAgICAgIDx3aGVyZSB4c2k6dHlwZT0iRXhpc3RzIj4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJRdWVyeSI+DQogICAgICAgICAgICAgICAgICA8c291cmNlIGFsaWFzPSJJVCI+DQogICAgICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiB4bWxuczpuczc9Imh0dHA6Ly9vcmcub3BlbmNkcy9vcGlvaWQtY2RzIiBkYXRhVHlwZT0ibnM3Ok1FRF9JTkdSRURJRU5UX1RZUEUiIGNvZGVQcm9wZXJ0eT0iSU5HUkVESUVOVF9SWENVSSIgeHNpOnR5cGU9IlJldHJpZXZlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlcyB4c2k6dHlwZT0iVG9MaXN0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImluZ3JlZGllbnRDb2RlIiBzY29wZT0iQyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2NvZGVzPg0KICAgICAgICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICAgICA8d2hlcmUgeHNpOnR5cGU9IkVxdWFsIj4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9IklOR1JFRElFTlRfVFlQRSIgc2NvcGU9IklUIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJOb25TdXJnaWNhbE9waW9pZCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDwvd2hlcmU+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICA8L3doZXJlPg0KICAgICAgICAgICAgPHJldHVybj4NCiAgICAgICAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJUdXBsZSI+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyeE5vcm1Db2RlIj4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBuYW1lPSJyeE5vcm1Db2RlIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZG9zZUZvcm1Db2RlIj4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJkb3NlRm9ybUNvZGUiIHNjb3BlPSJDIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRvc2VGb3JtTmFtZSI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0iRE9TRV9GT1JNX05BTUUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9ImRvc2VGb3JtIiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpbmdyZWRpZW50Q29kZSI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0iaW5ncmVkaWVudENvZGUiIHNjb3BlPSJDIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImluZ3JlZGllbnROYW1lIj4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJJTkdSRURJRU5UX05BTUUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9ImluZ3JlZGllbnQiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InN0cmVuZ3RoIj4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBuYW1lPSJFbnN1cmVNaWNyb2dyYW1RdWFudGl0eSIgeHNpOnR5cGU9IkZ1bmN0aW9uUmVmIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIGNsYXNzVHlwZT0idDpRdWFudGl0eSIgeHNpOnR5cGU9Ikluc3RhbmNlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJTVFJFTkdUSF9WQUxVRSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iY29tcG9uZW50IiBzY29wZT0iQyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idW5pdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUgbmFtZT0iVG9VQ1VNIiB4c2k6dHlwZT0iRnVuY3Rpb25SZWYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0iU1RSRU5HVEhfVU5JVCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iY29tcG9uZW50IiBzY29wZT0iQyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvcmV0dXJuPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgPG9wZXJhbmQgbmFtZT0icnhOb3JtQ29kZSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpDb2RlIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iR2V0RGFpbHlEb3NlIiBjb250ZXh0PSJQYXRpZW50IiBhY2Nlc3NMZXZlbD0iUHVibGljIiB4c2k6dHlwZT0iRnVuY3Rpb25EZWYiPg0KICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IkNhc2UiPg0KICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgPHdoZW4gbmFtZT0iSXNQYXRjaCIgeHNpOnR5cGU9IkZ1bmN0aW9uUmVmIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImRvc2VGb3JtQ29kZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgIDwvd2hlbj4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJJZiI+DQogICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGFzVHlwZT0idDpCb29sZWFuIiB4c2k6dHlwZT0iQXMiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkluIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0ludGVnZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0iY29kZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iaW5ncmVkaWVudENvZGUiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTGlzdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjE4MTkiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjQzMzciIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8YXNUeXBlU3BlY2lmaWVyIG5hbWU9InQ6Qm9vbGVhbiIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgICAgICAgICAgPC9jb25kaXRpb24+DQogICAgICAgICAgICAgICAgICA8dGhlbiBjbGFzc1R5cGU9InQ6UXVhbnRpdHkiIHhzaTp0eXBlPSJJbnN0YW5jZSI+DQogICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUgeHNpOnR5cGU9Ik11bHRpcGx5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NlUXVhbnRpdHkiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0ic3RyZW5ndGgiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idW5pdCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0idW5pdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0ic3RyZW5ndGgiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgICAgICAgPGVsc2UgYXNUeXBlPSJ0OlF1YW50aXR5IiB4c2k6dHlwZT0iQXMiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ik51bGwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDxhc1R5cGVTcGVjaWZpZXIgbmFtZT0idDpRdWFudGl0eSIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgICAgICAgICAgPC9lbHNlPg0KICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgIDx3aGVuIHhzaTp0eXBlPSJJbiI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ1bml0IiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NlUXVhbnRpdHkiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTGlzdCI+DQogICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0ibWciIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0ibWNnIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPC93aGVuPg0KICAgICAgICAgICAgICAgPHRoZW4gY2xhc3NUeXBlPSJ0OlF1YW50aXR5IiB4c2k6dHlwZT0iSW5zdGFuY2UiPg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiPg0KICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHhzaTp0eXBlPSJNdWx0aXBseSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJkb3Nlc1BlckRheSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NlUXVhbnRpdHkiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idW5pdCI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0idW5pdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZG9zZVF1YW50aXR5IiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB4c2k6dHlwZT0iQW5kIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJFcXVhbCI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ1bml0IiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NlUXVhbnRpdHkiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0ibUwiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlBvc2l0aW9uT2YiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4gdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Ii9tTCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmcgcGF0aD0idW5pdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0ic3RyZW5ndGgiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3N0cmluZz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJTdWJ0cmFjdCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTGVuZ3RoIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InVuaXQiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIzIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPC93aGVuPg0KICAgICAgICAgICAgICAgPHRoZW4gY2xhc3NUeXBlPSJ0OlF1YW50aXR5IiB4c2k6dHlwZT0iSW5zdGFuY2UiPg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiPg0KICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHhzaTp0eXBlPSJNdWx0aXBseSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTXVsdGlwbHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZG9zZXNQZXJEYXkiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZG9zZVF1YW50aXR5IiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVuaXQiPg0KICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHhzaTp0eXBlPSJTdWJzdHJpbmciPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1RvU3ViIHBhdGg9InVuaXQiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHJpbmdUb1N1Yj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzdGFydEluZGV4IHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxsZW5ndGggeHNpOnR5cGU9IlBvc2l0aW9uT2YiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4gdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Ii8iIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nIHBhdGg9InVuaXQiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHJpbmc+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2xlbmd0aD4NCiAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgPGVsc2UgY2xhc3NUeXBlPSJ0OlF1YW50aXR5IiB4c2k6dHlwZT0iSW5zdGFuY2UiPg0KICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiPg0KICAgICAgICAgICAgICAgICAgPHZhbHVlIHhzaTp0eXBlPSJNdWx0aXBseSI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iTXVsdGlwbHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZG9zZXNQZXJEYXkiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZG9zZVF1YW50aXR5IiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVuaXQiPg0KICAgICAgICAgICAgICAgICAgPHZhbHVlIHhzaTp0eXBlPSJTdWJzdHJpbmciPg0KICAgICAgICAgICAgICAgICAgICAgPHN0cmluZ1RvU3ViIHBhdGg9InVuaXQiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9zdHJpbmdUb1N1Yj4NCiAgICAgICAgICAgICAgICAgICAgIDxzdGFydEluZGV4IHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDxsZW5ndGggeHNpOnR5cGU9IlBvc2l0aW9uT2YiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4gdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Ii8iIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nIHBhdGg9InVuaXQiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHJpbmc+DQogICAgICAgICAgICAgICAgICAgICA8L2xlbmd0aD4NCiAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICA8L2Vsc2U+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICA8b3BlcmFuZCBuYW1lPSJpbmdyZWRpZW50Q29kZSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpDb2RlIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICA8b3BlcmFuZCBuYW1lPSJzdHJlbmd0aCI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpRdWFudGl0eSIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZG9zZUZvcm1Db2RlIj4NCiAgICAgICAgICAgIDxvcGVyYW5kVHlwZVNwZWNpZmllciBuYW1lPSJ0OkNvZGUiIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImRvc2VRdWFudGl0eSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpRdWFudGl0eSIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZG9zZXNQZXJEYXkiPg0KICAgICAgICAgICAgPG9wZXJhbmRUeXBlU3BlY2lmaWVyIG5hbWU9InQ6RGVjaW1hbCIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9IkdldE1lZGljYXRpb25OYW1lIiBjb250ZXh0PSJQYXRpZW50IiBhY2Nlc3NMZXZlbD0iUHVibGljIiB4c2k6dHlwZT0iRnVuY3Rpb25EZWYiPg0KICAgICAgICAgPGV4cHJlc3Npb24gcGF0aD0iRFJVR19OQU1FIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgPHNvdXJjZSB4c2k6dHlwZT0iU2luZ2xldG9uRnJvbSI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4bWxuczpuczg9Imh0dHA6Ly9vcmcub3BlbmNkcy9vcGlvaWQtY2RzIiBkYXRhVHlwZT0ibnM4Ok1FRF9EUlVHIiBjb2RlUHJvcGVydHk9IkRSVUdfUlhDVUkiIHhzaTp0eXBlPSJSZXRyaWV2ZSI+DQogICAgICAgICAgICAgICAgICA8Y29kZXMgeHNpOnR5cGU9IlRvTGlzdCI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJyeE5vcm1Db2RlIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgPC9jb2Rlcz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgPG9wZXJhbmQgbmFtZT0icnhOb3JtQ29kZSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpDb2RlIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iR2V0RGFpbHlEb3NlRGVzY3JpcHRpb24iIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiIHhzaTp0eXBlPSJGdW5jdGlvbkRlZiI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iQ2FzZSI+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiBuYW1lPSJJc1BhdGNoIiB4c2k6dHlwZT0iRnVuY3Rpb25SZWYiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZG9zZUZvcm1Db2RlIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgPC93aGVuPg0KICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IklmIj4NCiAgICAgICAgICAgICAgICAgIDxjb25kaXRpb24gYXNUeXBlPSJ0OkJvb2xlYW4iIHhzaTp0eXBlPSJBcyI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iSW4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvSW50ZWdlciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJjb2RlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJpbmdyZWRpZW50Q29kZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJMaXN0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMTgxOSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iNDMzNyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDxhc1R5cGVTcGVjaWZpZXIgbmFtZT0idDpCb29sZWFuIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICAgICAgICAgICA8L2NvbmRpdGlvbj4NCiAgICAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImluZ3JlZGllbnROYW1lIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IiBwYXRjaDogIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvU3RyaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NlUXVhbnRpdHkiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iICogIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvU3RyaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IiA9ICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb1N0cmluZyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJkYWlseURvc2UiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICAgICAgICA8ZWxzZSBhc1R5cGU9InQ6U3RyaW5nIiB4c2k6dHlwZT0iQXMiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ik51bGwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDxhc1R5cGVTcGVjaWZpZXIgbmFtZT0idDpTdHJpbmciIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgICAgICAgICAgIDwvZWxzZT4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8Y2FzZUl0ZW0+DQogICAgICAgICAgICAgICA8d2hlbiB4c2k6dHlwZT0iSW4iPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idW5pdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZG9zZVF1YW50aXR5IiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ikxpc3QiPg0KICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Im1nIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Im1jZyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDwvd2hlbj4NCiAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iaW5ncmVkaWVudE5hbWUiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImRvc2VGb3JtTmFtZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSI6ICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb1N0cmluZyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJkb3Nlc1BlckRheSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSIvZCAqICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb1N0cmluZyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJkb3NlUXVhbnRpdHkiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iID0gIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvU3RyaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImRhaWx5RG9zZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDwvY2FzZUl0ZW0+DQogICAgICAgICAgICA8ZWxzZSB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iaW5ncmVkaWVudE5hbWUiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImRvc2VGb3JtTmFtZSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSI6ICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb1N0cmluZyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJkb3Nlc1BlckRheSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSIvZCAqICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb1N0cmluZyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJkb3NlUXVhbnRpdHkiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iICogIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvU3RyaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9InN0cmVuZ3RoIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IiA9ICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb1N0cmluZyI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJkYWlseURvc2UiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICA8L2Vsc2U+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICA8b3BlcmFuZCBuYW1lPSJpbmdyZWRpZW50Q29kZSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpDb2RlIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICA8b3BlcmFuZCBuYW1lPSJpbmdyZWRpZW50TmFtZSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpTdHJpbmciIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgIDxvcGVyYW5kIG5hbWU9InN0cmVuZ3RoIj4NCiAgICAgICAgICAgIDxvcGVyYW5kVHlwZVNwZWNpZmllciBuYW1lPSJ0OlF1YW50aXR5IiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICA8b3BlcmFuZCBuYW1lPSJkb3NlRm9ybUNvZGUiPg0KICAgICAgICAgICAgPG9wZXJhbmRUeXBlU3BlY2lmaWVyIG5hbWU9InQ6Q29kZSIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZG9zZUZvcm1OYW1lIj4NCiAgICAgICAgICAgIDxvcGVyYW5kVHlwZVNwZWNpZmllciBuYW1lPSJ0OlN0cmluZyIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZG9zZVF1YW50aXR5Ij4NCiAgICAgICAgICAgIDxvcGVyYW5kVHlwZVNwZWNpZmllciBuYW1lPSJ0OlF1YW50aXR5IiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICA8b3BlcmFuZCBuYW1lPSJkb3Nlc1BlckRheSI+DQogICAgICAgICAgICA8b3BlcmFuZFR5cGVTcGVjaWZpZXIgbmFtZT0idDpEZWNpbWFsIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICA8b3BlcmFuZCBuYW1lPSJkYWlseURvc2UiPg0KICAgICAgICAgICAgPG9wZXJhbmRUeXBlU3BlY2lmaWVyIG5hbWU9InQ6UXVhbnRpdHkiIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgIDwvZGVmPg0KICAgICAgPGRlZiBuYW1lPSJDYWxjdWxhdGVNTUVzIiBjb250ZXh0PSJQYXRpZW50IiBhY2Nlc3NMZXZlbD0iUHVibGljIiB4c2k6dHlwZT0iRnVuY3Rpb25EZWYiPg0KICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IkZsYXR0ZW4iPg0KICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlF1ZXJ5Ij4NCiAgICAgICAgICAgICAgIDxzb3VyY2UgYWxpYXM9Ik0iPg0KICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24gbmFtZT0ibWVkaWNhdGlvbnMiIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgIDxsZXQgaWRlbnRpZmllcj0iSW5ncmVkaWVudHMiPg0KICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24gbmFtZT0iR2V0SW5ncmVkaWVudHMiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJyeE5vcm1Db2RlIiBzY29wZT0iTSIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICAgICA8L2xldD4NCiAgICAgICAgICAgICAgIDxyZXR1cm4+DQogICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iUXVlcnkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBhbGlhcz0iSSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBuYW1lPSJJbmdyZWRpZW50cyIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgICAgIDxsZXQgaWRlbnRpZmllcj0iYWRqdXN0ZWREb3NlUXVhbnRpdHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24gbmFtZT0iRW5zdXJlTWljcm9ncmFtUXVhbnRpdHkiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJkb3NlUXVhbnRpdHkiIHNjb3BlPSJNIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgICAgICAgICAgIDwvbGV0Pg0KICAgICAgICAgICAgICAgICAgICAgPGxldCBpZGVudGlmaWVyPSJkYWlseURvc2UiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24gbmFtZT0iR2V0RGFpbHlEb3NlIiB4c2k6dHlwZT0iRnVuY3Rpb25SZWYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0iaW5ncmVkaWVudENvZGUiIHNjb3BlPSJJIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InN0cmVuZ3RoIiBzY29wZT0iSSIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJkb3NlRm9ybUNvZGUiIHNjb3BlPSJJIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImFkanVzdGVkRG9zZVF1YW50aXR5IiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImRvc2VzUGVyRGF5IiBzY29wZT0iTSIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgICAgICA8L2xldD4NCiAgICAgICAgICAgICAgICAgICAgIDxsZXQgaWRlbnRpZmllcj0iZmFjdG9yIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxleHByZXNzaW9uIG5hbWU9IkdldENvbnZlcnNpb25GYWN0b3IiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJpbmdyZWRpZW50Q29kZSIgc2NvcGU9IkkiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZGFpbHlEb3NlIiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImRvc2VGb3JtQ29kZSIgc2NvcGU9IkkiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgICAgICAgICAgPC9sZXQ+DQogICAgICAgICAgICAgICAgICAgICA8cmV0dXJuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IlR1cGxlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJ4Tm9ybUNvZGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9InJ4Tm9ybUNvZGUiIHNjb3BlPSJNIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRvc2VGb3JtQ29kZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0iZG9zZUZvcm1Db2RlIiBzY29wZT0iSSIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkb3NlUXVhbnRpdHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIG5hbWU9ImFkanVzdGVkRG9zZVF1YW50aXR5IiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRvc2VzUGVyRGF5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJkb3Nlc1BlckRheSIgc2NvcGU9Ik0iIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaW5ncmVkaWVudENvZGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9ImluZ3JlZGllbnRDb2RlIiBzY29wZT0iSSIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpbmdyZWRpZW50TmFtZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0iaW5ncmVkaWVudE5hbWUiIHNjb3BlPSJJIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InN0cmVuZ3RoIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJzdHJlbmd0aCIgc2NvcGU9IkkiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGFpbHlEb3NlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBuYW1lPSJkYWlseURvc2UiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGFpbHlEb3NlRGVzY3JpcHRpb24iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIG5hbWU9IkdldERhaWx5RG9zZURlc2NyaXB0aW9uIiB4c2k6dHlwZT0iRnVuY3Rpb25SZWYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0iaW5ncmVkaWVudENvZGUiIHNjb3BlPSJJIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImluZ3JlZGllbnROYW1lIiBzY29wZT0iSSIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJzdHJlbmd0aCIgc2NvcGU9IkkiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0iZG9zZUZvcm1Db2RlIiBzY29wZT0iSSIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJkb3NlRm9ybU5hbWUiIHNjb3BlPSJJIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImFkanVzdGVkRG9zZVF1YW50aXR5IiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImRvc2VzUGVyRGF5IiBzY29wZT0iTSIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJkYWlseURvc2UiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNvbnZlcnNpb25GYWN0b3IiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIG5hbWU9ImZhY3RvciIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJtbWUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIGNsYXNzVHlwZT0idDpRdWFudGl0eSIgeHNpOnR5cGU9Ikluc3RhbmNlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSB4c2k6dHlwZT0iTXVsdGlwbHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9ImRhaWx5RG9zZSIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJmYWN0b3IiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVuaXQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ1bml0IiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkYWlseURvc2UiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Ii9kIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgICAgICA8L3JldHVybj4NCiAgICAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgICAgIDwvcmV0dXJuPg0KICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgPG9wZXJhbmQgbmFtZT0ibWVkaWNhdGlvbnMiPg0KICAgICAgICAgICAgPG9wZXJhbmRUeXBlU3BlY2lmaWVyIHhzaTp0eXBlPSJMaXN0VHlwZVNwZWNpZmllciI+DQogICAgICAgICAgICAgICA8ZWxlbWVudFR5cGUgeHNpOnR5cGU9IlR1cGxlVHlwZVNwZWNpZmllciI+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyeE5vcm1Db2RlIj4NCiAgICAgICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9InQ6Q29kZSIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZG9zZVF1YW50aXR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9InQ6UXVhbnRpdHkiIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRvc2VzUGVyRGF5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDx0eXBlIG5hbWU9InQ6RGVjaW1hbCIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgPC9lbGVtZW50VHlwZT4NCiAgICAgICAgICAgIDwvb3BlcmFuZFR5cGVTcGVjaWZpZXI+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iVGVzdENhbGN1bGF0ZU1NRXMiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPg0KICAgICAgICAgPGV4cHJlc3Npb24gbmFtZT0iQ2FsY3VsYXRlTU1FcyIgeHNpOnR5cGU9IkZ1bmN0aW9uUmVmIj4NCiAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJMaXN0Ij4NCiAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTp0eXBlPSJUdXBsZSI+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyeE5vcm1Db2RlIj4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBjb2RlPSIzODg1MDgiIHhzaTp0eXBlPSJDb2RlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW0gbmFtZT0iUnhOb3JtIi8+DQogICAgICAgICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZG9zZVF1YW50aXR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBjbGFzc1R5cGU9InQ6UXVhbnRpdHkiIHhzaTp0eXBlPSJJbnN0YW5jZSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUgeHNpOnR5cGU9IlRvRGVjaW1hbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjEiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idW5pdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9InBhdGNoIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRvc2VzUGVyRGF5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSB2YWx1ZVR5cGU9InQ6RGVjaW1hbCIgdmFsdWU9IjAuMzMiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICA8L2RlZj4NCiAgIDwvc3RhdGVtZW50cz4NCjwvbGlicmFyeT4=" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-library-primary.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-library-primary.json new file mode 100644 index 00000000000..2eb5210f563 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/cdc-opioid-guidance-library-primary.json @@ -0,0 +1,19 @@ +{ + "resourceType": "Library", + "id": "OpioidCdsStu3", + "version": "0.1.0", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "status": "draft", + "content": [ + { + "contentType": "application/elm+xml", + "data": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxsaWJyYXJ5IHhtbG5zPSJ1cm46aGw3LW9yZzplbG06cjEiIHhtbG5zOnQ9InVybjpobDctb3JnOmVsbS10eXBlczpyMSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6Zmhpcj0iaHR0cDovL2hsNy5vcmcvZmhpciIgeG1sbnM6YT0idXJuOmhsNy1vcmc6Y3FsLWFubm90YXRpb25zOnIxIj4NCiAgIDxpZGVudGlmaWVyIGlkPSJPcGlvaWRDRFNfU1RVMyIgdmVyc2lvbj0iMC4xLjAiLz4NCiAgIDxzY2hlbWFJZGVudGlmaWVyIGlkPSJ1cm46aGw3LW9yZzplbG0iIHZlcnNpb249InIxIi8+DQogICA8dXNpbmdzPg0KICAgICAgPGRlZiBsb2NhbElkZW50aWZpZXI9IlN5c3RlbSIgdXJpPSJ1cm46aGw3LW9yZzplbG0tdHlwZXM6cjEiLz4NCiAgICAgIDxkZWYgbG9jYWxJZGVudGlmaWVyPSJGSElSIiB1cmk9Imh0dHA6Ly9obDcub3JnL2ZoaXIiIHZlcnNpb249IjMuMC4wIi8+DQogICA8L3VzaW5ncz4NCiAgIDxpbmNsdWRlcz4NCiAgICAgIDxkZWYgbG9jYWxJZGVudGlmaWVyPSJPTVRLTG9naWMiIHBhdGg9Ik9NVEtMb2dpYyIgdmVyc2lvbj0iMC4xLjAiLz4NCiAgIDwvaW5jbHVkZXM+DQogICA8cGFyYW1ldGVycz4NCiAgICAgIDxkZWYgbmFtZT0iVXNlcklEIiBhY2Nlc3NMZXZlbD0iUHVibGljIj4NCiAgICAgICAgIDxwYXJhbWV0ZXJUeXBlU3BlY2lmaWVyIG5hbWU9InQ6U3RyaW5nIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iT3JkZXJzIiBhY2Nlc3NMZXZlbD0iUHVibGljIj4NCiAgICAgICAgIDxwYXJhbWV0ZXJUeXBlU3BlY2lmaWVyIHhzaTp0eXBlPSJMaXN0VHlwZVNwZWNpZmllciI+DQogICAgICAgICAgICA8ZWxlbWVudFR5cGUgbmFtZT0iZmhpcjpNZWRpY2F0aW9uUmVxdWVzdCIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgPC9wYXJhbWV0ZXJUeXBlU3BlY2lmaWVyPg0KICAgICAgPC9kZWY+DQogICA8L3BhcmFtZXRlcnM+DQogICA8c3RhdGVtZW50cz4NCiAgICAgIDxkZWYgbmFtZT0iUGF0aWVudCIgY29udGV4dD0iUGF0aWVudCI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iU2luZ2xldG9uRnJvbSI+DQogICAgICAgICAgICA8b3BlcmFuZCBkYXRhVHlwZT0iZmhpcjpQYXRpZW50IiB4c2k6dHlwZT0iUmV0cmlldmUiLz4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgIDwvZGVmPg0KICAgICAgPGRlZiBuYW1lPSJUb0NvZGUiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiIHhzaTp0eXBlPSJGdW5jdGlvbkRlZiI+DQogICAgICAgICA8ZXhwcmVzc2lvbiBjbGFzc1R5cGU9InQ6Q29kZSIgeHNpOnR5cGU9Ikluc3RhbmNlIj4NCiAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNvZGUiPg0KICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJjb2RlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJjb2RpbmciIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzeXN0ZW0iPg0KICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJzeXN0ZW0iIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9ImNvZGluZyIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZlcnNpb24iPg0KICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJ2ZXJzaW9uIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJjb2RpbmciIHhzaTp0eXBlPSJPcGVyYW5kUmVmIi8+DQogICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkaXNwbGF5Ij4NCiAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iZGlzcGxheSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iY29kaW5nIiB4c2k6dHlwZT0iT3BlcmFuZFJlZiIvPg0KICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgPG9wZXJhbmQgbmFtZT0iY29kaW5nIj4NCiAgICAgICAgICAgIDxvcGVyYW5kVHlwZVNwZWNpZmllciBuYW1lPSJmaGlyOkNvZGluZyIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9IlRvUXVhbnRpdHkiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiIHhzaTp0eXBlPSJGdW5jdGlvbkRlZiI+DQogICAgICAgICA8ZXhwcmVzc2lvbiBjbGFzc1R5cGU9InQ6UXVhbnRpdHkiIHhzaTp0eXBlPSJJbnN0YW5jZSI+DQogICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZSI+DQogICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJxdWFudGl0eSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVuaXQiPg0KICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJ1bml0IiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJxdWFudGl0eSIgeHNpOnR5cGU9Ik9wZXJhbmRSZWYiLz4NCiAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgIDxvcGVyYW5kIG5hbWU9InF1YW50aXR5Ij4NCiAgICAgICAgICAgIDxvcGVyYW5kVHlwZVNwZWNpZmllciBuYW1lPSJmaGlyOlF1YW50aXR5IiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICA8L29wZXJhbmQ+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iSXNGb3JDaHJvbmljUGFpbiIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB2YWx1ZVR5cGU9InQ6Qm9vbGVhbiIgdmFsdWU9InRydWUiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iSGFzTWV0YXN0YXRpY0NhbmNlciIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB2YWx1ZVR5cGU9InQ6Qm9vbGVhbiIgdmFsdWU9ImZhbHNlIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9IlByZXNjcmlwdGlvbnMiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPg0KICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IlF1ZXJ5Ij4NCiAgICAgICAgICAgIDxzb3VyY2UgYWxpYXM9Ik8iPg0KICAgICAgICAgICAgICAgPGV4cHJlc3Npb24gbmFtZT0iT3JkZXJzIiB4c2k6dHlwZT0iUGFyYW1ldGVyUmVmIi8+DQogICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgIDxsZXQgaWRlbnRpZmllcj0icnhOb3JtQ29kZSI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBuYW1lPSJUb0NvZGUiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iSW5kZXhlciI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJjb2RpbmciIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9Im1lZGljYXRpb24iIHNjb3BlPSJPIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iMCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvbGV0Pg0KICAgICAgICAgICAgPGxldCBpZGVudGlmaWVyPSJtZWRpY2F0aW9uTmFtZSI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBuYW1lPSJHZXRNZWRpY2F0aW9uTmFtZSIgbGlicmFyeU5hbWU9Ik9NVEtMb2dpYyIgeHNpOnR5cGU9IkZ1bmN0aW9uUmVmIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9InJ4Tm9ybUNvZGUiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgPC9sZXQ+DQogICAgICAgICAgICA8bGV0IGlkZW50aWZpZXI9ImRvc2FnZUluc3RydWN0aW9uIj4NCiAgICAgICAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJJbmRleGVyIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImRvc2FnZUluc3RydWN0aW9uIiBzY29wZT0iTyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6SW50ZWdlciIgdmFsdWU9IjAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICA8L2xldD4NCiAgICAgICAgICAgIDxsZXQgaWRlbnRpZmllcj0icmVwZWF0Ij4NCiAgICAgICAgICAgICAgIDxleHByZXNzaW9uIHBhdGg9InJlcGVhdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0idGltaW5nIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NhZ2VJbnN0cnVjdGlvbiIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvbGV0Pg0KICAgICAgICAgICAgPGxldCBpZGVudGlmaWVyPSJmcmVxdWVuY3kiPg0KICAgICAgICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IkNvYWxlc2NlIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJmcmVxdWVuY3lNYXgiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InJlcGVhdCIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJmcmVxdWVuY3kiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InJlcGVhdCIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvbGV0Pg0KICAgICAgICAgICAgPGxldCBpZGVudGlmaWVyPSJwZXJpb2QiPg0KICAgICAgICAgICAgICAgPGV4cHJlc3Npb24gY2xhc3NUeXBlPSJ0OlF1YW50aXR5IiB4c2k6dHlwZT0iSW5zdGFuY2UiPg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiPg0KICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJwZXJpb2QiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9InJlcGVhdCIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1bml0Ij4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0icGVyaW9kVW5pdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0icmVwZWF0IiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvbGV0Pg0KICAgICAgICAgICAgPGxldCBpZGVudGlmaWVyPSJkb3NlRGVzY3JpcHRpb24iPg0KICAgICAgICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IkNvYWxlc2NlIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0xpc3QiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IklmIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxjb25kaXRpb24gYXNUeXBlPSJ0OkJvb2xlYW4iIHhzaTp0eXBlPSJBcyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iSXMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0iZG9zZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZG9zYWdlSW5zdHJ1Y3Rpb24iIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlzVHlwZVNwZWNpZmllciBuYW1lPSJmaGlyOlJhbmdlIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8YXNUeXBlU3BlY2lmaWVyIG5hbWU9InQ6Qm9vbGVhbiIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25kaXRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9TdHJpbmciPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iVG9RdWFudGl0eSIgeHNpOnR5cGU9IkZ1bmN0aW9uUmVmIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImxvdyIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iZG9zZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZG9zYWdlSW5zdHJ1Y3Rpb24iIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iLSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb1N0cmluZyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJUb1F1YW50aXR5IiB4c2k6dHlwZT0iRnVuY3Rpb25SZWYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0iaGlnaCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iZG9zZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZG9zYWdlSW5zdHJ1Y3Rpb24iIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0idW5pdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iaGlnaCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iZG9zZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZG9zYWdlSW5zdHJ1Y3Rpb24iIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGVsc2UgeHNpOnR5cGU9IlRvU3RyaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9IlRvUXVhbnRpdHkiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBhc1R5cGU9ImZoaXI6UXVhbnRpdHkiIHhzaTp0eXBlPSJBcyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJkb3NlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NhZ2VJbnN0cnVjdGlvbiIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXNUeXBlU3BlY2lmaWVyIG5hbWU9ImZoaXI6UXVhbnRpdHkiIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxzZT4NCiAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvbGV0Pg0KICAgICAgICAgICAgPGxldCBpZGVudGlmaWVyPSJmcmVxdWVuY3lEZXNjcmlwdGlvbiI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvU3RyaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJmcmVxdWVuY3kiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9InJlcGVhdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0idGltaW5nIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NhZ2VJbnN0cnVjdGlvbiIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29hbGVzY2UiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSItIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvU3RyaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJmcmVxdWVuY3lNYXgiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9InJlcGVhdCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0idGltaW5nIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NhZ2VJbnN0cnVjdGlvbiIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgPC9sZXQ+DQogICAgICAgICAgICA8cmV0dXJuPg0KICAgICAgICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IlR1cGxlIj4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJ4Tm9ybUNvZGUiPg0KICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIG5hbWU9InJ4Tm9ybUNvZGUiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaXNEcmFmdCI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgeHNpOnR5cGU9IkVxdWFsIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJzdGF0dXMiIHNjb3BlPSJPIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJkcmFmdCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpc1BSTiI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9ImFzTmVlZGVkIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NhZ2VJbnN0cnVjdGlvbiIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwcmVzY3JpcHRpb24iPg0KICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHhzaTp0eXBlPSJJZiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGFzVHlwZT0idDpCb29sZWFuIiB4c2k6dHlwZT0iQXMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ik5vdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iSXNOdWxsIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InRleHQiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIG5hbWU9ImRvc2FnZUluc3RydWN0aW9uIiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhc1R5cGVTcGVjaWZpZXIgbmFtZT0idDpCb29sZWFuIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmRpdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0ibWVkaWNhdGlvbk5hbWUiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IiAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0idGV4dCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iZG9zYWdlSW5zdHJ1Y3Rpb24iIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZWxzZSB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9Im1lZGljYXRpb25OYW1lIiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSIgIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iZG9zZURlc2NyaXB0aW9uIiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSIgcSIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9ImZyZXF1ZW5jeURlc2NyaXB0aW9uIiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJJZiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGFzVHlwZT0idDpCb29sZWFuIiB4c2k6dHlwZT0iQXMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9ImFzTmVlZGVkIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NhZ2VJbnN0cnVjdGlvbiIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhc1R5cGVTcGVjaWZpZXIgbmFtZT0idDpCb29sZWFuIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmRpdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSIgUFJOIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsc2UgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxzZT4NCiAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkb3NlIj4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSB4c2k6dHlwZT0iSWYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhc1R5cGU9InQ6Qm9vbGVhbiIgeHNpOnR5cGU9IkFzIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJJcyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJkb3NlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NhZ2VJbnN0cnVjdGlvbiIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aXNUeXBlU3BlY2lmaWVyIG5hbWU9ImZoaXI6UmFuZ2UiIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhc1R5cGVTcGVjaWZpZXIgbmFtZT0idDpCb29sZWFuIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmRpdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVuIG5hbWU9IlRvUXVhbnRpdHkiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJoaWdoIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJkb3NlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NhZ2VJbnN0cnVjdGlvbiIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxlbHNlIG5hbWU9IlRvUXVhbnRpdHkiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBhc1R5cGU9ImZoaXI6UXVhbnRpdHkiIHhzaTp0eXBlPSJBcyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJkb3NlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJkb3NhZ2VJbnN0cnVjdGlvbiIgeHNpOnR5cGU9IlF1ZXJ5TGV0UmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXNUeXBlU3BlY2lmaWVyIG5hbWU9ImZoaXI6UXVhbnRpdHkiIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxzZT4NCiAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkb3Nlc1BlckRheSI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgeHNpOnR5cGU9IkNvYWxlc2NlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9IlRvRGFpbHkiIGxpYnJhcnlOYW1lPSJPTVRLTG9naWMiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJmcmVxdWVuY3kiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0icGVyaW9kIiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpEZWNpbWFsIiB2YWx1ZT0iMS4wIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvcmV0dXJuPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9Ik1NRSIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iUXVlcnkiPg0KICAgICAgICAgICAgPHNvdXJjZSBhbGlhcz0iUCI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBuYW1lPSJQcmVzY3JpcHRpb25zIiB4c2k6dHlwZT0iRXhwcmVzc2lvblJlZiIvPg0KICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICA8bGV0IGlkZW50aWZpZXI9Im1tZSI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iU2luZ2xldG9uRnJvbSI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJDYWxjdWxhdGVNTUVzIiBsaWJyYXJ5TmFtZT0iT01US0xvZ2ljIiB4c2k6dHlwZT0iRnVuY3Rpb25SZWYiPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9Ikxpc3QiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOnR5cGU9IlR1cGxlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJ4Tm9ybUNvZGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9InJ4Tm9ybUNvZGUiIHNjb3BlPSJQIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRvc2VRdWFudGl0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0iZG9zZSIgc2NvcGU9IlAiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZG9zZXNQZXJEYXkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9ImRvc2VzUGVyRGF5IiBzY29wZT0iUCIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICA8L2xldD4NCiAgICAgICAgICAgIDxyZXR1cm4+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iVHVwbGUiPg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icnhOb3JtQ29kZSI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0icnhOb3JtQ29kZSIgc2NvcGU9IlAiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaXNEcmFmdCI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0iaXNEcmFmdCIgc2NvcGU9IlAiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaXNQUk4iPg0KICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9ImlzUFJOIiBzY29wZT0iUCIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwcmVzY3JpcHRpb24iPg0KICAgICAgICAgICAgICAgICAgICAgPHZhbHVlIHBhdGg9InByZXNjcmlwdGlvbiIgc2NvcGU9IlAiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGFpbHlEb3NlIj4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJkYWlseURvc2VEZXNjcmlwdGlvbiIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0ibW1lIiB4c2k6dHlwZT0iUXVlcnlMZXRSZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uRmFjdG9yIj4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSBwYXRoPSJjb252ZXJzaW9uRmFjdG9yIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJtbWUiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im1tZSI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgcGF0aD0ibW1lIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJtbWUiIHhzaTp0eXBlPSJRdWVyeUxldFJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvcmV0dXJuPg0KICAgICAgICAgICAgPHNvcnQ+DQogICAgICAgICAgICAgICA8YnkgZGlyZWN0aW9uPSJhc2MiIHhzaTp0eXBlPSJCeUV4cHJlc3Npb24iPg0KICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IklmIj4NCiAgICAgICAgICAgICAgICAgICAgIDxjb25kaXRpb24gYXNUeXBlPSJ0OkJvb2xlYW4iIHhzaTp0eXBlPSJBcyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJpc0RyYWZ0IiB4c2k6dHlwZT0iSWRlbnRpZmllclJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGFzVHlwZVNwZWNpZmllciBuYW1lPSJ0OkJvb2xlYW4iIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgPHRoZW4gdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIwIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgPGVsc2UgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSIxIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgICAgPC9ieT4NCiAgICAgICAgICAgICAgIDxieSBkaXJlY3Rpb249ImFzYyIgeHNpOnR5cGU9IkJ5RXhwcmVzc2lvbiI+DQogICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBwYXRoPSJjb2RlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJyeE5vcm1Db2RlIiB4c2k6dHlwZT0iSWRlbnRpZmllclJlZiIvPg0KICAgICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgICAgPC9ieT4NCiAgICAgICAgICAgIDwvc29ydD4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgIDwvZGVmPg0KICAgICAgPGRlZiBuYW1lPSJUb3RhbE1NRSIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiBjbGFzc1R5cGU9InQ6UXVhbnRpdHkiIHhzaTp0eXBlPSJJbnN0YW5jZSI+DQogICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZSI+DQogICAgICAgICAgICAgICA8dmFsdWUgeHNpOnR5cGU9IlN1bSI+DQogICAgICAgICAgICAgICAgICA8c291cmNlIHhzaTp0eXBlPSJRdWVyeSI+DQogICAgICAgICAgICAgICAgICAgICA8c291cmNlIGFsaWFzPSJNIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxleHByZXNzaW9uIG5hbWU9Ik1NRSIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgICAgICAgPHJldHVybj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxleHByZXNzaW9uIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJtbWUiIHNjb3BlPSJNIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgICAgICAgICAgIDwvcmV0dXJuPg0KICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idW5pdCI+DQogICAgICAgICAgICAgICA8dmFsdWUgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Im1nL2QiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iSXNNTUU1ME9yTW9yZSIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iR3JlYXRlck9yRXF1YWwiPg0KICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iVG90YWxNTUUiIHhzaTp0eXBlPSJFeHByZXNzaW9uUmVmIi8+DQogICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZT0iNTAiIHVuaXQ9Im1nL2QiIHhzaTp0eXBlPSJRdWFudGl0eSIvPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9ImdldEluZGljYXRvciIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iSWYiPg0KICAgICAgICAgICAgPGNvbmRpdGlvbiBhc1R5cGU9InQ6Qm9vbGVhbiIgeHNpOnR5cGU9IkFzIj4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9IklzTU1FNTBPck1vcmUiIHhzaTp0eXBlPSJFeHByZXNzaW9uUmVmIi8+DQogICAgICAgICAgICAgICA8YXNUeXBlU3BlY2lmaWVyIG5hbWU9InQ6Qm9vbGVhbiIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgICAgPC9jb25kaXRpb24+DQogICAgICAgICAgICA8dGhlbiB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0id2FybmluZyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgIDxlbHNlIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJzdWNjZXNzIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9ImdldFN1bW1hcnkiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPg0KICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IklmIj4NCiAgICAgICAgICAgIDxjb25kaXRpb24gYXNUeXBlPSJ0OkJvb2xlYW4iIHhzaTp0eXBlPSJBcyI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJJc01NRTUwT3JNb3JlIiB4c2k6dHlwZT0iRXhwcmVzc2lvblJlZiIvPg0KICAgICAgICAgICAgICAgPGFzVHlwZVNwZWNpZmllciBuYW1lPSJ0OkJvb2xlYW4iIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgICAgIDwvY29uZGl0aW9uPg0KICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJIaWdoIHJpc2sgZm9yIG9waW9pZCBvdmVyZG9zZSAtICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDYXNlIj4NCiAgICAgICAgICAgICAgICAgIDxjYXNlSXRlbT4NCiAgICAgICAgICAgICAgICAgICAgIDx3aGVuIHhzaTp0eXBlPSJHcmVhdGVyT3JFcXVhbCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iVG90YWxNTUUiIHhzaTp0eXBlPSJFeHByZXNzaW9uUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9EZWNpbWFsIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpJbnRlZ2VyIiB2YWx1ZT0iOTAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICAgICA8L3doZW4+DQogICAgICAgICAgICAgICAgICAgICA8dGhlbiB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0idGFwZXIgbm93IiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgPC9jYXNlSXRlbT4NCiAgICAgICAgICAgICAgICAgIDxlbHNlIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJjb25zaWRlciB0YXBlcmluZyIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgIDxlbHNlIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJNTUUgaXMgd2l0aGluIHRoZSByZWNvbW1lbmRlZCByYW5nZS4iIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iZ2V0RGV0YWlsIiBjb250ZXh0PSJQYXRpZW50IiBhY2Nlc3NMZXZlbD0iUHVibGljIj4NCiAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJJZiI+DQogICAgICAgICAgICA8Y29uZGl0aW9uIGFzVHlwZT0idDpCb29sZWFuIiB4c2k6dHlwZT0iQXMiPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iSXNNTUU1ME9yTW9yZSIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4NCiAgICAgICAgICAgICAgIDxhc1R5cGVTcGVjaWZpZXIgbmFtZT0idDpCb29sZWFuIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+DQogICAgICAgICAgICA8L2NvbmRpdGlvbj4NCiAgICAgICAgICAgIDx0aGVuIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IlRvdGFsIG1vcnBoaW5lIG1pbGxpZ3JhbSBlcXVpdmFsZW50IChNTUUpIGlzICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb1N0cmluZyI+DQogICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJUb3RhbE1NRSIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSIuIFRhcGVyIHRvIGxlc3MgdGhhbiA1MC4iIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICA8L3RoZW4+DQogICAgICAgICAgICA8ZWxzZSB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJUb3RhbCBtb3JwaGluZSBtaWxsaWdyYW0gZXF1aXZhbGVudCAoTU1FKSBpcyAiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iVG9TdHJpbmciPg0KICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iVG90YWxNTUUiIHhzaTp0eXBlPSJFeHByZXNzaW9uUmVmIi8+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iLiBUaGlzIGZhbGxzIHdpdGhpbiB0aGUgYWNjZXB0ZWQgcmFuZ2UuIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgPC9lbHNlPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9IlJlc3VsdHMiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPg0KICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IlF1ZXJ5Ij4NCiAgICAgICAgICAgIDxzb3VyY2UgYWxpYXM9Ik1NRU92ZXI1MCI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBuYW1lPSJJc01NRTUwT3JNb3JlIiB4c2k6dHlwZT0iRXhwcmVzc2lvblJlZiIvPg0KICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICA8cmV0dXJuPg0KICAgICAgICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IlR1cGxlIj4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im1tZU92ZXI1MCI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgbmFtZT0iTU1FT3ZlcjUwIiB4c2k6dHlwZT0iQWxpYXNSZWYiLz4NCiAgICAgICAgICAgICAgICAgIDwvZWxlbWVudD4NCiAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRpdGxlIj4NCiAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZSB4c2k6dHlwZT0iSWYiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhc1R5cGU9InQ6Qm9vbGVhbiIgeHNpOnR5cGU9IkFzIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9Ik1NRU92ZXI1MCIgeHNpOnR5cGU9IkFsaWFzUmVmIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8YXNUeXBlU3BlY2lmaWVyIG5hbWU9InQ6Qm9vbGVhbiIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25kaXRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGhlbiB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IkhpZ2ggcmlzayBmb3Igb3Bpb2lkIG92ZXJkb3NlIC0gIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkNhc2UiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhc2VJdGVtPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdoZW4geHNpOnR5cGU9IkdyZWF0ZXJPckVxdWFsIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBuYW1lPSJUb3RhbE1NRSIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb0RlY2ltYWwiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSI5MCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd2hlbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVuIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJ0YXBlciBub3ciIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nhc2VJdGVtPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsc2UgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9ImNvbnNpZGVyIHRhcGVyaW5nIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGVsc2UgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Ik1NRSBpcyB3aXRoaW4gdGhlIHJlY29tbWVuZGVkIHJhbmdlLiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+DQogICAgICAgICAgICAgICAgICA8L2VsZW1lbnQ+DQogICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiI+DQogICAgICAgICAgICAgICAgICAgICA8dmFsdWUgeHNpOnR5cGU9IklmIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxjb25kaXRpb24gYXNUeXBlPSJ0OkJvb2xlYW4iIHhzaTp0eXBlPSJBcyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJNTUVPdmVyNTAiIHhzaTp0eXBlPSJBbGlhc1JlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFzVHlwZVNwZWNpZmllciBuYW1lPSJ0OkJvb2xlYW4iIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZW4geHNpOnR5cGU9IkNvbmNhdGVuYXRlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iVG90YWwgbW9ycGhpbmUgbWlsbGlncmFtIGVxdWl2YWxlbnQgKE1NRSkgaXMgIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IlRvU3RyaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9IlRvdGFsTU1FIiB4c2k6dHlwZT0iRXhwcmVzc2lvblJlZiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9Ii4gVGFwZXIgdG8gbGVzcyB0aGFuIDUwLiIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxlbHNlIHhzaTp0eXBlPSJDb25jYXRlbmF0ZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iQ29uY2F0ZW5hdGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IlRvdGFsIG1vcnBoaW5lIG1pbGxpZ3JhbSBlcXVpdmFsZW50IChNTUUpIGlzICIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJUb1N0cmluZyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJUb3RhbE1NRSIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSIuIFRoaXMgZmFsbHMgd2l0aGluIHRoZSBhY2NlcHRlZCByYW5nZS4iIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Vsc2U+DQogICAgICAgICAgICAgICAgICAgICA8L3ZhbHVlPg0KICAgICAgICAgICAgICAgICAgPC9lbGVtZW50Pg0KICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgPC9yZXR1cm4+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICA8L2RlZj4NCiAgIDwvc3RhdGVtZW50cz4NCjwvbGlicmFyeT4=" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-fhirhelpers-3.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-fhirhelpers-3.json new file mode 100644 index 00000000000..13dd36df40c --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-fhirhelpers-3.json @@ -0,0 +1,19 @@ +{ + "resourceType": "Library", + "id": "FHIRHelpers", + "version": "3.0.0", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "status": "draft", + "content": [ + { + "contentType": "text/cql", + "data": "bGlicmFyeSBGSElSSGVscGVycyB2ZXJzaW9uICczLjAuMCcNCg0KdXNpbmcgRkhJUiB2ZXJzaW9uICczLjAuMCcNCg0KZGVmaW5lIGZ1bmN0aW9uIFRvSW50ZXJ2YWwocGVyaW9kIEZISVIuUGVyaW9kKToNCiAgICBJbnRlcnZhbFtwZXJpb2QuInN0YXJ0Ii52YWx1ZSwgcGVyaW9kLiJlbmQiLnZhbHVlXQ0KDQpkZWZpbmUgZnVuY3Rpb24gVG9RdWFudGl0eShxdWFudGl0eSBGSElSLlF1YW50aXR5KToNCiAgICBTeXN0ZW0uUXVhbnRpdHkgeyB2YWx1ZTogcXVhbnRpdHkudmFsdWUudmFsdWUsIHVuaXQ6IHF1YW50aXR5LnVuaXQudmFsdWUgfQ0KDQpkZWZpbmUgZnVuY3Rpb24gVG9JbnRlcnZhbChyYW5nZSBGSElSLlJhbmdlKToNCiAgICBJbnRlcnZhbFtUb1F1YW50aXR5KHJhbmdlLmxvdyksIFRvUXVhbnRpdHkocmFuZ2UuaGlnaCldDQoNCmRlZmluZSBmdW5jdGlvbiBUb0NvZGUoY29kaW5nIEZISVIuQ29kaW5nKToNCiAgICBTeXN0ZW0uQ29kZSB7DQogICAgICBjb2RlOiBjb2RpbmcuY29kZS52YWx1ZSwNCiAgICAgIHN5c3RlbTogY29kaW5nLnN5c3RlbS52YWx1ZSwNCiAgICAgIHZlcnNpb246IGNvZGluZy52ZXJzaW9uLnZhbHVlLA0KICAgICAgZGlzcGxheTogY29kaW5nLmRpc3BsYXkudmFsdWUNCiAgICB9DQoNCmRlZmluZSBmdW5jdGlvbiBUb0NvbmNlcHQoY29uY2VwdCBGSElSLkNvZGVhYmxlQ29uY2VwdCk6DQogICAgU3lzdGVtLkNvbmNlcHQgew0KICAgICAgICBjb2RlczogY29uY2VwdC5jb2RpbmcgQyByZXR1cm4gVG9Db2RlKEMpLA0KICAgICAgICBkaXNwbGF5OiBjb25jZXB0LnRleHQudmFsdWUNCiAgICB9DQoNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLnV1aWQpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVGVzdFNjcmlwdFJlcXVlc3RNZXRob2RDb2RlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlByb3ZlbmFuY2VFbnRpdHlSb2xlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlVuaXRzT2ZUaW1lKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFkZHJlc3NUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFsbGVyZ3lJbnRvbGVyYW5jZUNhdGVnb3J5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlNwZWNpbWVuU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlJlc3RmdWxDYXBhYmlsaXR5TW9kZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5EZXRlY3RlZElzc3VlU2V2ZXJpdHkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuSXNzdWVTZXZlcml0eSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5DYXJlVGVhbVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5EYXRhRWxlbWVudFN0cmluZ2VuY3kpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVmlzaW9uRXllcyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5FbmNvdW50ZXJTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU3RydWN0dXJlRGVmaW5pdGlvbktpbmQpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUHVibGljYXRpb25TdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29uc2VudERhdGFNZWFuaW5nKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN0cnVjdHVyZU1hcFNvdXJjZUxpc3RNb2RlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlJlcXVlc3RTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUXVlc3Rpb25uYWlyZVJlc3BvbnNlU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlNlYXJjaENvbXBhcmF0b3IpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ2hhcmdlSXRlbVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BY3Rpb25QYXJ0aWNpcGFudFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWxsZXJneUludG9sZXJhbmNlVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Eb2N1bWVudFJlbGF0aW9uc2hpcFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWxsZXJneUludG9sZXJhbmNlQ2xpbmljYWxTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ2FyZVBsYW5BY3Rpdml0eVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BY3Rpb25MaXN0KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlBhcnRpY2lwYXRpb25TdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVGVzdFJlcG9ydFJlc3VsdCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db25jZXB0TWFwR3JvdXBVbm1hcHBlZE1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvRGF0ZVRpbWUodmFsdWUgRkhJUi5pbnN0YW50KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb0RhdGVUaW1lKHZhbHVlIEZISVIuZGF0ZVRpbWUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvRGF0ZVRpbWUodmFsdWUgRkhJUi5kYXRlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkRvY3VtZW50TW9kZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Bc3NlcnRpb25PcGVyYXRvclR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRGF5c09mV2Vlayk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Jc3N1ZVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29udGVudFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU3RydWN0dXJlTWFwQ29udGV4dFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRmFtaWx5SGlzdG9yeVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9JbnRlZ2VyKHZhbHVlIEZISVIucG9zaXRpdmVJbnQpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ2xpbmljYWxJbXByZXNzaW9uU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFzc2VydGlvblJlc3BvbnNlVHlwZXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUmVxdWVzdEludGVudCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5OYXJyYXRpdmVTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVhc21udFByaW5jaXBsZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db25zZW50RXhjZXB0VHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5zdHJpbmcpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWN0aW9uUmVxdWlyZWRCZWhhdmlvcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5FbmRwb2ludFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5HdWlkZVBhZ2VLaW5kKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkd1aWRlRGVwZW5kZW5jeVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUmVzb3VyY2VWZXJzaW9uUG9saWN5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk1lZGljYXRpb25SZXF1ZXN0U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk1lZGljYXRpb25BZG1pbmlzdHJhdGlvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BY3Rpb25DYXJkaW5hbGl0eUJlaGF2aW9yKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk1lZGljYXRpb25SZXF1ZXN0SW50ZW50KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk5hbWluZ1N5c3RlbUlkZW50aWZpZXJUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkltbXVuaXphdGlvblN0YXR1c0NvZGVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFjY291bnRTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVkaWNhdGlvbkRpc3BlbnNlU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbmZpZGVudGlhbGl0eUNsYXNzaWZpY2F0aW9uKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLklkZW50aWZpZXJVc2UpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRGlnaXRhbE1lZGlhVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TdHJ1Y3R1cmVNYXBUYXJnZXRMaXN0TW9kZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5UZXN0UmVwb3J0UGFydGljaXBhbnRUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkJpbmRpbmdTdHJlbmd0aCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZXF1ZXN0UHJpb3JpdHkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUGFydGljaXBhbnRSZXF1aXJlZCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5EaXNjcmltaW5hdG9yVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5YUGF0aFVzYWdlVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TdHJ1Y3R1cmVNYXBJbnB1dE1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuSW5zdGFuY2VBdmFpbGFiaWxpdHkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuaWQpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTGlua2FnZVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUmVmZXJlbmNlSGFuZGxpbmdQb2xpY3kpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVkaWNhdGlvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5GaWx0ZXJPcGVyYXRvcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5OYW1pbmdTeXN0ZW1UeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlJlc2VhcmNoU3R1ZHlTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRXh0ZW5zaW9uQ29udGV4dCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5GSElSRGVmaW5lZFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQXVkaXRFdmVudE91dGNvbWUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWN0aW9uUmVsYXRpb25zaGlwVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db25zdHJhaW50U2V2ZXJpdHkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRXZlbnRDYXBhYmlsaXR5TW9kZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db250cmFjdFJlc291cmNlU3RhdHVzQ29kZXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUmVzZWFyY2hTdWJqZWN0U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlVESUVudHJ5VHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5EZXZpY2VNZXRyaWNDYXRlZ29yeSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5UZXN0UmVwb3J0QWN0aW9uUmVzdWx0KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN0cnVjdHVyZU1hcFRyYW5zZm9ybSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZXNwb25zZVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvRGVjaW1hbCh2YWx1ZSBGSElSLmRlY2ltYWwpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWdncmVnYXRpb25Nb2RlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNhcGFiaWxpdHlTdGF0ZW1lbnRLaW5kKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFsbGVyZ3lJbnRvbGVyYW5jZVZlcmlmaWNhdGlvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5FdmVudFRpbWluZyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Hb2FsU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlNlYXJjaFBhcmFtVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TeXN0ZW1SZXN0ZnVsSW50ZXJhY3Rpb24pOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWN0aW9uR3JvdXBpbmdCZWhhdmlvcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TdHJ1Y3R1cmVNYXBNb2RlbE1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVGFza1N0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BZHZlcnNlRXZlbnRDYXVzYWxpdHkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU3Vic2NyaXB0aW9uQ2hhbm5lbFR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuR3JhcGhDb21wYXJ0bWVudFJ1bGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQXNzZXJ0aW9uRGlyZWN0aW9uVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5DYXJlUGxhbkludGVudCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TbGljaW5nUnVsZXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRXhwbGFuYXRpb25PZkJlbmVmaXRTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29uc2VudFN0YXRlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFkdmVyc2VFdmVudENhdGVnb3J5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkxpbmtUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFsbGVyZ3lJbnRvbGVyYW5jZUNyaXRpY2FsaXR5KTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk1lZGljYXRpb25SZXF1ZXN0UHJpb3JpdHkpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29uY2VwdE1hcEVxdWl2YWxlbmNlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkZISVJBbGxUeXBlcyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Qcm9wZXJ0eVJlcHJlc2VudGF0aW9uKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkF1ZGl0RXZlbnRBY3Rpb24pOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVHJpZ2dlclR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU2VhcmNoTW9kaWZpZXJDb2RlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbXBvc2l0aW9uU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkFwcG9pbnRtZW50U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk1lc3NhZ2VTaWduaWZpY2FuY2VDYXRlZ29yeSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5FdmVudFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5PcGVyYXRpb25QYXJhbWV0ZXJVc2UpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTGlzdE1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWN0aW9uQ29uZGl0aW9uS2luZCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5PYnNlcnZhdGlvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5xdWFsaXR5VHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BZG1pbmlzdHJhdGl2ZUdlbmRlcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZXNvdXJjZVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuUXVlc3Rpb25uYWlyZUl0ZW1UeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb0Jvb2xlYW4odmFsdWUgRkhJUi5ib29sZWFuKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN0cnVjdHVyZU1hcEdyb3VwVHlwZU1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRGV2aWNlTWV0cmljQ2FsaWJyYXRpb25UeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLmNvZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuU3VwcGx5UmVxdWVzdFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BY3Rpb25TZWxlY3Rpb25CZWhhdmlvcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5FbmNvdW50ZXJMb2NhdGlvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TdXBwbHlEZWxpdmVyeVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5EaWFnbm9zdGljUmVwb3J0U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkZsYWdTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ2FyZVBsYW5TdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29uZGl0aW9uQ2xpbmljYWxTdGF0dXNDb2Rlcyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5MaXN0U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb2Jhc2U2NEJpbmFyeSh2YWx1ZSBGSElSLmJhc2U2NEJpbmFyeSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5EZXZpY2VVc2VTdGF0ZW1lbnRTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQXVkaXRFdmVudEFnZW50TmV0d29ya1R5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQWRkcmVzc1VzZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db25kaXRpb25hbERlbGV0ZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db250YWN0UG9pbnRVc2UpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRGV2aWNlTWV0cmljT3BlcmF0aW9uYWxTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTnV0cml0aW9uT3JkZXJTdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIudXJpKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbnRyaWJ1dG9yVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZWZlcmVuY2VWZXJzaW9uUnVsZXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVXNlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLklkZW50aXR5QXNzdXJhbmNlTGV2ZWwpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVhc3VyZVJlcG9ydFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5EZXZpY2VNZXRyaWNDb2xvcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TZWFyY2hFbnRyeU1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvVGltZSh2YWx1ZSBGSElSLnRpbWUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQ29uZGl0aW9uYWxSZWFkU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbmRpdGlvblZlcmlmaWNhdGlvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BbGxlcmd5SW50b2xlcmFuY2VTZXZlcml0eSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5GaW5hbmNpYWxSZXNvdXJjZVN0YXR1c0NvZGVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLk9wZXJhdGlvbktpbmQpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuT2JzZXJ2YXRpb25SZWxhdGlvbnNoaXBUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb0ludGVnZXIodmFsdWUgRkhJUi51bnNpZ25lZEludCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5OYW1lVXNlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlN1YnNjcmlwdGlvblN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Eb2N1bWVudFJlZmVyZW5jZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Mb2NhdGlvbk1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvSW50ZWdlcih2YWx1ZSBGSElSLmludGVnZXIpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIucmVwb3NpdG9yeVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTG9jYXRpb25TdGF0dXMpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRkhJUlN1YnN0YW5jZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Vbmtub3duQ29udGVudENvZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTm90ZVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuVGVzdFJlcG9ydFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5IVFRQVmVyYik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db2RlU3lzdGVtQ29udGVudE1vZGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuRXBpc29kZU9mQ2FyZVN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZW1pdHRhbmNlT3V0Y29tZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5GSElSRGV2aWNlU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbnRhY3RQb2ludFN5c3RlbSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TbG90U3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlByb3BlcnR5VHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5tYXJrZG93bik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5UeXBlRGVyaXZhdGlvblJ1bGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVkaWNhdGlvblN0YXRlbWVudFN0YXR1cyk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5HdWlkYW5jZVJlc3BvbnNlU3RhdHVzKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlF1YW50aXR5Q29tcGFyYXRvcik6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5SZWxhdGVkQXJ0aWZhY3RUeXBlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLm9pZCk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5NZWFzdXJlUmVwb3J0VHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5BY3Rpb25QcmVjaGVja0JlaGF2aW9yKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlNhbXBsZWREYXRhRGF0YVR5cGUpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuTWVkaWNhdGlvblN0YXRlbWVudFRha2VuKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvbXBhcnRtZW50VHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5Db21wb3NpdGlvbkF0dGVzdGF0aW9uTW9kZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5EZXZpY2VNZXRyaWNDYWxpYnJhdGlvblN0YXRlKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkdyb3VwVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5UeXBlUmVzdGZ1bEludGVyYWN0aW9uKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLkNvZGVTeXN0ZW1IaWVyYXJjaHlNZWFuaW5nKTogdmFsdWUudmFsdWUNCmRlZmluZSBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSBGSElSLlZpc2lvbkJhc2UpOiB2YWx1ZS52YWx1ZQ0KZGVmaW5lIGZ1bmN0aW9uIFRvU3RyaW5nKHZhbHVlIEZISVIuQnVuZGxlVHlwZSk6IHZhbHVlLnZhbHVlDQpkZWZpbmUgZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUgRkhJUi5TeXN0ZW1WZXJzaW9uUHJvY2Vzc2luZ01vZGUpOiB2YWx1ZS52YWx1ZQ==" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-patient.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-patient.json new file mode 100644 index 00000000000..3a8e647c005 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-patient.json @@ -0,0 +1,114 @@ +{ + "resourceType": "Patient", + "id": "Patient-12214", + "meta": { + "versionId": "1", + "lastUpdated": "2017-07-17T16:34:10.814+00:00" + }, + "text": { + "status": "generated", + "div": "
2 N GERIATRIC Jr
Identifier7f3672feb3b54789953e012d8aef5246
Address202 Burlington Rd.
Bedford MA
Date of birth07 May 1946
" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/us-core-race", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/v3/Race", + "code": "2106-3", + "display": "White" + } + ] + } + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/us-core-ethnicity", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/v3/Ethnicity", + "code": "2186-5", + "display": "Not Hispanic or Latino" + } + ] + } + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/us-core-religion", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/v3/ReligiousAffiliation", + "code": "1007", + "display": "Atheism" + } + ] + } + } + ], + "identifier": [ + { + "use": "official", + "type": { + "coding": [ + { + "system": "http://hl7.org/fhir/identifier-type", + "code": "SB", + "display": "Social Beneficiary Identifier" + } + ], + "text": "Michigan Common Key Service Identifier" + }, + "system": "http://mihin.org/fhir/cks", + "value": "7f3672feb3b54789953e012d8aef5246" + } + ], + "active": false, + "name": [ + { + "family": "N Geriatric", + "given": [ + "2" + ], + "suffix": [ + "Jr" + ] + } + ], + "telecom": [ + { + "system": "phone", + "value": "586-555-7576", + "use": "home" + }, + { + "system": "phone", + "value": "586-555-0297", + "use": "work" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/us-core-direct", + "valueBoolean": true + } + ], + "system": "email", + "value": "2.N.Geriatric@direct.mihintest.org", + "use": "home" + } + ], + "gender": "male", + "birthDate": "1946-05-07", + "address": [ + { + "line": [ + "202 Burlington Rd." + ], + "city": "Bedford", + "state": "MA", + "postalCode": "01730" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-practitioner.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-practitioner.json new file mode 100644 index 00000000000..2665f30cb3a --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/general-practitioner.json @@ -0,0 +1,173 @@ +{ + "resourceType": "Practitioner", + "id": "Practitioner-12208", + "meta": { + "versionId": "1", + "lastUpdated": "2017-07-17T16:34:10.814+00:00" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/us-core-race", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/v3/Race", + "code": "2056-0", + "display": "Black" + } + ] + } + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/us-core-ethnicity", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/v3/Ethnicity", + "code": "2186-5", + "display": "Not Hispanic or Latino" + } + ] + } + }, + { + "url": "http://gov.onc.fhir.extension.taxonomy", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://org.nucc.taxonomy", + "code": "208D00000X", + "display": "General Practice" + } + ] + } + }, + { + "url": "http://org.mihin.fhir.extension.electronic-service", + "valueReference": { + "reference": "ElectronicService/ElectronicService-2415", + "display": "Jay.M.Sawyer@direct.mihintest.org" + } + } + ], + "identifier": [ + { + "use": "official", + "type": { + "coding": [ + { + "system": "http://hl7.org/fhir/identifier-type", + "code": "SB", + "display": "Social Beneficiary Identifier" + } + ], + "text": "US Social Security Number" + }, + "system": "http://hl7.org/fhir/sid/us-ssn", + "value": "000012208" + }, + { + "use": "official", + "type": { + "coding": [ + { + "system": "http://hl7.org/fhir/v2/0203", + "code": "PRN", + "display": "Provider number" + } + ], + "text": "US National Provider Identifier" + }, + "system": "http://hl7.org/fhir/sid/us-npi", + "value": "9999912208" + }, + { + "use": "official", + "type": { + "coding": [ + { + "system": "http://hl7.org/fhir/identifier-type", + "code": "SB", + "display": "Social Beneficiary Identifier" + } + ], + "text": "Michigan Common Key Service Identifier" + }, + "system": "http://mihin.org/fhir/cks", + "value": "c6cc1bbaf5ea41c5a0d267e3a655def1" + } + ], + "name": [ + { + "family": "Sawyer", + "given": [ + "Jay", + "McCann" + ], + "suffix": [ + "MD" + ] + } + ], + "telecom": [ + { + "system": "phone", + "value": "989-555-8443", + "use": "home" + }, + { + "system": "phone", + "value": "989-555-5764", + "use": "work" + } + ], + "address": [ + { + "line": [ + "77 S Pine Place" + ], + "city": "Beaverton", + "state": "MI", + "postalCode": "48612" + } + ], + "gender": "male", + "birthDate": "1970-08-07", + "qualification": [ + { + "identifier": [ + { + "use": "official", + "type": { + "coding": [ + { + "system": "http://hl7.org/fhir/v2/0203", + "code": "MD", + "display": "Medical License number" + } + ], + "text": "Michigan Medical License" + }, + "system": "http://michigan.gov/fhir/medical-license", + "value": "LARA-12208", + "assigner": { + "display": "State of Michigan" + } + } + ], + "code": { + "coding": [ + { + "system": "http://michigan.gov/lara/license-type", + "code": "4305", + "display": "Medical Doctor" + } + ] + }, + "issuer": { + "reference": "Organization/Organization-2000", + "display": "Michigan Department of Licensing and Regulatory Affairs" + } + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/library-col.elm.xml b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/library-col.elm.xml new file mode 100644 index 00000000000..e078fa6dc57 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/library-col.elm.xml @@ -0,0 +1,319 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-col.xml b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-col.xml new file mode 100644 index 00000000000..4d538f19fbf --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-col.xml @@ -0,0 +1,138 @@ + + + + + +
+ Cohort definition for Colorectal Cancer Screening. +
+
+ + + + + + + + <status value="active"/> + <experimental value="true"/> + <description value="Colorectal Cancer Screening. Cohort Definition"/> + <topic> + <coding> + <system value="http://hl7.org/fhir/c80-doc-typecodes"/> + <code value="57024-2"/> + </coding> + </topic> + <library> + <reference value="Library/col-logic"/> + </library> + <scoring value="cohort"/> + <group> + <identifier> + <value value="in-demographic"/> + </identifier> + <population> + <type value="initial-population"/> + <identifier> + <value value="in-demographic"/> + </identifier> + <criteria value="In Demographic"/> + </population> + </group> + <group> + <identifier> + <value value="history-of-colorectal-cancer"/> + </identifier> + <population> + <type value="initial-population"/> + <identifier> + <value value="history-of-colorectal-cancer"/> + </identifier> + <criteria value="Hx Colorectal Cancer"/> + </population> + </group> + <group> + <identifier> + <value value="history-of-total-colectomy"/> + </identifier> + <population> + <type value="initial-population"/> + <identifier> + <value value="history-of-total-colectomy"/> + </identifier> + <criteria value="Hx Total Colectomy"/> + </population> + </group> + <group> + <identifier> + <value value="colonoscopy-performed"/> + </identifier> + <population> + <type value="initial-population"/> + <identifier> + <value value="colonoscopy-performed"/> + </identifier> + <criteria value="Colonoscopy Performed"/> + </population> + </group> + <group> + <identifier> + <value value="colonoscopy-results"/> + </identifier> + <population> + <type value="initial-population"/> + <identifier> + <value value="colonoscopy-results"/> + </identifier> + <criteria value="Colonoscopy Results"/> + </population> + </group> + <group> + <identifier> + <value value="sigmoidoscopy-procedure"/> + </identifier> + <population> + <type value="initial-population"/> + <identifier> + <value value="sigmoidoscopy-procedure"/> + </identifier> + <criteria value="Sigmoidoscopy Procedure"/> + </population> + </group> + <group> + <identifier> + <value value="sigmoidoscopy-observation"/> + </identifier> + <population> + <type value="initial-population"/> + <identifier> + <value value="sigmoidoscopy-observation"/> + </identifier> + <criteria value="Sigmoidoscopy Observation"/> + </population> + </group> + <group> + <identifier> + <value value="fobt-procedure"/> + </identifier> + <population> + <type value="initial-population"/> + <identifier> + <value value="fobt-procedure"/> + </identifier> + <criteria value="FOBT Procedure"/> + </population> + </group> + <group> + <identifier> + <value value="fobt-observation"/> + </identifier> + <population> + <type value="initial-population"/> + <identifier> + <value value="fobt-observation"/> + </identifier> + <criteria value="FOBT Observation"/> + </population> + </group> +</Measure> diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-condition.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-condition.json new file mode 100644 index 00000000000..6cbca50c2b5 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-condition.json @@ -0,0 +1,49 @@ +{ + "resourceType": "Condition", + "id": "Condition-13", + "meta": { + "versionId": "1", + "lastUpdated": "2017-09-09T21:52:17.035-06:00" + }, + "extension": [ + { + "url": "http://mihin.org/fhir/templateId", + "valueString": "2.16.840.1.113883.10.20.22.4.3" + }, + { + "url": "http://mihin.org/fhir/templateId", + "valueString": "2.16.840.1.113883.10.20.24.3.137" + } + ], + "clinicalStatus": "active", + "verificationStatus": "confirmed", + "category": [ + { + "coding": [ + { + "system": "http://hl7.org/fhir/condition-category", + "code": "diagnosis", + "display": "Diagnosis" + } + ], + "text": "This is a judgment made by a healthcare provider that the patient has a particular disease or condition" + } + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "363414004" + } + ], + "text": "Diagnosis: Malignant Neoplasm Of Colon" + }, + "subject": { + "reference": "Patient/Patient-12214", + "display": "2 N Geriatric Jr" + }, + "asserter": { + "reference": "Practitioner/Practitioner-12208", + "display": "Jay McCann Sawyer MD" + } +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-library.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-library.json new file mode 100644 index 00000000000..f5ccd262162 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-library.json @@ -0,0 +1,22 @@ +{ + "resourceType": "Library", + "id": "col-logic", + "meta": { + "versionId": "1", + "lastUpdated": "2017-09-09T21:25:51.679-06:00" + }, + "status": "draft", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "content": [ + { + "contentType": "application/elm+xml", + "data": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxsaWJyYXJ5IHhtbG5zPSJ1cm46aGw3LW9yZzplbG06cjEiIHhtbG5zOnQ9InVybjpobDctb3JnOmVsbS10eXBlczpyMSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6Zmhpcj0iaHR0cDovL2hsNy5vcmcvZmhpciIgeG1sbnM6YT0idXJuOmhsNy1vcmc6Y3FsLWFubm90YXRpb25zOnIxIj4NCiAgIDxpZGVudGlmaWVyIGlkPSJDT0wiIHZlcnNpb249IjEiLz4NCiAgIDxzY2hlbWFJZGVudGlmaWVyIGlkPSJ1cm46aGw3LW9yZzplbG0iIHZlcnNpb249InIxIi8+DQogICA8dXNpbmdzPg0KICAgICAgPGRlZiBsb2NhbElkZW50aWZpZXI9IlN5c3RlbSIgdXJpPSJ1cm46aGw3LW9yZzplbG0tdHlwZXM6cjEiLz4NCiAgICAgIDxkZWYgbG9jYWxJZGVudGlmaWVyPSJGSElSIiB1cmk9Imh0dHA6Ly9obDcub3JnL2ZoaXIiIHZlcnNpb249IjEuNiIvPg0KICAgPC91c2luZ3M+DQogICA8cGFyYW1ldGVycz4NCiAgICAgIDxkZWYgbmFtZT0iTWVhc3VyZW1lbnRQZXJpb2QiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPg0KICAgICAgICAgPHBhcmFtZXRlclR5cGVTcGVjaWZpZXIgeHNpOnR5cGU9IkludGVydmFsVHlwZVNwZWNpZmllciI+DQogICAgICAgICAgICA8cG9pbnRUeXBlIG5hbWU9InQ6RGF0ZVRpbWUiIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4NCiAgICAgICAgIDwvcGFyYW1ldGVyVHlwZVNwZWNpZmllcj4NCiAgICAgIDwvZGVmPg0KICAgPC9wYXJhbWV0ZXJzPg0KICAgPGNvZGVTeXN0ZW1zPg0KICAgICAgPGRlZiBuYW1lPSJDUFQiIGlkPSJ1cm46b2lkOjIuMTYuODQwLjEuMTEzODgzLjYuMTIiIGFjY2Vzc0xldmVsPSJQdWJsaWMiLz4NCiAgICAgIDxkZWYgbmFtZT0iU05PTUVELUNUIiBpZD0idXJuOm9pZDoyLjE2Ljg0MC4xLjExMzg4My42Ljk2IiBhY2Nlc3NMZXZlbD0iUHVibGljIi8+DQogICAgICA8ZGVmIG5hbWU9IkxPSU5DIiBpZD0iaHR0cDovL2xvaW5jLm9yZyIgYWNjZXNzTGV2ZWw9IlB1YmxpYyIvPg0KICAgPC9jb2RlU3lzdGVtcz4NCiAgIDx2YWx1ZVNldHM+DQogICAgICA8ZGVmIG5hbWU9Ik1hbGlnbmFudCBOZW9wbGFzbSBvZiBDb2xvbiIgaWQ9IjIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTA4LjExLjEwMDEiIGFjY2Vzc0xldmVsPSJQdWJsaWMiLz4NCiAgICAgIDxkZWYgbmFtZT0iVG90YWwgQ29sZWN0b215IiBpZD0iMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xOTguMTIuMTAxOSIgYWNjZXNzTGV2ZWw9IlB1YmxpYyIvPg0KICAgICAgPGRlZiBuYW1lPSJDb2xvbm9zY29weSIgaWQ9IjIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTA4LjEyLjEwMjAiIGFjY2Vzc0xldmVsPSJQdWJsaWMiLz4NCiAgICAgIDxkZWYgbmFtZT0iRmxleGlibGUgU2lnbW9pZG9zY29weSIgaWQ9IjIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTk4LjEyLjEwMTAiIGFjY2Vzc0xldmVsPSJQdWJsaWMiLz4NCiAgICAgIDxkZWYgbmFtZT0iRmVjYWwgT2NjdWx0IEJsb29kIFRlc3QgKEZPQlQpIiBpZD0iMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xOTguMTIuMTAxMSIgYWNjZXNzTGV2ZWw9IlB1YmxpYyIvPg0KICAgPC92YWx1ZVNldHM+DQogICA8c3RhdGVtZW50cz4NCiAgICAgIDxkZWYgbmFtZT0iUGF0aWVudCIgY29udGV4dD0iUGF0aWVudCI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iU2luZ2xldG9uRnJvbSI+DQogICAgICAgICAgICA8b3BlcmFuZCBkYXRhVHlwZT0iZmhpcjpQYXRpZW50IiB4c2k6dHlwZT0iUmV0cmlldmUiLz4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgIDwvZGVmPg0KICAgICAgPGRlZiBuYW1lPSJMb29rYmFjayBJbnRlcnZhbCBPbmUgWWVhciIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiBsb3dDbG9zZWQ9InRydWUiIGhpZ2hDbG9zZWQ9InRydWUiIHhzaTp0eXBlPSJJbnRlcnZhbCI+DQogICAgICAgICAgICA8bG93IHhzaTp0eXBlPSJTdWJ0cmFjdCI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iU3RhcnQiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iTWVhc3VyZW1lbnRQZXJpb2QiIHhzaTp0eXBlPSJQYXJhbWV0ZXJSZWYiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlPSIxIiB1bml0PSJ5ZWFycyIgeHNpOnR5cGU9IlF1YW50aXR5Ii8+DQogICAgICAgICAgICA8L2xvdz4NCiAgICAgICAgICAgIDxoaWdoIHhzaTp0eXBlPSJFbmQiPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iTWVhc3VyZW1lbnRQZXJpb2QiIHhzaTp0eXBlPSJQYXJhbWV0ZXJSZWYiLz4NCiAgICAgICAgICAgIDwvaGlnaD4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgIDwvZGVmPg0KICAgICAgPGRlZiBuYW1lPSJMb29rYmFjayBJbnRlcnZhbCBGaXZlIFllYXJzIiBjb250ZXh0PSJQYXRpZW50IiBhY2Nlc3NMZXZlbD0iUHVibGljIj4NCiAgICAgICAgIDxleHByZXNzaW9uIGxvd0Nsb3NlZD0idHJ1ZSIgaGlnaENsb3NlZD0idHJ1ZSIgeHNpOnR5cGU9IkludGVydmFsIj4NCiAgICAgICAgICAgIDxsb3cgeHNpOnR5cGU9IlN1YnRyYWN0Ij4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJTdGFydCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJNZWFzdXJlbWVudFBlcmlvZCIgeHNpOnR5cGU9IlBhcmFtZXRlclJlZiIvPg0KICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWU9IjUiIHVuaXQ9InllYXJzIiB4c2k6dHlwZT0iUXVhbnRpdHkiLz4NCiAgICAgICAgICAgIDwvbG93Pg0KICAgICAgICAgICAgPGhpZ2ggeHNpOnR5cGU9IkVuZCI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJNZWFzdXJlbWVudFBlcmlvZCIgeHNpOnR5cGU9IlBhcmFtZXRlclJlZiIvPg0KICAgICAgICAgICAgPC9oaWdoPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9Ikxvb2tiYWNrIEludGVydmFsIFRlbiBZZWFycyIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiBsb3dDbG9zZWQ9InRydWUiIGhpZ2hDbG9zZWQ9InRydWUiIHhzaTp0eXBlPSJJbnRlcnZhbCI+DQogICAgICAgICAgICA8bG93IHhzaTp0eXBlPSJTdWJ0cmFjdCI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iU3RhcnQiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iTWVhc3VyZW1lbnRQZXJpb2QiIHhzaTp0eXBlPSJQYXJhbWV0ZXJSZWYiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlPSIxMCIgdW5pdD0ieWVhcnMiIHhzaTp0eXBlPSJRdWFudGl0eSIvPg0KICAgICAgICAgICAgPC9sb3c+DQogICAgICAgICAgICA8aGlnaCB4c2k6dHlwZT0iRW5kIj4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9Ik1lYXN1cmVtZW50UGVyaW9kIiB4c2k6dHlwZT0iUGFyYW1ldGVyUmVmIi8+DQogICAgICAgICAgICA8L2hpZ2g+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iSW4gRGVtb2dyYXBoaWMiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPg0KICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IkdyZWF0ZXJPckVxdWFsIj4NCiAgICAgICAgICAgIDxvcGVyYW5kIHByZWNpc2lvbj0iWWVhciIgeHNpOnR5cGU9IkNhbGN1bGF0ZUFnZUF0Ij4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9ImJpcnRoRGF0ZS52YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbmFtZT0iUGF0aWVudCIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJTdGFydCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJNZWFzdXJlbWVudFBlcmlvZCIgeHNpOnR5cGU9IlBhcmFtZXRlclJlZiIvPg0KICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OkludGVnZXIiIHZhbHVlPSI1MCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgIDwvZGVmPg0KICAgICAgPGRlZiBuYW1lPSJIeCBDb2xvcmVjdGFsIENhbmNlciIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iUXVlcnkiPg0KICAgICAgICAgICAgPHNvdXJjZSBhbGlhcz0iQyI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBkYXRhVHlwZT0iZmhpcjpDb25kaXRpb24iIGNvZGVQcm9wZXJ0eT0iY29kZSIgeHNpOnR5cGU9IlJldHJpZXZlIj4NCiAgICAgICAgICAgICAgICAgIDxjb2RlcyBuYW1lPSJNYWxpZ25hbnQgTmVvcGxhc20gb2YgQ29sb24iIHhzaTp0eXBlPSJWYWx1ZVNldFJlZiIvPg0KICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICA8d2hlcmUgeHNpOnR5cGU9IkFuZCI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9ImNsaW5pY2FsU3RhdHVzIiBzY29wZT0iQyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iYWN0aXZlIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkVxdWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJ2ZXJpZmljYXRpb25TdGF0dXMiIHNjb3BlPSJDIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJjb25maXJtZWQiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICA8L3doZXJlPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9Ikh4IFRvdGFsIENvbGVjdG9teSIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iUXVlcnkiPg0KICAgICAgICAgICAgPHNvdXJjZSBhbGlhcz0iVCI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBkYXRhVHlwZT0iZmhpcjpQcm9jZWR1cmUiIGNvZGVQcm9wZXJ0eT0iY29kZSIgeHNpOnR5cGU9IlJldHJpZXZlIj4NCiAgICAgICAgICAgICAgICAgIDxjb2RlcyBuYW1lPSJUb3RhbCBDb2xlY3RvbXkiIHhzaTp0eXBlPSJWYWx1ZVNldFJlZiIvPg0KICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICA8d2hlcmUgeHNpOnR5cGU9IkVxdWFsIj4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJzdGF0dXMiIHNjb3BlPSJUIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJjb21wbGV0ZWQiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICA8L3doZXJlPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9IkNvbG9ub3Njb3B5IFBlcmZvcm1lZCIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iUXVlcnkiPg0KICAgICAgICAgICAgPHNvdXJjZSBhbGlhcz0iQyI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBkYXRhVHlwZT0iZmhpcjpQcm9jZWR1cmUiIGNvZGVQcm9wZXJ0eT0iY29kZSIgeHNpOnR5cGU9IlJldHJpZXZlIj4NCiAgICAgICAgICAgICAgICAgIDxjb2RlcyBuYW1lPSJDb2xvbm9zY29weSIgeHNpOnR5cGU9IlZhbHVlU2V0UmVmIi8+DQogICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgIDx3aGVyZSB4c2k6dHlwZT0iQW5kIj4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJFcXVhbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0ic3RhdHVzIiBzY29wZT0iQyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iY29tcGxldGVkIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkluIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJlbmQiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9InBlcmZvcm1lZFBlcmlvZCIgc2NvcGU9IkMiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJMb29rYmFjayBJbnRlcnZhbCBUZW4gWWVhcnMiIHhzaTp0eXBlPSJFeHByZXNzaW9uUmVmIi8+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICA8L3doZXJlPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9IkNvbG9ub3Njb3B5IFJlc3VsdHMiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPg0KICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IlF1ZXJ5Ij4NCiAgICAgICAgICAgIDxzb3VyY2UgYWxpYXM9IkMiPg0KICAgICAgICAgICAgICAgPGV4cHJlc3Npb24gZGF0YVR5cGU9ImZoaXI6T2JzZXJ2YXRpb24iIGNvZGVQcm9wZXJ0eT0iY29kZSIgeHNpOnR5cGU9IlJldHJpZXZlIj4NCiAgICAgICAgICAgICAgICAgIDxjb2RlcyBuYW1lPSJDb2xvbm9zY29weSIgeHNpOnR5cGU9IlZhbHVlU2V0UmVmIi8+DQogICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgIDx3aGVyZSB4c2k6dHlwZT0iQW5kIj4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJFcXVhbCI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0ic3RhdHVzIiBzY29wZT0iQyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iZmluYWwiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iSW4iPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9ImVmZmVjdGl2ZURhdGVUaW1lIiBzY29wZT0iQyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBuYW1lPSJMb29rYmFjayBJbnRlcnZhbCBUZW4gWWVhcnMiIHhzaTp0eXBlPSJFeHByZXNzaW9uUmVmIi8+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICA8L3doZXJlPg0KICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgPC9kZWY+DQogICAgICA8ZGVmIG5hbWU9IlNpZ21vaWRvc2NvcHkgUHJvY2VkdXJlIiBjb250ZXh0PSJQYXRpZW50IiBhY2Nlc3NMZXZlbD0iUHVibGljIj4NCiAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJRdWVyeSI+DQogICAgICAgICAgICA8c291cmNlIGFsaWFzPSJTIj4NCiAgICAgICAgICAgICAgIDxleHByZXNzaW9uIGRhdGFUeXBlPSJmaGlyOlByb2NlZHVyZSIgY29kZVByb3BlcnR5PSJjb2RlIiB4c2k6dHlwZT0iUmV0cmlldmUiPg0KICAgICAgICAgICAgICAgICAgPGNvZGVzIG5hbWU9IkZsZXhpYmxlIFNpZ21vaWRvc2NvcHkiIHhzaTp0eXBlPSJWYWx1ZVNldFJlZiIvPg0KICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICA8d2hlcmUgeHNpOnR5cGU9IkFuZCI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9InN0YXR1cyIgc2NvcGU9IlMiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9ImNvbXBsZXRlZCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJJbiI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iZW5kIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJwZXJmb3JtZWRQZXJpb2QiIHNjb3BlPSJTIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iTG9va2JhY2sgSW50ZXJ2YWwgRml2ZSBZZWFycyIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgIDwvd2hlcmU+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iU2lnbW9pZG9zY29weSBPYnNlcnZhdGlvbiIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iUXVlcnkiPg0KICAgICAgICAgICAgPHNvdXJjZSBhbGlhcz0iTyI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBkYXRhVHlwZT0iZmhpcjpPYnNlcnZhdGlvbiIgY29kZVByb3BlcnR5PSJjb2RlIiB4c2k6dHlwZT0iUmV0cmlldmUiPg0KICAgICAgICAgICAgICAgICAgPGNvZGVzIG5hbWU9IkZsZXhpYmxlIFNpZ21vaWRvc2NvcHkiIHhzaTp0eXBlPSJWYWx1ZVNldFJlZiIvPg0KICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICA8d2hlcmUgeHNpOnR5cGU9IkFuZCI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9InN0YXR1cyIgc2NvcGU9Ik8iIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9ImZpbmFsIiB4c2k6dHlwZT0iTGl0ZXJhbCIvPg0KICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkluIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJlZmZlY3RpdmVEYXRlVGltZSIgc2NvcGU9Ik8iIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iTG9va2JhY2sgSW50ZXJ2YWwgRml2ZSBZZWFycyIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgIDwvd2hlcmU+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICA8L2RlZj4NCiAgICAgIDxkZWYgbmFtZT0iRk9CVCBQcm9jZWR1cmUiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPg0KICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IlF1ZXJ5Ij4NCiAgICAgICAgICAgIDxzb3VyY2UgYWxpYXM9IkYiPg0KICAgICAgICAgICAgICAgPGV4cHJlc3Npb24gZGF0YVR5cGU9ImZoaXI6UHJvY2VkdXJlIiBjb2RlUHJvcGVydHk9ImNvZGUiIHhzaTp0eXBlPSJSZXRyaWV2ZSI+DQogICAgICAgICAgICAgICAgICA8Y29kZXMgbmFtZT0iRmVjYWwgT2NjdWx0IEJsb29kIFRlc3QgKEZPQlQpIiB4c2k6dHlwZT0iVmFsdWVTZXRSZWYiLz4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgPHdoZXJlIHhzaTp0eXBlPSJBbmQiPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkVxdWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJzdGF0dXMiIHNjb3BlPSJGIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJjb21wbGV0ZWQiIHhzaTp0eXBlPSJMaXRlcmFsIi8+DQogICAgICAgICAgICAgICA8L29wZXJhbmQ+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iSW4iPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9ImVuZCIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0icGVyZm9ybWVkUGVyaW9kIiBzY29wZT0iRiIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+DQogICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9Ikxvb2tiYWNrIEludGVydmFsIE9uZSBZZWFyIiB4c2k6dHlwZT0iRXhwcmVzc2lvblJlZiIvPg0KICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgPC93aGVyZT4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgIDwvZGVmPg0KICAgICAgPGRlZiBuYW1lPSJGT0JUIE9ic2VydmF0aW9uIiBjb250ZXh0PSJQYXRpZW50IiBhY2Nlc3NMZXZlbD0iUHVibGljIj4NCiAgICAgICAgIDxleHByZXNzaW9uIHhzaTp0eXBlPSJRdWVyeSI+DQogICAgICAgICAgICA8c291cmNlIGFsaWFzPSJPIj4NCiAgICAgICAgICAgICAgIDxleHByZXNzaW9uIGRhdGFUeXBlPSJmaGlyOk9ic2VydmF0aW9uIiBjb2RlUHJvcGVydHk9ImNvZGUiIHhzaTp0eXBlPSJSZXRyaWV2ZSI+DQogICAgICAgICAgICAgICAgICA8Y29kZXMgbmFtZT0iRmVjYWwgT2NjdWx0IEJsb29kIFRlc3QgKEZPQlQpIiB4c2k6dHlwZT0iVmFsdWVTZXRSZWYiLz4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgPHdoZXJlIHhzaTp0eXBlPSJBbmQiPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkVxdWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJzdGF0dXMiIHNjb3BlPSJPIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJmaW5hbCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJJbiI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iZWZmZWN0aXZlRGF0ZVRpbWUiIHNjb3BlPSJPIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9Ikxvb2tiYWNrIEludGVydmFsIE9uZSBZZWFyIiB4c2k6dHlwZT0iRXhwcmVzc2lvblJlZiIvPg0KICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgPC93aGVyZT4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgIDwvZGVmPg0KICAgICAgPGRlZiBuYW1lPSJDb2xvbm9zY29weSBQcm9jZWR1cmUiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPg0KICAgICAgICAgPGV4cHJlc3Npb24geHNpOnR5cGU9IlF1ZXJ5Ij4NCiAgICAgICAgICAgIDxzb3VyY2UgYWxpYXM9IkMiPg0KICAgICAgICAgICAgICAgPGV4cHJlc3Npb24gZGF0YVR5cGU9ImZoaXI6UHJvY2VkdXJlIiBjb2RlUHJvcGVydHk9ImNvZGUiIHhzaTp0eXBlPSJSZXRyaWV2ZSI+DQogICAgICAgICAgICAgICAgICA8Y29kZXMgbmFtZT0iQ29sb25vc2NvcHkiIHhzaTp0eXBlPSJWYWx1ZVNldFJlZiIvPg0KICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgPC9zb3VyY2U+DQogICAgICAgICAgICA8d2hlcmUgeHNpOnR5cGU9IkFuZCI+DQogICAgICAgICAgICAgICA8b3BlcmFuZCB4c2k6dHlwZT0iRXF1YWwiPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgcGF0aD0idmFsdWUiIHhzaTp0eXBlPSJQcm9wZXJ0eSI+DQogICAgICAgICAgICAgICAgICAgICA8c291cmNlIHBhdGg9InN0YXR1cyIgc2NvcGU9IkMiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9ImNvbXBsZXRlZCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJJbiI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iZW5kIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJwZXJmb3JtZWRQZXJpb2QiIHNjb3BlPSJDIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbmFtZT0iTG9va2JhY2sgSW50ZXJ2YWwgVGVuIFllYXJzIiB4c2k6dHlwZT0iRXhwcmVzc2lvblJlZiIvPg0KICAgICAgICAgICAgICAgPC9vcGVyYW5kPg0KICAgICAgICAgICAgPC93aGVyZT4NCiAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgIDwvZGVmPg0KICAgICAgPGRlZiBuYW1lPSJDb2xvbm9zY29weSBPYnNlcnZhdGlvbiIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+DQogICAgICAgICA8ZXhwcmVzc2lvbiB4c2k6dHlwZT0iUXVlcnkiPg0KICAgICAgICAgICAgPHNvdXJjZSBhbGlhcz0iTyI+DQogICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBkYXRhVHlwZT0iZmhpcjpPYnNlcnZhdGlvbiIgY29kZVByb3BlcnR5PSJjb2RlIiB4c2k6dHlwZT0iUmV0cmlldmUiPg0KICAgICAgICAgICAgICAgICAgPGNvZGVzIG5hbWU9IkNvbG9ub3Njb3B5IiB4c2k6dHlwZT0iVmFsdWVTZXRSZWYiLz4NCiAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgIDwvc291cmNlPg0KICAgICAgICAgICAgPHdoZXJlIHhzaTp0eXBlPSJBbmQiPg0KICAgICAgICAgICAgICAgPG9wZXJhbmQgeHNpOnR5cGU9IkVxdWFsIj4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHBhdGg9InZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPg0KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBwYXRoPSJzdGF0dXMiIHNjb3BlPSJPIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJmaW5hbCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgIDxvcGVyYW5kIHhzaTp0eXBlPSJJbiI+DQogICAgICAgICAgICAgICAgICA8b3BlcmFuZCBwYXRoPSJ2YWx1ZSIgeHNpOnR5cGU9IlByb3BlcnR5Ij4NCiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgcGF0aD0iZWZmZWN0aXZlRGF0ZVRpbWUiIHNjb3BlPSJPIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4NCiAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIG5hbWU9Ikxvb2tiYWNrIEludGVydmFsIFRlbiBZZWFycyIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4NCiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4NCiAgICAgICAgICAgIDwvd2hlcmU+DQogICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICA8L2RlZj4NCiAgIDwvc3RhdGVtZW50cz4NCjwvbGlicmFyeT4NCg==" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-measure.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-measure.json new file mode 100644 index 00000000000..ecb7851c71e --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-measure.json @@ -0,0 +1,158 @@ +{ + "resourceType": "Measure", + "id": "col", + "meta": { + "versionId": "1", + "lastUpdated": "2017-09-09T21:26:03.890-06:00" + }, + "text": { + "status": "additional", + "div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n Cohort definition for Colorectal Cancer Screening.\n </div>" + }, + "identifier": [ + { + "use": "official", + "system": "http://hl7.org/fhir/cqi/ecqm/Measure/Identifier/payer-extract", + "value": "COL" + } + ], + "version": "1.0.0", + "title": "Colorectal Cancer Screening. Cohort Definition", + "status": "active", + "experimental": true, + "description": "Colorectal Cancer Screening. Cohort Definition", + "topic": [ + { + "coding": [ + { + "system": "http://hl7.org/fhir/c80-doc-typecodes", + "code": "57024-2" + } + ] + } + ], + "library": [ + { + "reference": "Library/col-logic" + } + ], + "group": [ + { + "identifier": { + "value": "in-demographic" + }, + "population": [ + { + "identifier": { + "value": "in-demographic" + }, + "criteria": "In Demographic" + } + ] + }, + { + "identifier": { + "value": "history-of-colorectal-cancer" + }, + "population": [ + { + "identifier": { + "value": "history-of-colorectal-cancer" + }, + "criteria": "Hx Colorectal Cancer" + } + ] + }, + { + "identifier": { + "value": "history-of-total-colectomy" + }, + "population": [ + { + "identifier": { + "value": "history-of-total-colectomy" + }, + "criteria": "Hx Total Colectomy" + } + ] + }, + { + "identifier": { + "value": "colonoscopy-performed" + }, + "population": [ + { + "identifier": { + "value": "colonoscopy-performed" + }, + "criteria": "Colonoscopy Performed" + } + ] + }, + { + "identifier": { + "value": "colonoscopy-results" + }, + "population": [ + { + "identifier": { + "value": "colonoscopy-results" + }, + "criteria": "Colonoscopy Results" + } + ] + }, + { + "identifier": { + "value": "sigmoidoscopy-procedure" + }, + "population": [ + { + "identifier": { + "value": "sigmoidoscopy-procedure" + }, + "criteria": "Sigmoidoscopy Procedure" + } + ] + }, + { + "identifier": { + "value": "sigmoidoscopy-observation" + }, + "population": [ + { + "identifier": { + "value": "sigmoidoscopy-observation" + }, + "criteria": "Sigmoidoscopy Observation" + } + ] + }, + { + "identifier": { + "value": "fobt-procedure" + }, + "population": [ + { + "identifier": { + "value": "fobt-procedure" + }, + "criteria": "FOBT Procedure" + } + ] + }, + { + "identifier": { + "value": "fobt-observation" + }, + "population": [ + { + "identifier": { + "value": "fobt-observation" + }, + "criteria": "FOBT Observation" + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-procedure.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-procedure.json new file mode 100644 index 00000000000..b9bac60b14d --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-procedure.json @@ -0,0 +1,68 @@ +{ + "resourceType": "Procedure", + "id": "Procedure-9", + "meta": { + "versionId": "1", + "lastUpdated": "2017-09-09T21:52:35.933-06:00" + }, + "extension": [ + { + "url": "http://mihin.org/fhir/templateId", + "valueString": "2.16.840.1.113883.10.20.24.3.64" + }, + { + "url": "http://mihin.org/fhir/templateId", + "valueString": "2.16.840.1.113883.10.20.22.4.14" + } + ], + "identifier": [ + { + "system": "http://hl7.org/fhir/identifier", + "value": "1.3.6.1.4.1.115:579f4eb5aeac500a550c5c7b" + } + ], + "status": "completed", + "category": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "387713003", + "display": "Surgical Procedure" + } + ] + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "36192008" + } + ], + "text": "Procedure, Performed: Total Colectomy" + }, + "subject": { + "reference": "Patient/Patient-12214", + "display": "2 N Geriatric Jr" + }, + "performedPeriod": { + "start": "2010-10-12T06:00:00-04:00", + "end": "2010-10-12T08:15:00-04:00" + }, + "performer": [ + { + "role": { + "coding": [ + { + "system": "http://hl7.org/fhir/ValueSet/performer-role", + "code": "112247003", + "display": "Medical doctor (occupation)" + } + ] + }, + "actor": { + "reference": "Practitioner/Practitioner-12208", + "display": "Jay McCann Sawyer MD" + } + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-1.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-1.json new file mode 100644 index 00000000000..19a6f47dcd1 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-1.json @@ -0,0 +1,416 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.113883.3.464.1003.108.11.1001", + "meta": { + "versionId": "3", + "lastUpdated": "2017-07-25T09:54:33.579+00:00" + }, + "url": "http://measure.eval.kanvix.com/cqf-ruler/baseDstu3/Valueset/2.16.840.1.113883.3.464.1003.108.11.1001", + "name": "Malignant Neoplasm of Colon (SNOMED CT) eCQM", + "status": "active", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "concept": [ + { + "code": "187758006" + }, + { + "code": "109838007" + }, + { + "code": "1701000119104" + }, + { + "code": "187757001" + }, + { + "code": "269533000" + }, + { + "code": "269544008" + }, + { + "code": "285312008" + }, + { + "code": "285611007" + }, + { + "code": "301756000" + }, + { + "code": "312111009" + }, + { + "code": "312112002" + }, + { + "code": "312113007" + }, + { + "code": "312114001" + }, + { + "code": "312115000" + }, + { + "code": "314965007" + }, + { + "code": "315058005" + }, + { + "code": "363406005" + }, + { + "code": "363407001" + }, + { + "code": "363408006" + }, + { + "code": "363409003" + }, + { + "code": "363410008" + }, + { + "code": "363412000" + }, + { + "code": "363413005" + }, + { + "code": "363414004" + }, + { + "code": "363510005" + }, + { + "code": "425178004" + }, + { + "code": "449218003" + }, + { + "code": "93683002" + }, + { + "code": "93761005" + }, + { + "code": "93771007" + }, + { + "code": "93826009" + }, + { + "code": "93980002" + }, + { + "code": "94006002" + }, + { + "code": "94072004" + }, + { + "code": "94105000" + }, + { + "code": "94179005" + }, + { + "code": "94260004" + }, + { + "code": "94271003" + }, + { + "code": "94328005" + }, + { + "code": "94509004" + }, + { + "code": "94538001" + }, + { + "code": "94604000" + }, + { + "code": "94643001" + } + ] + } + ] + }, + "expansion": { + "identifier": "http://open-api2.hspconsortium.org/payerextract/data/ValueSet/2.16.840.1.113883.3.464.1003.108.11.1001", + "timestamp": "2016-09-19T14:05:21.939-04:00", + "total": 43, + "offset": 0, + "contains": [ + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "425178004", + "display": "Adenocarcinoma of rectosigmoid junction" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "301756000", + "display": "Adenocarcinoma of sigmoid colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "312111009", + "display": "Carcinoma of ascending colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "269533000", + "display": "Carcinoma of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "312113007", + "display": "Carcinoma of descending colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "312114001", + "display": "Carcinoma of hepatic flexure" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "285312008", + "display": "Carcinoma of sigmoid colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "312115000", + "display": "Carcinoma of splenic flexure" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "269544008", + "display": "Carcinoma of the rectosigmoid junction" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "312112002", + "display": "Carcinoma of transverse colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "315058005", + "display": "Lynch syndrome" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "314965007", + "display": "Local recurrence of malignant tumor of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "449218003", + "display": "Lymphoma of sigmoid colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "187758006", + "display": "Malignant neoplasm of other specified sites of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "187757001", + "display": "Malignant neoplasm, overlapping lesion of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "363412000", + "display": "Malignant tumor of ascending colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "363406005", + "display": "Malignant tumor of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "363409003", + "display": "Malignant tumor of descending colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "363407001", + "display": "Malignant tumor of hepatic flexure" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "363510005", + "display": "Malignant tumor of large intestine" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "363414004", + "display": "Malignant tumor of rectosigmoid junction" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "363410008", + "display": "Malignant tumor of sigmoid colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "363413005", + "display": "Malignant tumor of splenic flexure" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "363408006", + "display": "Malignant tumor of transverse colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "285611007", + "display": "Metastasis to colon of unknown primary" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "109838007", + "display": "Overlapping malignant neoplasm of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "1701000119104", + "display": "Primary adenocarcinoma of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "93683002", + "display": "Primary malignant neoplasm of ascending colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "93761005", + "display": "Primary malignant neoplasm of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "93771007", + "display": "Primary malignant neoplasm of descending colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "93826009", + "display": "Primary malignant neoplasm of hepatic flexure of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "93980002", + "display": "Primary malignant neoplasm of rectosigmoid junction" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94006002", + "display": "Primary malignant neoplasm of sigmoid colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94072004", + "display": "Primary malignant neoplasm of splenic flexure of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94105000", + "display": "Primary malignant neoplasm of transverse colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94179005", + "display": "Secondary malignant neoplasm of ascending colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94260004", + "display": "Secondary malignant neoplasm of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94271003", + "display": "Secondary malignant neoplasm of descending colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94328005", + "display": "Secondary malignant neoplasm of hepatic flexure of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94509004", + "display": "Secondary malignant neoplasm of rectosigmoid junction" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94538001", + "display": "Secondary malignant neoplasm of sigmoid colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94604000", + "display": "Secondary malignant neoplasm of splenic flexure of colon" + }, + { + "system": "http://snomed.info/sct", + "version": "2015.03.14AB", + "code": "94643001", + "display": "Secondary malignant neoplasm of transverse colon" + } + ] + } +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-2.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-2.json new file mode 100644 index 00000000000..1d09b2d79af --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-2.json @@ -0,0 +1,181 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.113883.3.464.1003.198.12.1019", + "meta": { + "versionId": "3", + "lastUpdated": "2017-07-25T09:54:33.579+00:00" + }, + "url": "http://measure.eval.kanvix.com/cql-measure-processor/baseDstu3/Valueset/2.16.840.1.113883.3.464.1003.198.12.1019 ", + "name": "Total Colectomy eMeasure", + "compose": { + "include": [ + { + "system": "http://www.ama-assn.org/go/cpt", + "version": "2016.1.15AA", + "concept": [ + { + "code": "44156" + }, + { + "code": "44158" + }, + { + "code": "44157" + }, + { + "code": "44155" + }, + { + "code": "44151" + }, + { + "code": "44150" + }, + { + "code": "44211" + }, + { + "code": "44212" + }, + { + "code": "44210" + }, + { + "code": "44153" + }, + { + "code": "44152" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "2015.09.15AA", + "filter": [ + { + "property": "concept", + "op": "is-a", + "value": "26390003" + } + ] + } + ] + }, + "expansion": { + "timestamp": "2016-09-20T12:32:19.296-04:00", + "total": 22, + "offset": 0, + "contains": [ + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44156", + "display": "Colectomy, total, abdominal, with proctectomy; with continent ileostomy" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44158", + "display": "Colectomy, total, abdominal, with proctectomy; with ileoanal anastomosis, creation of ileal reservoir (S or J), includes loop ileostomy, and rectal mucosectomy, when performed" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44157", + "display": "Colectomy, total, abdominal, with proctectomy; with ileoanal anastomosis, includes loop ileostomy, and rectal mucosectomy, when performed" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44155", + "display": "Colectomy, total, abdominal, with proctectomy; with ileostomy" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44151", + "display": "Colectomy, total, abdominal, without proctectomy; with continent ileostomy" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44150", + "display": "Colectomy, total, abdominal, without proctectomy; with ileostomy or ileoproctostomy" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44153", + "display": "Colectomy, total, abdominal, without proctectomy; with rectal mucosectomy, ileoanal anastomosis, creation of ileal reservoir (S or J), with or without loop ileostomy" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44152", + "display": "Colectomy, total, abdominal, without proctectomy; with rectal mucosectomy, ileoanal anastomosis, with or without loop ileostomy" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44211", + "display": "Laparoscopy, surgical; colectomy, total, abdominal, with proctectomy, with ileoanal anastomosis, creation of ileal reservoir (S or J), with loop ileostomy, includes rectal mucosectomy, when performed" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44212", + "display": "Laparoscopy, surgical; colectomy, total, abdominal, with proctectomy, with ileostomy" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44210", + "display": "Laparoscopy, surgical; colectomy, total, abdominal, without proctectomy, with ileostomy or ileoproctostomy" + }, + { + "system": "http://snomed.info/sct", + "code": "303401008", + "display": "Parks panproctocolectomy, anastomosis of ileum to anus and creation of pouch" + }, + { + "system": "http://snomed.info/sct", + "code": "235331003", + "display": "Restorative proctocolectomy" + }, + { + "system": "http://snomed.info/sct", + "code": "36192008", + "display": "Total abdominal colectomy with ileoproctostomy" + }, + { + "system": "http://snomed.info/sct", + "code": "456004", + "display": "Total abdominal colectomy with ileostomy" + }, + { + "system": "http://snomed.info/sct", + "code": "44751009", + "display": "Total abdominal colectomy with proctectomy and continent ileostomy" + }, + { + "system": "http://snomed.info/sct", + "code": "31130001", + "display": "Total abdominal colectomy with proctectomy and ileostomy" + }, + { + "system": "http://snomed.info/sct", + "code": "80294005", + "display": "Total abdominal colectomy with rectal mucosectomy and ileoanal anastomosis" + }, + { + "system": "http://snomed.info/sct", + "code": "26390003", + "display": "Total colectomy" + }, + { + "system": "http://snomed.info/sct", + "code": "307666008", + "display": "Total colectomy and ileostomy" + }, + { + "system": "http://snomed.info/sct", + "code": "307669001", + "display": "Total colectomy, ileostomy and closure of rectal stump" + }, + { + "system": "http://snomed.info/sct", + "code": "307667004", + "display": "Total colectomy, ileostomy and rectal mucous fistula" + } + ] + } +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-3.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-3.json new file mode 100644 index 00000000000..87882baf088 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-3.json @@ -0,0 +1,421 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.113883.3.464.1003.108.12.1020", + "meta": { + "versionId": "3", + "lastUpdated": "2017-07-25T09:54:33.579+00:00" + }, + "url": "http://measure.eval.kanvix.com/cql-measure-processor/baseDstu3/Valueset/2.16.840.1.113883.3.464.1003.108.12.1020", + "name": "Colonoscopy eMeasure", + "compose": { + "include": [ + { + "system": "http://www.ama-assn.org/go/cpt", + "version": "2015.1.14AB", + "concept": [ + { + "code": "44388" + }, + { + "code": "44393" + }, + { + "code": "44389" + }, + { + "code": "44391" + }, + { + "code": "44390" + }, + { + "code": "44392" + }, + { + "code": "44394" + }, + { + "code": "44397" + }, + { + "code": "45378" + }, + { + "code": "45383" + }, + { + "code": "45380" + }, + { + "code": "45382" + }, + { + "code": "45386" + }, + { + "code": "45381" + }, + { + "code": "45391" + }, + { + "code": "45379" + }, + { + "code": "45384" + }, + { + "code": "45385" + }, + { + "code": "45387" + }, + { + "code": "45392" + }, + { + "code": "45355" + }, + { + "code": "44401" + }, + { + "code": "44402" + }, + { + "code": "44403" + }, + { + "code": "44404" + }, + { + "code": "44405" + }, + { + "code": "44406" + }, + { + "code": "44407" + }, + { + "code": "44408" + }, + { + "code": "45388" + }, + { + "code": "45389" + }, + { + "code": "45390" + }, + { + "code": "45393" + }, + { + "code": "45398" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "2014.07.14AA", + "filter": [ + { + "property": "concept", + "op": "is-a", + "value": "73761001" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "2014.07.14AA", + "filter": [ + { + "property": "concept", + "op": "is-a", + "value": "174184006" + } + ] + } + ] + }, + "expansion": { + "timestamp": "2016-09-20T13:07:55.271-04:00", + "total": 54, + "offset": 0, + "contains": [ + { + "system": "http://snomed.info/sct", + "code": "310634005", + "display": "Check colonoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "73761001", + "display": "Colonoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "446745002", + "display": "Colonoscopy and biopsy of colon" + }, + { + "system": "http://snomed.info/sct", + "code": "446521004", + "display": "Colonoscopy and excision of mucosa of colon" + }, + { + "system": "http://snomed.info/sct", + "code": "447021001", + "display": "Colonoscopy and tattooing" + }, + { + "system": "http://snomed.info/sct", + "code": "443998000", + "display": "Colonoscopy through colostomy with endoscopic biopsy of colon" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44388", + "display": "Colonoscopy through stoma; diagnostic, including collection of specimen(s) by brushing or washing, when performed (separate procedure)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44401", + "display": "Colonoscopy through stoma; with ablation of tumor(s), polyp(s), or other lesion(s) (includes pre-and post-dilation and guide wire passage, when performed)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44393", + "display": "Colonoscopy through stoma; with ablation of tumor(s), polyp(s), or other lesion(s) not amenable to removal by hot biopsy forceps, bipolar cautery or snare technique" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44389", + "display": "Colonoscopy through stoma; with biopsy, single or multiple" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44391", + "display": "Colonoscopy through stoma; with control of bleeding, any method" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44408", + "display": "Colonoscopy through stoma; with decompression (for pathologic distention) (eg, volvulus, megacolon), including placement of decompression tube, when performed" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44404", + "display": "Colonoscopy through stoma; with directed submucosal injection(s), any substance" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44403", + "display": "Colonoscopy through stoma; with endoscopic mucosal resection" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44402", + "display": "Colonoscopy through stoma; with endoscopic stent placement (including pre- and post-dilation and guide wire passage, when performed)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44406", + "display": "Colonoscopy through stoma; with endoscopic ultrasound examination, limited to the sigmoid, descending, transverse, or ascending colon and cecum and adjacent structures" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44390", + "display": "Colonoscopy through stoma; with removal of foreign body(s)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44392", + "display": "Colonoscopy through stoma; with removal of tumor(s), polyp(s), or other lesion(s) by hot biopsy forceps" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44394", + "display": "Colonoscopy through stoma; with removal of tumor(s), polyp(s), or other lesion(s) by snare technique" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44405", + "display": "Colonoscopy through stoma; with transendoscopic balloon dilation" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44397", + "display": "Colonoscopy through stoma; with transendoscopic stent placement (includes predilation)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "44407", + "display": "Colonoscopy through stoma; with transendoscopic ultrasound guided intramural or transmural fine needle aspiration/biopsy(s), includes endoscopic ultrasound examination limited to the sigmoid, descending, transverse, or ascending colon and cecum and adjacent structures" + }, + { + "system": "http://snomed.info/sct", + "code": "12350003", + "display": "Colonoscopy with rigid sigmoidoscope through colotomy" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45383", + "display": "Colonoscopy, flexible, proximal to splenic flexure; with ablation of tumor(s), polyp(s), or other lesion(s) not amenable to removal by hot biopsy forceps, bipolar cautery or snare technique" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45387", + "display": "Colonoscopy, flexible, proximal to splenic flexure; with transendoscopic stent placement (includes predilation)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45378", + "display": "Colonoscopy, flexible; diagnostic, including collection of specimen(s) by brushing or washing, when performed (separate procedure)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45388", + "display": "Colonoscopy, flexible; with ablation of tumor(s), polyp(s), or other lesion(s) (includes pre- and post-dilation and guide wire passage, when performed)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45398", + "display": "Colonoscopy, flexible; with band ligation(s) (eg, hemorrhoids)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45380", + "display": "Colonoscopy, flexible; with biopsy, single or multiple" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45382", + "display": "Colonoscopy, flexible; with control of bleeding, any method" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45393", + "display": "Colonoscopy, flexible; with decompression (for pathologic distention) (eg, volvulus, megacolon), including placement of decompression tube, when performed" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45381", + "display": "Colonoscopy, flexible; with directed submucosal injection(s), any substance" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45390", + "display": "Colonoscopy, flexible; with endoscopic mucosal resection" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45389", + "display": "Colonoscopy, flexible; with endoscopic stent placement (includes pre- and post-dilation and guide wire passage, when performed)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45391", + "display": "Colonoscopy, flexible; with endoscopic ultrasound examination limited to the rectum, sigmoid, descending, transverse, or ascending colon and cecum, and adjacent structures" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45379", + "display": "Colonoscopy, flexible; with removal of foreign body(s)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45384", + "display": "Colonoscopy, flexible; with removal of tumor(s), polyp(s), or other lesion(s) by hot biopsy forceps" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45385", + "display": "Colonoscopy, flexible; with removal of tumor(s), polyp(s), or other lesion(s) by snare technique" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45386", + "display": "Colonoscopy, flexible; with transendoscopic balloon dilation" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45392", + "display": "Colonoscopy, flexible; with transendoscopic ultrasound guided intramural or transmural fine needle aspiration/biopsy(s), includes endoscopic ultrasound examination limited to the rectum, sigmoid, descending, transverse, or ascending colon and cecum, and adjacent structures" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45355", + "display": "Colonoscopy, rigid or flexible, transabdominal via colotomy, single or multiple" + }, + { + "system": "https://www.cms.gov/Medicare/Coding/MedHCPCSGenInfo/index.html", + "code": "G0105", + "display": "Colorectal cancer screening; colonoscopy on individual at high risk" + }, + { + "system": "https://www.cms.gov/Medicare/Coding/MedHCPCSGenInfo/index.html", + "code": "G0121", + "display": "Colorectal cancer screening; colonoscopy on individual not meeting criteria for high risk" + }, + { + "system": "http://snomed.info/sct", + "code": "427459009", + "display": "Diagnostic endoscopic examination of colonic pouch and biopsy of colonic pouch using colonoscope" + }, + { + "system": "http://snomed.info/sct", + "code": "174184006", + "display": "Diagnostic endoscopic examination on colon" + }, + { + "system": "http://snomed.info/sct", + "code": "367535003", + "display": "Fiberoptic colonoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "8180007", + "display": "Fiberoptic colonoscopy through colostomy" + }, + { + "system": "http://snomed.info/sct", + "code": "25732003", + "display": "Fiberoptic colonoscopy with biopsy" + }, + { + "system": "http://snomed.info/sct", + "code": "34264006", + "display": "Intraoperative colonoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "235151005", + "display": "Limited colonoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "174158000", + "display": "Open colonoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "444783004", + "display": "Screening colonoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "303587008", + "display": "Therapeutic colonoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "235150006", + "display": "Total colonoscopy" + } + ] + } +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-4.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-4.json new file mode 100644 index 00000000000..139a8e6246b --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-4.json @@ -0,0 +1,208 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.113883.3.464.1003.198.12.1010", + "meta": { + "versionId": "6", + "lastUpdated": "2017-07-25T09:54:33.579+00:00" + }, + "url": "http://measure.eval.kanvix.com/cql-measure-processor/baseDstu3/Valueset/2.16.840.1.113883.3.464.1003.198.12.1010", + "name": "Flexible Sigmoidoscopy eMeasure", + "compose": { + "include": [ + { + "system": "http://www.ama-assn.org/go/cpt", + "version": "2015.1.14AB", + "concept": [ + { + "code": "45330" + }, + { + "code": "45339" + }, + { + "code": "45331" + }, + { + "code": "45334" + }, + { + "code": "45337" + }, + { + "code": "45340" + }, + { + "code": "45335" + }, + { + "code": "45341" + }, + { + "code": "45332" + }, + { + "code": "45333" + }, + { + "code": "45338" + }, + { + "code": "45345" + }, + { + "code": "45342" + }, + { + "code": "45346" + }, + { + "code": "45347" + }, + { + "code": "45349" + }, + { + "code": "45350" + } + ] + }, + { + "system": "https://www.cms.gov/Medicare/Coding/MedHCPCSGenInfo/index.html", + "version": "2016.1.15AB", + "concept": [ + { + "code": "G0104" + } + ] + }, + { + "system": "http://snomed.info/sct", + "version": "2014.07.14AA", + "filter": [ + { + "property": "concept", + "op": "is-a", + "value": "44441009" + } + ] + } + ] + }, + "expansion": { + "timestamp": "2016-09-20T13:20:03.237-04:00", + "total": 22, + "offset": 0, + "contains": [ + { + "system": "https://www.cms.gov/Medicare/Coding/MedHCPCSGenInfo/index.html", + "code": "G0104", + "display": "Colorectal cancer screening; flexible sigmoidoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "425634007", + "display": "Diagnostic endoscopic examination of lower bowel and sampling for bacterial overgrowth using fiberoptic sigmoidoscope" + }, + { + "system": "http://snomed.info/sct", + "code": "44441009", + "display": "Flexible fiberoptic sigmoidoscopy" + }, + { + "system": "http://snomed.info/sct", + "code": "112870002", + "display": "Flexible fiberoptic sigmoidoscopy for removal of foreign body" + }, + { + "system": "http://snomed.info/sct", + "code": "396226005", + "display": "Flexible fiberoptic sigmoidoscopy with biopsy" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45330", + "display": "Sigmoidoscopy, flexible; diagnostic, including collection of specimen(s) by brushing or washing, when performed (separate procedure)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45346", + "display": "Sigmoidoscopy, flexible; with ablation of tumor(s), polyp(s), or other lesion(s) (includes pre- and post-dilation and guide wire passage, when performed)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45339", + "display": "Sigmoidoscopy, flexible; with ablation of tumor(s), polyp(s), or other lesion(s) not amenable to removal by hot biopsy forceps, bipolar cautery or snare technique" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45350", + "display": "Sigmoidoscopy, flexible; with band ligation(s) (eg, hemorrhoids)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45331", + "display": "Sigmoidoscopy, flexible; with biopsy, single or multiple" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45334", + "display": "Sigmoidoscopy, flexible; with control of bleeding, any method" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45337", + "display": "Sigmoidoscopy, flexible; with decompression (for pathologic distention) (eg, volvulus, megacolon), including placement of decompression tube, when performed" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45335", + "display": "Sigmoidoscopy, flexible; with directed submucosal injection(s), any substance" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45349", + "display": "Sigmoidoscopy, flexible; with endoscopic mucosal resection" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45341", + "display": "Sigmoidoscopy, flexible; with endoscopic ultrasound examination" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45347", + "display": "Sigmoidoscopy, flexible; with placement of endoscopic stent (includes pre- and post-dilation and guide wire passage, when performed)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45332", + "display": "Sigmoidoscopy, flexible; with removal of foreign body(s)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45333", + "display": "Sigmoidoscopy, flexible; with removal of tumor(s), polyp(s), or other lesion(s) by hot biopsy forceps" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45338", + "display": "Sigmoidoscopy, flexible; with removal of tumor(s), polyp(s), or other lesion(s) by snare technique" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45340", + "display": "Sigmoidoscopy, flexible; with transendoscopic balloon dilation" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45345", + "display": "Sigmoidoscopy, flexible; with transendoscopic stent placement (includes predilation)" + }, + { + "system": "http://www.ama-assn.org/go/cpt", + "code": "45342", + "display": "Sigmoidoscopy, flexible; with transendoscopic ultrasound guided intramural or transmural fine needle aspiration/biopsy(s)" + } + ] + } +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-5.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-5.json new file mode 100644 index 00000000000..a060cf3f2c7 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/measure-processing-valueset-5.json @@ -0,0 +1,147 @@ +{ + "resourceType": "ValueSet", + "id": "2.16.840.1.113883.3.464.1003.198.12.1011", + "meta": { + "versionId": "3", + "lastUpdated": "2017-07-25T09:54:33.579+00:00" + }, + "url": "http://measure.eval.kanvix.com/cql-measure-processor/baseDstu3/Valueset/2.16.840.1.113883.3.464.1003.198.12.1011", + "name": "Fecal Occult Blood Test (FOBT) eMeasure", + "compose": { + "include": [ + { + "system": "http://loinc.org", + "version": "2.44.13AA", + "concept": [ + { + "code": "27396-1" + }, + { + "code": "58453-2" + }, + { + "code": "2335-8" + }, + { + "code": "14563-1" + }, + { + "code": "14564-9" + }, + { + "code": "14565-6" + }, + { + "code": "12503-9" + }, + { + "code": "12504-7" + }, + { + "code": "27401-9" + }, + { + "code": "27925-7" + }, + { + "code": "27926-5" + }, + { + "code": "29771-3" + }, + { + "code": "57905-2" + }, + { + "code": "56490-6" + }, + { + "code": "56491-4" + } + ] + } + ] + }, + "expansion": { + "timestamp": "2016-09-20T13:32:34.390-04:00", + "total": 15, + "offset": 0, + "contains": [ + { + "system": "http://loinc.org", + "code": "27396-1", + "display": "Hemoglobin.gastrointestinal [Mass/mass] in Stool" + }, + { + "system": "http://loinc.org", + "code": "58453-2", + "display": "Hemoglobin.gastrointestinal [Mass/volume] in Stool by Immunologic method" + }, + { + "system": "http://loinc.org", + "code": "2335-8", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool" + }, + { + "system": "http://loinc.org", + "code": "14563-1", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool --1st specimen" + }, + { + "system": "http://loinc.org", + "code": "14564-9", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool --2nd specimen" + }, + { + "system": "http://loinc.org", + "code": "14565-6", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool --3rd specimen" + }, + { + "system": "http://loinc.org", + "code": "12503-9", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool --4th specimen" + }, + { + "system": "http://loinc.org", + "code": "12504-7", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool --5th specimen" + }, + { + "system": "http://loinc.org", + "code": "27401-9", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool --6th specimen" + }, + { + "system": "http://loinc.org", + "code": "27925-7", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool --7th specimen" + }, + { + "system": "http://loinc.org", + "code": "27926-5", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool --8th specimen" + }, + { + "system": "http://loinc.org", + "code": "29771-3", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool by Immunologic method" + }, + { + "system": "http://loinc.org", + "code": "57905-2", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool by Immunologic method --1st specimen" + }, + { + "system": "http://loinc.org", + "code": "56490-6", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool by Immunologic method --2nd specimen" + }, + { + "system": "http://loinc.org", + "code": "56491-4", + "display": "Hemoglobin.gastrointestinal [Presence] in Stool by Immunologic method --3rd specimen" + } + ] + } +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply-library.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply-library.json new file mode 100644 index 00000000000..4df7e6e9eb0 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply-library.json @@ -0,0 +1,19 @@ +{ + "resourceType": "Library", + "id": "plandefinitionApplyTest", + "version": "1.0", + "status": "draft", + "type": { + "coding": [ + { + "code": "logic-library" + } + ] + }, + "content": [ + { + "contentType": "text/cql", + "data": "bGlicmFyeSBwbGFuZGVmaW5pdGlvbkFwcGx5VGVzdCB2ZXJzaW9uICcxLjAnDQoNCmRlZmluZSBSZXN1bHRzOg0KICAgIHRydWUNCg0KZGVmaW5lICJEeW5hbWljIERldGFpbCBEZWZpbml0aW9uIjoNCiAgICAnVGhpcyBpcyBhIGR5bmFtaWMgZGVmaW5pdGlvbiEn" + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply-test.cql b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply-test.cql new file mode 100644 index 00000000000..1cfb1b1d347 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply-test.cql @@ -0,0 +1,7 @@ +library plandefinitionApplyTest version '1.0' + +define Results: + true + +define "Dynamic Detail Definition": + 'This is a dynamic definition!' \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply.json b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply.json new file mode 100644 index 00000000000..77e0f7253d8 --- /dev/null +++ b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/plandefinition-apply.json @@ -0,0 +1,59 @@ +{ + "resourceType": "PlanDefinition", + "id": "apply-example", + "text": { + "status": "generated", + "div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">General PlanDefinition $apply example resource</div>" + }, + "identifier": [ + { + "use": "official", + "value": "apply-example" + } + ], + "version": "1.0", + "name": "Example", + "title": "Example for PlanDefinition $apply operation", + "type": { + "coding": [ + { + "system": "http://hl7.org/fhir/plan-definition-type", + "code": "eca-rule", + "display": "ECA Rule" + } + ] + }, + "status": "draft", + "date": "2017-09-18", + "purpose": "Testing", + "usage": "This resource is to be used only for testing", + "topic": [ + { + "text": "Testing $apply operation" + } + ], + "library": [ + { + "reference": "Library/plandefinitionApplyTest" + } + ], + "action": [ + { + "condition": [ + { + "kind": "applicability", + "description": "Simple test", + "language": "text/cql", + "expression": "plandefinitionApplyTest.Results" + } + ], + "dynamicValue": [ + { + "description": "Set CarePlan detail definition", + "path": "title", + "expression": "plandefinitionApplyTest.\"Dynamic Detail Definition\"" + } + ] + } + ] +} \ No newline at end of file diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/test.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..969e53acd454260fbf666a0ae737c2242e1b8ba0 GIT binary patch literal 55604 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 z�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 literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-affected-areas.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-affected-areas.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4f45ced480dc50f5de50f41f65a5f701679078fd GIT binary patch literal 12461 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 literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-signs-symptoms.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-signs-symptoms.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fe4ca050e194c4bb1cb7dc1ac40ff78a25495439 GIT binary patch literal 11003 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 YQbFd$^XdWs2+yC7&sN)r=I7J@0Yf{K#{d8T literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-test-results.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-test-results.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1518ddf71d912e3c4943fb77948ed4cc219a9cc1 GIT binary patch literal 9775 zcmeHt1y@|j)^_9W?ykYz9fC^;?$WqR@DLn=1a}gG(?BD^HMqM=fZ#3(79@O~%-nZo zGWmYNy{FeYr+f8&_NqFypW0UHN-(gv0C)f*005u@NC}G#>Olbj@vr~@4ge9_K-$^K z1L)*o^4!M-=x)U3?dU+62Mf)Z3xI~m|L^)QegoynDyrQam|@rQD^y?b>74W^Lo;7= zj$<=xpqp+eSj<+lj@Q;USa0Bms;9hKQYr6wc^Z&0V#&2!&$lcgvuVWC*DG(i&RiL5 zkh<Y`p1k%NRY9<#+)Mp6S#G)tJ3D=}5nx33xC$3dqcI7)3|>Dh3}fB9_^Mi~r@@se z1f*?;^u?E_IU&UhHqPxpq{rh6pibXlh`iz6Tdm72;nV53r$(VVm98d}x%%SqP<}Ha zzF#Owap2@OLQQbWASnsX*+KkSS7DT#G@nkwTdiSIH~Z~~H)UR@I<n$B2|OnAMbO7( zp2K*I95U*}Bmg_dgt<Jez6UCCGP#V@^9;%6Yo$II(w;RE%jUOn@ec6N2`})^R)A_n z(u1+Db4{4OSZ0&07kg14T#t&}z7mnd`fd_dseL-*V@eZgncJ|~f#Y+p$|mgbwL+3& zFm*qW>jA>K$43}|`ac+{?yuVU6=G(}5W=BA7-`}LbZ}>9`*Hst6aS0p_qVB+Cypz^ zaAHQB2A^W?tmZhvVcFIbVEN*dVsOxZ2wYI1r`2e1cE-ddu)AF6<W6#KzaMzP-=fgw zrX1ppb_jy+U5zC3FaEsm($Nf+!sVls<UQxI1>3Uo#r$pnXWNbGQd%CQ?msoLOX`G` zw7;kUqOD@j(ay^^jH~XJuqudi)tsLv?BLGT<CtBwi}Y)O_Y?@P`Q}w$du)26IudR1 zPObdowhWc#k$`<VgMX5MSaggQ7QD!D&9|1}@l%=p3>KgiO@a<pYO*=GBG^PodqkS4 z_)V0%l+Gg&`gleg(9bwZ>V~JQm%?Th;+y`>k(kt8rym??hH!)!fC%O7!2SnKyqw+a z&7Ga?fB3EcPzDO(ydYZsyDx~z*mZND_ML{bg-iyxPQ`M{<rw$n&a?UfES|X9n3E{o zB{jSo%vE{sk!FbcF0|v6;r;Q6HE9n4{XvM1IvyS31^vRR7qVF9d<z3+&ys;C>>Ffy z+J)H${$+kro?W%ATY2gh?`P}jn;()bN#inKV@~d>l1!Bd4$lmhj7oYj@&msyPEWxc zaH~}}AWyBXhS(IPCp})HJ1&#>Bkj1$j1y4Pp7U%$$>eKBl&`B1WMFM=-$ZC_=BV1N z32q;=F{N(XbIfLPtWl8-P<^o_>&G5!(liQLEJy18W_kw8r6kz#6yE2B>m@s6rT=X* z-j$)>8X@N54+j8XKqMe0^LJw@cs}T~%z@cPuqTe#`efz+EfuCe4hu#Wt3bsK)#i15 zq>F|;v$p!hns73RWt7el16z>x@@A)vXjILBDfp=s%RETpTp<*?sD!Oa2zT%Hjy^m0 zqfnkAb*(v^uQ`4Wn^<5bMP1XHZ2$$}RSg^{yUd!<K%Z0LC<>eroYTgaD1bN$wY<df zZ0R*81DtA}O(@-G<V!^EuUM#UYwkmHnS6;%^C5)vkubOQ8+Bw8v=4~cv^(vk(jXuj zrZ8Kh-+_b%<-UWT`ciz(tJ-A&ig>eIbbU9w+F3s@X!S;hZ)|G<U9Ky|t?8#tru=P3 zP^E{JGPee>$gtHXty^&^aKw@&Z;nQTZ4W+#qd<0$O-4y5V-Y`BTYuP*v@Xv4NQ);G zq==UW8;^K}-NstPEQsI*>25Tb-8Q~x!B(W4gq${7FfuU>a%d&1Wuz^z(X$y$nX5&U z-Wd{vf5%nB`yN%NN50|)hOd0?Y_@w<{QbUIRk%5V)W@RP*!LsmCePZ3Y!)eAZe#d3 ze>V}3v0-3_C%ZEwa2J2nobFvodqlH-dbjZkBjhTz>=^}0a$IiC+i=FOlhw=3+l6Hx zI~g-YDvdZ^mXKbUW?EMv%5CTncsRlkcv|E(yEU~oetU5pb_7m$3~e#U%z3$06hywK z>KG84`*B1-d89tZZvrX`Tk^f>{kmFL%JU~ngfN#i!M#pMx>a)l)nJlNZR1>u&3*du zqD>9L$~2$!*bN15eCtgPgNpGFA8g;UO%IL}2-gJKr`fzNmTstZ<s*41@Uh9#51PoC zPO!=oEqTgPg!p<N>Jz`=S6b2WdE4}@EFQz1T@AuFQ?#VOEZT8xg~aVaZk@%KF(6vp z52-aL?0iJ>Loe!iYL~zvv6KilG3|n%X*s@}s`i05+Nz^Xerx2Ciu1{75F<xL0swIT zFmiVrGdG~6riYuYlePPgZ82HfKy8@=_vO3VN7HRvKT6jPp0rZdC1}KY^!O#mH%as4 zC51g~^)QDWYf&Jis#s{}!E-M*v9wcf-}?spK~Wo;<ZM}6Wg2L=3O=dTu{?^h5Bbd0 zeQr&kD-t=PuT1kczukFhTChkO*;-A`EqyAc<ve8dSn07tz*cigK56VV3CK#%fp6zD z04&!j$k`@%7!E|1Yq7K5j_S$yGM)I^peN=<?r75NXbO*S)JB$N_t|C_`J@6}<0xEJ znX>3#h^fFYKrJygh3C+vwZdE<>35^qppkrOs>`KokRYx*cL|AMx$cvC3T9LFCwS9O z#jiFiy)#Zgr*|&SiaB&ZO(>cAftr=6!f?&Rw`uoU>N=co;y}CX<x}ES<dHhuZ2ymj z?o7(p=dqb={;oZ`vT8=>9~7%V=B`-tVbS`=#sT7@f_B=*aAScT-l>zdxx6Z(7VR0- zmBX1+D`g`V)Ky_-4ZVR+Pz7m^wpT<Haw`c&luyD0lVggKt=PUNThQ1ltb+-#!xw!6 zO!J$A)@zQ+U3)$CH><ok1AD1BwMFF}sG4-#cr?tyT*6x?S)OS}fUeM7X5#hb+QbpU z+f)rX^98$G{6w4A3nqusT^rE3j^;nSQ)4Eje3uKJh2al>vwJJZ@!Tdg4eb4F8+CA& zf_h6|2_MvN>#d2v=6Ii{&ruY`575&>=k)nf_#DHk?3F_kd8HJ9th^_*c>~mQh2gTV z80}}q+8|$Kf%@63yS+_VRWX&C$=mZb%>5}F+{r7>adfWquU*SH-I=JKYo@Fca-ikz z!;&wa@WHjo-~7pR+Zno!^xM5y??pt^4P8w|DexOm?jNNRKp`qDTd`g9uLET0ZZb0< z@$YYT>k1OwuYvFYKq&E#wDjk0?O_9S1hW6UbN;a7BfU>f%Y3-)6jffB9;f>Cbc^T* zxb+Uj21)fcD^6_%z$J6(sBn1(-q+B6!B8;GX8bTO8lpepF1#)6o)hgsXIiATXx>*t z_UJaJj4yc;K`}0Pf8+IaZaP_LS70|3DB9rK?M{~6>mXMnJ02iFG%p11h8wbqtU<kA z;oUi@=pGkui9(kN);yAUh@r@Rn}t{{QZny@+8eoMs+8T?AULc^yUuGeV=dSWXkn`0 z7iBLmj<f_Py~iC{%^FvT$%*3GCwGc@!`NySJRF?9Q#{4PXUBMSR8EEEKT4A+yc>CC zXk*>SMt@W4LiW1x6^7`%W}wr<nH3pXa!Sd9rcN2Zb|A2=rt7G@bZLZO+A+VK;>Ik{ z-UO;-p*MCZ-v!s{m<jOOV$Zg-w|3D<?q$@hL~nlYRh6g%FKVk*M_qRl#lX8Do!qYW zju47BG-r8`@6Z%S>mia}96ZNQ)Ppd*&KxVnFP6gt;1n4L$6ibrW7g-XI5)%#<~LNF zIjz509-Z<I3wBtrN^>wD<Emz#e|8bNZ2^#{lnu6w(`7#=?Tzon%CpSG*-dA`mT#pS zB8)Jv+>dR;zfTi45iO0(gNdnKN+jU;EG(P&rh7A+MRxoFyS$lr>wHMioSMpY5yWLa z(->P5X1saHzV`4i%|B++@o<0Jdo7!vc5c{@;aY!_nR}#yCgJ>qzxDR>HbqB=|K(;w z;P=}u^Nx4<rReYCaou;>+Fi)2aD}Y*q2BJCYFi{yn$JieE!3xz2OWB>f8x#KTLEO} zZjx{3a`3HB9z=Cs@(k((>*}{B6~Lc`atfI?%|dxu8e~Q=lsT9=i<s;;A|U20FU6@_ zg?iWO2iIa}4KjAZkKW+|p;=wR!)Q9Hxno${{FEa<&*Nb4#(ZdUA;+<P6*)_X!^MkT z3i8M*z)Y))r3_s<8y%#v{#a5mFYWI{ZDvYoM<w1l<FbjRkCeQmtg5c)89_mlups{y z{8hI<w(*rbI|p#gCS0&#wkb_Iur7BE%CkD+Ar!2MlY!!9^}#2Gkh_mhI2t>dts+|? zb#H<FhNyti?S$Jb<Q<25=zv!w%wAu+i#YWH;`OZ58D^+f@pHP!`<fxvYLTuH(l_=( zPjyRC_u8p;nFhf#S4tpqe+R9G!>@IFO`k3z7=6SU=FUCt5?`KnKcHy&MQSewpuzyX z=59@D9|;_<#o3qc`o3H$c@~aQuFMh}RV+-mp<D^Rzj$8GB(`HWI%cMt8T(${k$xu5 zttH5S{!G^i19gS^DJU+9`y3Bz&^9==s>-?KcsDq$h+svJ3;i%atDLXvCeg9ZUbm3J zLHkIP1g(jIwI_r|BgL<?p7e?^Pa@*j?zE1#^2G;~x~Hp{@t$j8p>yd9c|fYkRa`0D zRT-(vBYj;DRu-YDd-~^Dj7~;SGxZulvPm#X6>mvydcRZDKa1SRh|zS#t%?Gpj@8Ne zzT+-^3sn`oU@3vO58i5S@T>8X1+~c*pkeDbXVBL2C{LiKEtXQG8(NpQXvw4bPT^%u zs!!T@iOH20MjB4RXYMOXa_{EthF1W_ddzE&n%oyoyDgeSS3bK{NAE$SkD4bCz<du# z24=W(%7`$Lf@O-;Ly{4*g_8?JbzTH!q48)E=QZ+XQX;-%X<{1~DwabJc7i7w-xa|3 zU8uv}-`~K)ZJ$6s)X{o)=&YePkZe>-S`6bZEW3va#zk2|+y6-P+2v@Ou~m@9C9Vmt zhWU|AMY-_k03nJw;<cMh8WOWLuF(ieBlaXK*=7A@(3SQT5oz;b*S?f$6@|#5v8a~P zxNV-^Xht|_KyR9@h{8E>URNurq!SeHROh&!GUv&!j}T>-LkCXxTr-!NDA9@~nxWk^ zB1+9PO3j=ByGrKzP_Jw@9Fv+|_S}u#tDm~f4I!C-06&kaWD~g%M&b*A-rx+KUc<vP z48wLJb%Tv=-?(p#M<b+GlWmd<Ww1_3dV4p5a{F=yH7|1>NshN;+pkV_!g=;qa>6bq zI2@8|yzB0vPOQbkO=GnX2+ceEG9;UFYS>bc<z7$1sdT7pR5pX>>Ulh6bJFp`6)|$` zLzUo3eRD|Foa1FbZ=k^5OtXeS30ilFC@DsM?lhUWSB^W})m_B^#?u`Ag~+^23g5(+ z#Rm3wqgHFq*TOU%kFAD%65}Y}7z3bAv|7<0f18jlY#xqYKmxByQ~&_&&%n#W#{u{= z;yTj#TW%qoOtu__rXWfBRN_@FV?6F&N+M$hB0*4|rl9PjsI<nHV1c{Nw3|F4HfMY{ z^8QXe)<!Qi&)#HIjmLqf<SC^?=`2zgcYG%~)RkN^R-sQ6q-*o=greI6QJ6n$Tv$n# zo&%(`sq_goRXM>^aCikm&*)M(lAf?eLTM2+GV{{u0r`>Q5ZcB2f;pl{yPg*~Lt)9R zu?`!9WE4=92(7JVO{vrhrpu(5Rj|>)a}QJs!bfsG(CoS(twJ|<SQp)GL8X07b_VZY zC?;e#I+g80J0_J#dVnLV@@c{C6ANKDBnKT?$;<UmIOsI-8l-Tg8;X9)R<%WXk$v4( z&#@&x)wqu$I`>u8Z8*qEnqRl0&PLz_%iiU>Q4^X7!i2D&v2~l+ej9LH^h5DX2xW|W z*t!1hx3F@F%qG0)Z=~B_A8tyCocj@NmJ7buetTI9sgN}&dg*S3#UJSNeh?&1*ybJ~ z9?rV1=vr;i0;8ii$i3-3e8~85tZoM;h+ffJqMj^5x7kHn<D;#U1C_lt3vp-3)Ik)N z9MThD46Y)!6L7`R9`2(m(=LB%%Hx(W{J~0+5*CU(Tn~(c<+nl{D!+=oGyPuTg>d)v z<;J<M7=Zb2eO=b|Ni|zfhMQ8|9K}`v@cs2TTT5w19L196#v$<CS1#Avr*wPnW5`S; z?xM)@#l9$oi!h;<CTM;{E1nf!cSAxV(T_UMJ4IhbTznJ+7z<V*Y=-!`xVd2DqWJDI zdC(%%*2}&Xo@v^V7_Zl%y0y*HvzeZ|%wZwoS3b#C0gN7?;k58gEX>tX?bnf|57?-t zuB?C=q-zrbCt_IPJhF~KCP&5@@YFISixt5ZuS#qj!B1?cJ|D93qD*!SFAiG1B*O45 z{(e-;FH)4hYRQvzE!Q2r=ufV89~5{VSf=$|CVz$JLPGE1bM3~2>LK6K++EhFZe)G3 z{oR2ebN@PjtGE%a_g6I<-{00Wu})d-+98Seb5a0+@DF<YNWR@|fIts-_MeZRF<o+o zQBs}&Zun_~-6KrzLuARZhrz*2?b0+wi<YLaaLYWFg%U3&zIotC<r<DeGXK-wEV(0w zh$ImxjKP~>KT^R;u3_mEWy6kXPqGYHJ3RVvoa@~+uXkW0hIwkeD0w=!jh6!}4_prq z4d+=y#$RHSm);{Ph`I9X7t@Rnhs4Inu4<Gj?}^)|^h!<JUL9@Q()WUFaGx4iE|d9I zBjPl~a11T=s2_R~4m2UxS1WrE(IzEKBnP%5P5TqDqA!I;%U;!}h{G|fGWBr9NIhu4 zdgcfaii$8W;|xdMKAd34R7D$Q>wezk7<dkzYnJ}p%B9gV&c7P_G@)qIoV4AVXJrT3 zt5;z3c@1(jcti%*Vc1D!h3#{xcdB^7_l##a)w2h}Icrni?GqD8JkCN_pvdWS=7LU0 zF-IB9aH11<v2~47B=H?-+rXI4R7_Z(C2&9<ULS0O-WaF7PvKT!&Gnl8B)grXCQY%8 z@HU7rN!_@Xg8(ZC-2|v0eyhV{_WcRiz#ojm?dYXIZl!*e?OTW2lwG>F=2FO?4DV@2 zH*Zd||ByDHbNI4y`P$DT;ox0hX@eh;m@^OWdog@Fxw1D+BQTki$#(sgGJ3Ggd8*SU z4CtfJ8M-&x1lqN9NIfD^>zlOC*`kbwYg8)jr29dmrVIP?L^*bfrFd!i7PGbDM>pM) zUN*OGpzT~cg?<q5)FBVIrjeM;%hC53%vY{I<;u^(pJSFKBCf-_-{`yuinxemswv!L zGkDB?odrT8JLD_wpHwcH5(rp$GxSo56$n0+;(jv*3o4Fl;s!NIw~0-!K4CC*MHmai zpLQ);CH39YNEX4{!8&;3FZ8*XL&XRtkoTge&{igD$AhF@HR4nCwW61{I#mOm)Yn3} zdwNcbV1W6FZ!@||u8@2sk);MUkA_{|8tsW<aCi|tyvl}wLi|l;qaF6OGAMpPI%-0B z0Yia%fCdNFEx<fJpoY8@6fpTIFo<0`4P!Q^ay)mK9xR!rvceP9q;kXY1RoW8?356; z@0KLwqx>p2qD`PF=Gk{$Dv!!J?e|aBLXTokm-#IxW8H#Sq#;!`>8f5zN{>EDQ;#vq zT#ru5y=ch^f{<Kxcu5n~;CAM%<jOwj!$@{tJEQgC2^AAje?l%qF*G9BaMv+Pju;e@ z^U1%Y31I`Y2AE7DIw-qo+Li0(zxNMMtfM^Z0Ak7q^ijH`jS<0~OohejwnGFt5pT^g zFM28W%A{1k3EfwV?L@x>v!4NN&fwH)4B&$p7Dwc6e?pwz{uaWL6Zb7|V;|Zi-0Ak9 z8?eHKi25-`(iE_R3Jp_Lg*E)|VTB!WnpiazJbayijOq{#zSB2EvTD^7vz*_d=L=*c zf6W}vZD{_peJ`iU#heS|J@W^k{UJvP`xDkJ$MWOl{NF6JsEYl0SJ&faNOoAiCpG{> zLO9C>UdMkl9qi=Pb$3C<CquQ++a#Rn<J^n2P$%urZ6b45%rP5lkIv|gRa!}@+=_7a zfhiYz9gow{Y5J{`Lq|6df}%vVX!+oN#p;D>(PTk5OxCS?qFD4E!6aX$W2~jcVYa(r z?X0p2`!gYntN^?{R$QlfsF{NoYpQsoKxzv<3Z)_Guu(J}CeCha%P_v=2$zrucV!hb zL|jP#{t!E^v+ECWsh{G}R6oVHA>xfKZv4fDjC_9Lfv=AQmE9QfVu?PKN%q=kJNe<h zvmGwFNnM3XQ=CTcJ8_UUa7x6FYq63Is7MB@*{BsPJzpw{8<JXLW2&E|cLH(cM5(uo zg||Nz?omvNpxG`qDUJIqvCf#e+{7+!mR`dY|2~CZ!538%f&@z{kgx~~QlqzYworF- zc5!F7aCQU!*;oEwX&&MXvl9)Jx;Y5LPvIV=2LrO`yJ6lRO8|Ay;rMY+rM`Hg@F67H zGz2=&IeL<VTTxH57{;#??3yQyuAsyi?d@b<V*^b?Q-;dzY7Ixe*e8b##BSyAs^_!9 z@;Hu-Gk;F6A}4S2T+a`Vr%OaqZX~X-@Ic+9oXhoLeAZo1RcHJ)J?>=~8G*AuTzcv@ z-5h4qR>CG3hZhYNS^TpY`RkJwC`!0+be?oV4kpC!2XbdZ_daIws+sz|6-wM>9%_rv zj=HPcknC8l0!%KFBx%0k+;epV63dOIEFLQY>|WgMdq;k)9nubJUF378YelP%U6fvC zhFau$Re5%5PS=||6pBDDX|?ZKuOmu7p0wQ3i^^L|t0Tzdu1Mg~g$N|LsOu6x;iplj zaQLnw0-f1;cZXmj_S+cTST%zv9r6z`q@slRcY`x?arvLUK@9EBD?3red6@$>{1oPj z0`(J#;4vR+P<fsW|JH<gXQEYqaKgTB2{jS51?}Bsk|U4jQjYIte{|X#M$lpR7?4%2 zrjx*2XizqMHFWCMk&0YLoV`6dhR`30&6}kMOTqAP{M`(7I6RF(0gIkDv&`tqNCB<p zCb~`Hl9(q5)9WKstN{^dh`1HSszZAG3)gsuf(XYg_Hgu$B_n*l-Y^9(YsmhMO`8xO zl5Sa6k?S0wSmyx2-aJ>`^$O7Ei~ihN934I<(IP`JTZ!k+=39w7U4N-Qv5R+>+#WLN z`@~8(-luzW4FD2_vQ%qUVsuWLJAT%)XO<+CM<0<VrE1p&p<dKb?OV)aK7C;5u?Asf zBr6BMUx=_c7N|G5s3j;^H(Ve>r7U%gYpgknf2oBMc~7yipWbLq=#7xw>)+<z95L!# z(6(8e)reFPdw1RQfIW4@KYdaWSk!NYck=2Sn6)cgS59S~A+}z7tSLD<O`U(J>|}pt zz+%F4O7aP>JVJARx-#jWS#3=S#PrQ~=9U7oE`Ri^prBbHW&7VB&H2yj{pb0cgF5O; z|5WhLlLY?({&*%rDDt;+1-}CS*<SrSupUyA{r@*xf7SDA&+RWw`;gN|zjWY!1^?R1 z_zOIS@)P{8&c?4Aek~&Zr6CRdw<YCY75tjj|E1t5-XBBwza0Np=&u>iUr;MZ0`%w9 z|CRszs^y<P^e-I%fIc|@@Gp=0EBv23;@{!Jlz)T&xj(8a!9i9R06>O(UO}982F;IO F{||qD{q_I= literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-tests.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-arbovirus-tests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..512d1b64f8fc319a0eb34273d5351b7eb5081db5 GIT binary patch literal 11127 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 literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-chikungunya-test-results.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-chikungunya-test-results.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4dde02058e7a1fe9a4ca71de27e5575fb7d62e79 GIT binary patch literal 8864 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 S7XWw!d%c5&?nhKVKm8x%D0N-{ literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-chikungunya-tests.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-chikungunya-tests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b02db22eef3f4fc3110827fbdc88d465305f02c6 GIT binary patch literal 10618 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 V!9i9R06>QPydl1OoBHR|{{wIYy%_)i literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-codesystem.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-codesystem.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..46bfa87118fb9fbef6fd81b97ad78604de9d65b1 GIT binary patch literal 52542 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Μ~d(X{i9 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 literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-dengue-test-results.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-dengue-test-results.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d09cc453c492e6d8df163586442aa7419f1e13e6 GIT binary patch literal 9240 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 literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-dengue-tests.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-dengue-tests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dbbbf266d0041a7edf99e6c8ed38d8503ae80ddc GIT binary patch literal 13781 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%0DBxtY>UDp@Lpq{ucY@+`JiV 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 S*#&_Rfj=K$?G|Q-T>U?!lj7h2 literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-igm-elisa-results.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-igm-elisa-results.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4ad60e2a2f0eff243ea291e473bec50fc15b8d87 GIT binary patch literal 9133 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 PfqepCew&!~=db?<tP$bk literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-neutralizing-antibody-results.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-neutralizing-antibody-results.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d63ebbcca2467242c074d0e3603a058280ea4723 GIT binary patch literal 9224 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 literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-virus-signs-symptoms.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-virus-signs-symptoms.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..493c316ca92ed3d3a0a1affea6796a78208b826c GIT binary patch literal 9394 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 literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-virus-tests.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/zika-virus-tests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5bde56fdd3cf7c290881eeab8e88159cd5822813 GIT binary patch literal 11160 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%0Aa(ohi)|Bz7adYsO-`>_tS$(9K0w$ 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 literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/~$test.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/~$test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c6e08cd9e97702626cc32b00ee43289e0c98cdb7 GIT binary patch literal 171 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6QXm9G8GIQs8Il=_81fm4fjEt!gh7G9A4sQx X#Z!U2P@qgIP=x};u%~r`M*jl<!H*kd literal 0 HcmV?d00001 diff --git a/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/~$zika-codesystem.xlsx b/hapi-fhir-jpaserver-cqf-ruler/src/test/resources/ca/uhn/fhir/jpa/cqf/ruler/~$zika-codesystem.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c6e08cd9e97702626cc32b00ee43289e0c98cdb7 GIT binary patch literal 171 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6QXm9G8GIQs8Il=_81fm4fjEt!gh7G9A4sQx X#Z!U2P@qgIP=x};u%~r`M*jl<!H*kd literal 0 HcmV?d00001