WHO Immunization Implementation Guide
1.0.0 - release

WHO Immunization Implementation Guide, published by WHO. This guide is not an authorized publication; it is the continuous build for version 1.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/WorldHealthOrganization/smart-immunizations/tree/132/merge and changes regularly. See the Directory of published versions

: IMMZD18SPneumococcal2DosesWithBoosterDoseLogic - JSON Representation

Draft as of 2026-03-31

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "IMMZD18SPneumococcal2DosesWithBoosterDoseLogic",
  "meta" : {
    "profile" : [
      🔗 "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-module"
    ]
  },
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n<div>\n    <table class=\"grid dict\">\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Title: </b></th>\n            <td style=\"padding-left: 4px;\">IMMZD18SPneumococcal2DosesWithBoosterDoseLogic</td>\n        </tr>\n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Id: </b></th>\n            <td style=\"padding-left: 4px;\">IMMZD18SPneumococcal2DosesWithBoosterDoseLogic</td>\n        </tr>\n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Version: </b></th>\n            <td style=\"padding-left: 4px;\">1.0.0</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Url: </b></th>\n            <td style=\"padding-left: 4px;\"><a href=\"Library-IMMZD18SPneumococcal2DosesWithBoosterDoseLogic.html\">IMMZD18SPneumococcal2DosesWithBoosterDoseLogic</a></td>\n        </tr>\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Status: </b></th>\n            <td style=\"padding-left: 4px;\">draft</td>\n        </tr>\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Type: </b></th>\n            <td style=\"padding-left: 4px;\">\n                \n                    \n                        \n                        <p style=\"margin-bottom: 5px;\">\n                            <b>system: </b> <span><a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a></span>\n                        </p>\n                        \n                        \n                        <p style=\"margin-bottom: 5px;\">\n                            <b>code: </b> <span>logic-library</span>\n                        </p>\n                        \n                        \n                    \n                \n                \n            </td>\n        </tr>\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Date: </b></th>\n            <td style=\"padding-left: 4px;\">2026-03-31 13:54:17+0000</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Publisher: </b></th>\n            <td style=\"padding-left: 4px;\">WHO</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Description: </b></th>\n            <td style=\"padding-left: 4px;\"><div><p>This library defines decision support logic for the IMMZ.D18.S.Pneumococcal.2 doses with booster dose schedule table in the Immunization CPG</p>\n</div></td>\n        </tr>\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Related Artifacts: </b></th>\n            <td style=\"padding-left: 4px;\">\n                \n                \n                \n                <p><b>Dependencies</b></p>\n                <ul>\n                  \n                    <li><a href=\"Library-WHOCommon.html\">WHOCommon</a></li>\n                  \n                    <li><a href=\"Library-IMMZCommon.html\">IMMZCommon</a></li>\n                  \n                    <li><a href=\"Library-IMMZConcepts.html\">IMMZConcepts</a></li>\n                  \n                    <li><a href=\"Library-IMMZEncounterElements.html\">IMMZEncounterElements</a></li>\n                  \n                    <li><a href=\"Library-IMMZD2DTPneumococcalEncounterElements.html\">IMMZD2DTPneumococcalEncounterElements</a></li>\n                  \n                </ul>\n                \n                \n                \n                \n                \n            </td>\n        </tr>\n        \n\n        \n        <tr>\n          <th scope=\"row\"><b>Parameters: </b></th>\n          <td style=\"padding-left: 4px;\">\n            <table class=\"grid-dict\">\n              <tr><th><b>Name</b></th><th><b>Type</b></th><th><b>Min</b></th><th><b>Max</b></th><th><b>In/Out</b></th></tr>\n              \n                <tr><th>Today</th><th>date</th><th>0</th><th>1</th><th>In</th></tr>\n              \n                <tr><th>Patient</th><th>Patient</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 1</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 1 Due Date</th><th>date</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 1 Create</th><th>string</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 1 Overdue</th><th>Resource</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 1 Expiration</th><th>Resource</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>First pneumococcal dose from the primary series was administered</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Second pneumococcal dose from the primary series was administered. The primary series has been completed.</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 2</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 2 Due Date</th><th>date</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 2 Create</th><th>string</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 2 Overdue</th><th>Resource</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal dose 2 Expiration</th><th>Resource</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal booster dose was administered</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal booster dose</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal booster dose Due Date</th><th>date</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal booster dose Overdue</th><th>date</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal booster dose Create</th><th>string</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal booster dose Expiration</th><th>Resource</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Second pneumococcal booster dose was administered</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal second booster dose Expiration</th><th>date</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal second booster dose</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal second booster dose Due Date</th><th>date</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal second booster dose Overdue</th><th>date</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Pneumococcal second booster dose Create</th><th>string</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Test Validation</th><th>Resource</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n            </table>\n          </td>\n        </tr>\n        \n\n        \n\n        \n        \n        <tr>\n          <td colspan=\"2\">\n            <table>\n              <tr><th><a id=\"cql-content\"><b>Content: </b></a> text/cql</th></tr>\n              <tr><td><pre><code class=\"language-cql\">/*\n * Library: IMMZD18SPneumococcal2DosesWithBoosterDoseLogic (IMMZ.D18.S.Pneumococcal.2 doses with booster dose schedule)\n * Schedule Table: 2 primary doses with a booster dose (2p+1) schedule\n */\nlibrary IMMZD18SPneumococcal2DosesWithBoosterDoseLogic\n\nusing FHIR version '4.0.1'\ninclude FHIRHelpers version '4.0.1'\n\ninclude WHOCommon called WC\n\ninclude IMMZCommon called Common\ninclude IMMZConcepts called Concepts\n\ninclude IMMZEncounterElements called IE\ninclude IMMZD2DTPneumococcalEncounterElements called Encounter\n\nparameter Today Date default Today()\n\n\ncontext Patient\n\n\n/*\n@output: Pneumococcal dose 1\n@description: Provision of the pneumococcal dose 1\n@trigger: Child's birth\n@pseudo: \n@triggerDate: &quot;Date of birth&quot;\n*/\ndefine &quot;Pneumococcal dose 1&quot;:\n  Encounter.&quot;The client's age is less than or equal to 5 years&quot;\n  and Encounter.&quot;No pneumococcal primary series doses were administered&quot;\n\n\n/*\n@output: Pneumococcal dose 1 Create\n@create: Pneumococcal dose 1 should be provided if the client is older than 6 weeks\n*/\ndefine &quot;Pneumococcal dose 1 Create&quot;:\n  if &quot;Pneumococcal dose 1&quot;\n  then 'Pneumococcal dose 1 should be provided if the client is older than 6 weeks' + '\nDue Date: ' + ToString(&quot;Pneumococcal dose 1 Due Date&quot;)\n  else ''\n\n\n/*\n@dynamicValue: Pneumococcal dose 1 Due Date\n@pseudocode: &quot;Date of birth&quot; + 6 weeks\n*/\ndefine &quot;Pneumococcal dose 1 Due Date&quot;:\n  if &quot;Pneumococcal dose 1&quot; then Patient.birthDate + 6 weeks\n  else null\n\n\n/*\n@dynamicValue: Pneumococcal dose 1 Overdue\n@pseudocode: To be determined by Member States; however, there is no recommended overdue date. WHO does not currently have recommendations on the use of pneumococcal vaccine in individuals aged over 5 years.\n*/\ndefine &quot;Pneumococcal dose 1 Overdue&quot;:\n  null\n\n\n/*\n@dynamicValue: Pneumococcal dose 1 Expiration\n@pseudocode: To be determined by Member States; however, there is no recommended expiration date. WHO does not currently have recommendations on the use of pneumococcal vaccine in individuals aged over 5 years.\n*/\ndefine &quot;Pneumococcal dose 1 Expiration&quot;:\n  null\n\n  \n/*\n@complete: First pneumococcal dose from the primary series was administered\n@pseudocode: Count of vaccines administered (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot; and &quot;Type of dose&quot; = &quot;Primary series&quot;) = 1\n*/\ndefine &quot;First pneumococcal dose from the primary series was administered&quot;:\n  Encounter.&quot;One pneumococcal primary series dose was administered&quot;\n\n\n\n/*\n@output: Pneumococcal dose 2\n@description: Provision of the pneumococcal dose 2\n@trigger: First pneumococcal dose from the primary series was administered to the client, who is less than or equal to 5 years of age, either within 24 months of birth or if client is at high risk for pneumococcal infection\n@pseudo: Today's date − &quot;Date of birth&quot; ≤ 5 years AND Count of vaccines administered (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot; and &quot;Type of dose&quot; = &quot;Primary series&quot;) = 1 AND (&quot;Date and time of vaccination&quot; (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot;) − &quot;Date of birth&quot; &lt; 24 months OR &quot;At high risk for pneumococcal infection&quot; = TRUE\n@triggerDate: Date and time of vaccination&quot; (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot;)\n*/\ndefine &quot;Pneumococcal dose 2&quot;:\n  &quot;First pneumococcal dose from the primary series was administered&quot;\n  and Encounter.&quot;The client's age is less than or equal to 5 years&quot;\n  and (\n    Encounter.&quot;The first pneumococcal dose was administered within 24 months post birth&quot;\n    or Encounter.&quot;Client is at high risk for pneumococcal infection&quot;\n  )\n  and not &quot;Second pneumococcal dose from the primary series was administered. The primary series has been completed.&quot;\n\n\n/*\n@output: Pneumococcal dose 2 Create\n@create: Pneumococcal dose 2 should be provided if the client was given the previous dose more than 8 weeks ago\n*/\ndefine &quot;Pneumococcal dose 2 Create&quot;:\n  if &quot;Pneumococcal dose 2&quot;\n  then 'Pneumococcal dose 2 should be provided if the client was given the previous dose more than 8 weeks ago' + '\nDue Date: ' + ToString(&quot;Pneumococcal dose 2 Due Date&quot;)\n  else ''\n\n\n/*\n@dynamicValue: Pneumococcal dose 2 Due Date\n@pseudocode: &quot;Date and time of vaccination&quot; (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot;) + 8 weeks\n*/\ndefine &quot;Pneumococcal dose 2 Due Date&quot;:\n  if &quot;Pneumococcal dose 2&quot; then Encounter.&quot;Date of Latest Pneumococcal Dose&quot; + 8 weeks\n  else null\n\n\n/*\n@dynamicValue: Pneumococcal dose 2 Overdue\n@pseudocode: To be determined by Member States; however, there is no recommended overdue date. WHO does not currently have recommendations on the use of pneumococcal vaccine in individuals aged over 5 years.\n*/\ndefine &quot;Pneumococcal dose 2 Overdue&quot;:\n  null\n\n\n/*\n@dynamicValue: Pneumococcal dose 2 Expiration\n@pseudocode: To be determined by Member States; however, there is no recommended expiration date. WHO does not currently have recommendations on the use of pneumococcal vaccine in individuals aged over 5 years.\n*/\ndefine &quot;Pneumococcal dose 2 Expiration&quot;:\n  null\n\n  \n/*\n@complete: Second pneumococcal dose from the primary series was administered. The primary series has been completed.\n@pseudocode: &quot;Completed the primary vaccination series&quot; = TRUE (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot;)&quot;\n*/\ndefine &quot;Second pneumococcal dose from the primary series was administered. The primary series has been completed.&quot;:\n  Encounter.&quot;Two pneumococcal primary series doses were administered&quot;\n\n\n\n/*\n@output: Pneumococcal booster dose\n@description: Provision of the pneumococcal booster dose\n@trigger: Second pneumococcal dose from the primary series was administered and first pneumococcal dose was administered within 12 months post birth\n@pseudo: Child's birth AND Count of vaccines administered (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot; and &quot;Type of dose&quot; = &quot;Primary series&quot;) = 2 AND (&quot;Date and time of vaccination&quot; (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot; AND &quot;Dose number&quot; = 1) − &quot;Date of birth&quot; &lt; 12 months\n@triggerDate: &quot;Date of birth&quot;\n*/\ndefine &quot;Pneumococcal booster dose&quot;:\n  &quot;Second pneumococcal dose from the primary series was administered. The primary series has been completed.&quot;\n  and Encounter.&quot;The first pneumococcal dose was administered within 12 months post birth&quot;\n  and not &quot;Pneumococcal booster dose was administered&quot;\n\n\n/*\n@output: Pneumococcal booster dose Create\n@create: Pneumococcal booster dose should be provided if the client has received the 2 previous doses\n*/\ndefine &quot;Pneumococcal booster dose Create&quot;:\n  if &quot;Pneumococcal booster dose&quot;\n  then 'Pneumococcal booster dose should be provided if the client has received the 2 previous doses' + '\nDue Date: ' + ToString(&quot;Pneumococcal booster dose Due Date&quot;) + '\nOverdue: ' + ToString(&quot;Pneumococcal booster dose Overdue&quot;)\n  else ''\n\n\n/*\n@dynamicValue: Pneumococcal booster dose Due Date\n@pseudocode: &quot;Date of birth&quot; + 9 months\n*/\ndefine &quot;Pneumococcal booster dose Due Date&quot;:\n  if &quot;Pneumococcal booster dose&quot; then Patient.birthDate + 9 months\n  else null\n\n\n/*\n@dynamicValue: Pneumococcal booster dose Overdue\n@pseudocode: &quot;Date of birth&quot; + 18 months\n*/\ndefine &quot;Pneumococcal booster dose Overdue&quot;:\n  if &quot;Pneumococcal booster dose&quot; then Patient.birthDate + 18 months\n  else null\n\n\n/*\n@dynamicValue: Pneumococcal booster dose Expiration\n@pseudocode: To be determined by Member States; however, there is no recommended expiration date. WHO does not currently have recommendations on the use of pneumococcal vaccine in individuals aged over 5 years.\n*/\ndefine &quot;Pneumococcal booster dose Expiration&quot;:\n  null\n\n  \n/*\n@complete: Pneumococcal booster dose was administered\n@pseudocode: Count of vaccines administered (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot; and &quot;Type of dose&quot; = &quot;Booster dose&quot;) = 1\n*/\ndefine &quot;Pneumococcal booster dose was administered&quot;:\n  Encounter.&quot;One pneumococcal booster dose was administered&quot;\n\n\n\n/*\n@output: Pneumococcal second booster dose\n@description: Provision of another booster dose for HIV-positive infants and preterm neonates\n@trigger: The primary series has been completed and one booster dose was administered to the client, who is more than 12 months of age. The latest pneumococcal dose was administered within 12 months post birth. Client is either HIV positive or had a preterm birth\n@pseudo: 'Today's date − &quot;Date of birth&quot; &gt; 12 months AND &quot;Completed the primary vaccination series&quot; = TRUE (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot;) AND Count of vaccines administered (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot; and &quot;Type of dose&quot; = &quot;Booster dose&quot;) = 1 AND Latest &quot;Date and time of vaccination&quot; (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot;) − &quot;Date of birth&quot; &lt; 12 months AND (&quot;HIV status&quot; = &quot;HIV-positive&quot; OR &quot;Preterm birth&quot; = TRUE)\n@triggerDate: &quot;Date of birth&quot;\n*/\ndefine &quot;Pneumococcal second booster dose&quot;:\n  &quot;Pneumococcal booster dose was administered&quot;\n  and Encounter.&quot;The latest pneumococcal dose was administered within 12 months post birth&quot;\n  and Encounter.&quot;The client's age is less than 24 months&quot;\n  and (\n    Encounter.&quot;Client's HIV status is positive&quot;\n    or Encounter.&quot;Client had preterm birth&quot;\n  )\n  and not &quot;Second pneumococcal booster dose was administered&quot;\n  and &quot;Pneumococcal second booster dose Expiration&quot; after day of Today\n\n\n/*\n@output: Pneumococcal second booster dose Create\n@create: HIV-positive infants and preterm neonates who have received their 3 primary vaccine doses before 12 months of age may benefit from a booster dose in the second year of life\n*/\ndefine &quot;Pneumococcal second booster dose Create&quot;:\n  if &quot;Pneumococcal second booster dose&quot;\n  then 'HIV-positive infants and preterm neonates who have received their 3 primary vaccine doses before 12 months of age may benefit from a booster dose in the second year of life' + '\nDue Date: ' + ToString(&quot;Pneumococcal second booster dose Due Date&quot;) + '\nOverdue: ' + ToString(&quot;Pneumococcal second booster dose Overdue&quot;) + '\nExpiration: ' + ToString(&quot;Pneumococcal second booster dose Expiration&quot;)\n  else ''\n\n\n/*\n@dynamicValue: Pneumococcal second booster dose Due Date\n@pseudocode: &quot;Date of birth&quot; + 12 months\n*/\ndefine &quot;Pneumococcal second booster dose Due Date&quot;:\n  if &quot;Pneumococcal second booster dose&quot; then Patient.birthDate + 12 months\n  else null\n\n\n/*\n@dynamicValue: Pneumococcal second booster dose Overdue\n@pseudocode: &quot;Date of birth&quot; + 24 months\n*/\ndefine &quot;Pneumococcal second booster dose Overdue&quot;:\n  if &quot;Pneumococcal second booster dose&quot; then Patient.birthDate + 24 months\n  else null\n\n\n/*\n@dynamicValue: Pneumococcal second booster dose Expiration\n@pseudocode: &quot;Date of birth&quot; + 24 months\n*/\ndefine &quot;Pneumococcal second booster dose Expiration&quot;:\n  Patient.birthDate + 24 months\n\n  \n/*\n@complete: Second pneumococcal booster dose was administered\n@pseudocode: Count of vaccines administered (where &quot;Vaccine type&quot; = &quot;Pneumococcal vaccines&quot; and &quot;Type of dose&quot; = &quot;Booster dose&quot;) = 2\n*/\ndefine &quot;Second pneumococcal booster dose was administered&quot;:\n  Encounter.&quot;Two pneumococcal booster doses were administered&quot;\n\n\n\n/*\n@test: Test expected results based on example patients\n*/\ndefine &quot;Test Validation&quot;:\n  case\n    when Patient.id = 'Pneumococcal08.1' then &quot;Pneumococcal dose 1&quot;\n    when Patient.id = 'Pneumococcal09.2' then &quot;Pneumococcal dose 1&quot;\n    when Patient.id = 'Pneumococcal10.4' then &quot;Pneumococcal dose 2&quot;\n    when Patient.id = 'Pneumococcal11.4' then &quot;Pneumococcal dose 2&quot;\n    when Patient.id = 'Pneumococcal12.5' then &quot;Pneumococcal dose 2&quot;\n    when Patient.id = 'Pneumococcal13.5' then &quot;Pneumococcal dose 2&quot;\n    when Patient.id = 'Pneumococcal14.4' then &quot;First pneumococcal dose from the primary series was administered&quot;\n      and not &quot;Pneumococcal dose 2&quot;\n    when Patient.id = 'Pneumococcal15.4' then &quot;Pneumococcal booster dose&quot;\n    when Patient.id = 'Pneumococcal16.4' then &quot;Second pneumococcal dose from the primary series was administered. The primary series has been completed.&quot;\n      and not &quot;Pneumococcal booster dose&quot;\n    when Patient.id = 'Pneumococcal17.4' then &quot;Pneumococcal second booster dose&quot;\n    when Patient.id = 'Pneumococcal18.4' then &quot;Pneumococcal second booster dose&quot;\n    when Patient.id = 'Pneumococcal19.5' then &quot;Pneumococcal second booster dose&quot;\n    when Patient.id = 'Pneumococcal20.5' then &quot;Pneumococcal second booster dose&quot;\n    when Patient.id = 'Pneumococcal21.4' then &quot;Second pneumococcal dose from the primary series was administered. The primary series has been completed.&quot;\n      and not &quot;Pneumococcal second booster dose&quot;\n    when Patient.id = 'Pneumococcal22.4' then &quot;Second pneumococcal dose from the primary series was administered. The primary series has been completed.&quot;\n      and not &quot;Pneumococcal second booster dose&quot;\n    when Patient.id = 'Pneumococcal23.3' then &quot;Second pneumococcal dose from the primary series was administered. The primary series has been completed.&quot;\n      and not &quot;Pneumococcal second booster dose&quot;\n    when Patient.id = 'Pneumococcal24.2' then &quot;Second pneumococcal booster dose was administered&quot;\n    when Patient.id = 'Pneumococcal25.1' then not &quot;Pneumococcal dose 1&quot;\n    else 'No test case set'\n  end\n</code></pre></td></tr>\n            </table>\n          </td>\n        </tr>\n        \n        \n        \n    </table>\n</div>\n</div>"
  },
  "extension" : [
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-knowledgeCapability",
      "valueCode" : "computable"
    }
  ],
  "url" : "http://smart.who.int/immunizations/Library/IMMZD18SPneumococcal2DosesWithBoosterDoseLogic",
  "version" : "1.0.0",
  "name" : "IMMZD18SPneumococcal2DosesWithBoosterDoseLogic",
  "title" : "IMMZD18SPneumococcal2DosesWithBoosterDoseLogic",
  "status" : "draft",
  "experimental" : false,
  "type" : {
    "coding" : [
      {
        "system" : "http://terminology.hl7.org/CodeSystem/library-type",
        "code" : "logic-library"
      }
    ]
  },
  "date" : "2026-03-31T13:54:17+00:00",
  "publisher" : "WHO",
  "contact" : [
    {
      "name" : "WHO",
      "telecom" : [
        {
          "system" : "url",
          "value" : "http://who.int"
        }
      ]
    }
  ],
  "description" : "This library defines decision support logic for the IMMZ.D18.S.Pneumococcal.2 doses with booster dose schedule table in the Immunization CPG",
  "relatedArtifact" : [
    {
      "type" : "depends-on",
      "display" : "Library WC",
      "resource" : "http://smart.who.int/immunizations/Library/WHOCommon"
    },
    {
      "type" : "depends-on",
      "display" : "Library Common",
      "resource" : "http://smart.who.int/immunizations/Library/IMMZCommon"
    },
    {
      "type" : "depends-on",
      "display" : "Library Concepts",
      "resource" : "http://smart.who.int/immunizations/Library/IMMZConcepts"
    },
    {
      "type" : "depends-on",
      "display" : "Library IE",
      "resource" : "http://smart.who.int/immunizations/Library/IMMZEncounterElements"
    },
    {
      "type" : "depends-on",
      "display" : "Library Encounter",
      "resource" : "http://smart.who.int/immunizations/Library/IMMZD2DTPneumococcalEncounterElements"
    }
  ],
  "parameter" : [
    {
      "name" : "Today",
      "use" : "in",
      "min" : 0,
      "max" : "1",
      "type" : "date"
    },
    {
      "name" : "Patient",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "Patient"
    },
    {
      "name" : "Pneumococcal dose 1",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "boolean"
    },
    {
      "name" : "Pneumococcal dose 1 Due Date",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "date"
    },
    {
      "name" : "Pneumococcal dose 1 Create",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "string"
    },
    {
      "name" : "Pneumococcal dose 1 Overdue",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "Resource"
    },
    {
      "name" : "Pneumococcal dose 1 Expiration",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "Resource"
    },
    {
      "name" : "First pneumococcal dose from the primary series was administered",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "boolean"
    },
    {
      "name" : "Second pneumococcal dose from the primary series was administered. The primary series has been completed.",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "boolean"
    },
    {
      "name" : "Pneumococcal dose 2",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "boolean"
    },
    {
      "name" : "Pneumococcal dose 2 Due Date",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "date"
    },
    {
      "name" : "Pneumococcal dose 2 Create",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "string"
    },
    {
      "name" : "Pneumococcal dose 2 Overdue",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "Resource"
    },
    {
      "name" : "Pneumococcal dose 2 Expiration",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "Resource"
    },
    {
      "name" : "Pneumococcal booster dose was administered",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "boolean"
    },
    {
      "name" : "Pneumococcal booster dose",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "boolean"
    },
    {
      "name" : "Pneumococcal booster dose Due Date",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "date"
    },
    {
      "name" : "Pneumococcal booster dose Overdue",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "date"
    },
    {
      "name" : "Pneumococcal booster dose Create",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "string"
    },
    {
      "name" : "Pneumococcal booster dose Expiration",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "Resource"
    },
    {
      "name" : "Second pneumococcal booster dose was administered",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "boolean"
    },
    {
      "name" : "Pneumococcal second booster dose Expiration",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "date"
    },
    {
      "name" : "Pneumococcal second booster dose",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "boolean"
    },
    {
      "name" : "Pneumococcal second booster dose Due Date",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "date"
    },
    {
      "name" : "Pneumococcal second booster dose Overdue",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "date"
    },
    {
      "name" : "Pneumococcal second booster dose Create",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "string"
    },
    {
      "name" : "Test Validation",
      "use" : "out",
      "min" : 0,
      "max" : "1",
      "type" : "Resource"
    }
  ],
  "content" : [
    {
      "contentType" : "text/cql",
      "data" : "LyoKICogTGlicmFyeTogSU1NWkQxOFNQbmV1bW9jb2NjYWwyRG9zZXNXaXRoQm9vc3RlckRvc2VMb2dpYyAoSU1NWi5EMTguUy5QbmV1bW9jb2NjYWwuMiBkb3NlcyB3aXRoIGJvb3N0ZXIgZG9zZSBzY2hlZHVsZSkKICogU2NoZWR1bGUgVGFibGU6IDIgcHJpbWFyeSBkb3NlcyB3aXRoIGEgYm9vc3RlciBkb3NlICgycCsxKSBzY2hlZHVsZQogKi8KbGlicmFyeSBJTU1aRDE4U1BuZXVtb2NvY2NhbDJEb3Nlc1dpdGhCb29zdGVyRG9zZUxvZ2ljCgp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwppbmNsdWRlIEZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBXSE9Db21tb24gY2FsbGVkIFdDCgppbmNsdWRlIElNTVpDb21tb24gY2FsbGVkIENvbW1vbgppbmNsdWRlIElNTVpDb25jZXB0cyBjYWxsZWQgQ29uY2VwdHMKCmluY2x1ZGUgSU1NWkVuY291bnRlckVsZW1lbnRzIGNhbGxlZCBJRQppbmNsdWRlIElNTVpEMkRUUG5ldW1vY29jY2FsRW5jb3VudGVyRWxlbWVudHMgY2FsbGVkIEVuY291bnRlcgoKcGFyYW1ldGVyIFRvZGF5IERhdGUgZGVmYXVsdCBUb2RheSgpCgoKY29udGV4dCBQYXRpZW50CgoKLyoKQG91dHB1dDogUG5ldW1vY29jY2FsIGRvc2UgMQpAZGVzY3JpcHRpb246IFByb3Zpc2lvbiBvZiB0aGUgcG5ldW1vY29jY2FsIGRvc2UgMQpAdHJpZ2dlcjogQ2hpbGQncyBiaXJ0aApAcHNldWRvOiAKQHRyaWdnZXJEYXRlOiAiRGF0ZSBvZiBiaXJ0aCIKKi8KZGVmaW5lICJQbmV1bW9jb2NjYWwgZG9zZSAxIjoKICBFbmNvdW50ZXIuIlRoZSBjbGllbnQncyBhZ2UgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDUgeWVhcnMiCiAgYW5kIEVuY291bnRlci4iTm8gcG5ldW1vY29jY2FsIHByaW1hcnkgc2VyaWVzIGRvc2VzIHdlcmUgYWRtaW5pc3RlcmVkIgoKCi8qCkBvdXRwdXQ6IFBuZXVtb2NvY2NhbCBkb3NlIDEgQ3JlYXRlCkBjcmVhdGU6IFBuZXVtb2NvY2NhbCBkb3NlIDEgc2hvdWxkIGJlIHByb3ZpZGVkIGlmIHRoZSBjbGllbnQgaXMgb2xkZXIgdGhhbiA2IHdlZWtzCiovCmRlZmluZSAiUG5ldW1vY29jY2FsIGRvc2UgMSBDcmVhdGUiOgogIGlmICJQbmV1bW9jb2NjYWwgZG9zZSAxIgogIHRoZW4gJ1BuZXVtb2NvY2NhbCBkb3NlIDEgc2hvdWxkIGJlIHByb3ZpZGVkIGlmIHRoZSBjbGllbnQgaXMgb2xkZXIgdGhhbiA2IHdlZWtzJyArICcKRHVlIERhdGU6ICcgKyBUb1N0cmluZygiUG5ldW1vY29jY2FsIGRvc2UgMSBEdWUgRGF0ZSIpCiAgZWxzZSAnJwoKCi8qCkBkeW5hbWljVmFsdWU6IFBuZXVtb2NvY2NhbCBkb3NlIDEgRHVlIERhdGUKQHBzZXVkb2NvZGU6ICJEYXRlIG9mIGJpcnRoIiArIDYgd2Vla3MKKi8KZGVmaW5lICJQbmV1bW9jb2NjYWwgZG9zZSAxIER1ZSBEYXRlIjoKICBpZiAiUG5ldW1vY29jY2FsIGRvc2UgMSIgdGhlbiBQYXRpZW50LmJpcnRoRGF0ZSArIDYgd2Vla3MKICBlbHNlIG51bGwKCgovKgpAZHluYW1pY1ZhbHVlOiBQbmV1bW9jb2NjYWwgZG9zZSAxIE92ZXJkdWUKQHBzZXVkb2NvZGU6IFRvIGJlIGRldGVybWluZWQgYnkgTWVtYmVyIFN0YXRlczsgaG93ZXZlciwgdGhlcmUgaXMgbm8gcmVjb21tZW5kZWQgb3ZlcmR1ZSBkYXRlLiBXSE8gZG9lcyBub3QgY3VycmVudGx5IGhhdmUgcmVjb21tZW5kYXRpb25zIG9uIHRoZSB1c2Ugb2YgcG5ldW1vY29jY2FsIHZhY2NpbmUgaW4gaW5kaXZpZHVhbHMgYWdlZCBvdmVyIDUgeWVhcnMuCiovCmRlZmluZSAiUG5ldW1vY29jY2FsIGRvc2UgMSBPdmVyZHVlIjoKICBudWxsCgoKLyoKQGR5bmFtaWNWYWx1ZTogUG5ldW1vY29jY2FsIGRvc2UgMSBFeHBpcmF0aW9uCkBwc2V1ZG9jb2RlOiBUbyBiZSBkZXRlcm1pbmVkIGJ5IE1lbWJlciBTdGF0ZXM7IGhvd2V2ZXIsIHRoZXJlIGlzIG5vIHJlY29tbWVuZGVkIGV4cGlyYXRpb24gZGF0ZS4gV0hPIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIHJlY29tbWVuZGF0aW9ucyBvbiB0aGUgdXNlIG9mIHBuZXVtb2NvY2NhbCB2YWNjaW5lIGluIGluZGl2aWR1YWxzIGFnZWQgb3ZlciA1IHllYXJzLgoqLwpkZWZpbmUgIlBuZXVtb2NvY2NhbCBkb3NlIDEgRXhwaXJhdGlvbiI6CiAgbnVsbAoKICAKLyoKQGNvbXBsZXRlOiBGaXJzdCBwbmV1bW9jb2NjYWwgZG9zZSBmcm9tIHRoZSBwcmltYXJ5IHNlcmllcyB3YXMgYWRtaW5pc3RlcmVkCkBwc2V1ZG9jb2RlOiBDb3VudCBvZiB2YWNjaW5lcyBhZG1pbmlzdGVyZWQgKHdoZXJlICJWYWNjaW5lIHR5cGUiID0gIlBuZXVtb2NvY2NhbCB2YWNjaW5lcyIgYW5kICJUeXBlIG9mIGRvc2UiID0gIlByaW1hcnkgc2VyaWVzIikgPSAxCiovCmRlZmluZSAiRmlyc3QgcG5ldW1vY29jY2FsIGRvc2UgZnJvbSB0aGUgcHJpbWFyeSBzZXJpZXMgd2FzIGFkbWluaXN0ZXJlZCI6CiAgRW5jb3VudGVyLiJPbmUgcG5ldW1vY29jY2FsIHByaW1hcnkgc2VyaWVzIGRvc2Ugd2FzIGFkbWluaXN0ZXJlZCIKCgoKLyoKQG91dHB1dDogUG5ldW1vY29jY2FsIGRvc2UgMgpAZGVzY3JpcHRpb246IFByb3Zpc2lvbiBvZiB0aGUgcG5ldW1vY29jY2FsIGRvc2UgMgpAdHJpZ2dlcjogRmlyc3QgcG5ldW1vY29jY2FsIGRvc2UgZnJvbSB0aGUgcHJpbWFyeSBzZXJpZXMgd2FzIGFkbWluaXN0ZXJlZCB0byB0aGUgY2xpZW50LCB3aG8gaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDUgeWVhcnMgb2YgYWdlLCBlaXRoZXIgd2l0aGluIDI0IG1vbnRocyBvZiBiaXJ0aCBvciBpZiBjbGllbnQgaXMgYXQgaGlnaCByaXNrIGZvciBwbmV1bW9jb2NjYWwgaW5mZWN0aW9uCkBwc2V1ZG86IFRvZGF5J3MgZGF0ZSDiiJIgIkRhdGUgb2YgYmlydGgiIOKJpCA1IHllYXJzIEFORCBDb3VudCBvZiB2YWNjaW5lcyBhZG1pbmlzdGVyZWQgKHdoZXJlICJWYWNjaW5lIHR5cGUiID0gIlBuZXVtb2NvY2NhbCB2YWNjaW5lcyIgYW5kICJUeXBlIG9mIGRvc2UiID0gIlByaW1hcnkgc2VyaWVzIikgPSAxIEFORCAoIkRhdGUgYW5kIHRpbWUgb2YgdmFjY2luYXRpb24iICh3aGVyZSAiVmFjY2luZSB0eXBlIiA9ICJQbmV1bW9jb2NjYWwgdmFjY2luZXMiKSDiiJIgIkRhdGUgb2YgYmlydGgiIDwgMjQgbW9udGhzIE9SICJBdCBoaWdoIHJpc2sgZm9yIHBuZXVtb2NvY2NhbCBpbmZlY3Rpb24iID0gVFJVRQpAdHJpZ2dlckRhdGU6IERhdGUgYW5kIHRpbWUgb2YgdmFjY2luYXRpb24iICh3aGVyZSAiVmFjY2luZSB0eXBlIiA9ICJQbmV1bW9jb2NjYWwgdmFjY2luZXMiKQoqLwpkZWZpbmUgIlBuZXVtb2NvY2NhbCBkb3NlIDIiOgogICJGaXJzdCBwbmV1bW9jb2NjYWwgZG9zZSBmcm9tIHRoZSBwcmltYXJ5IHNlcmllcyB3YXMgYWRtaW5pc3RlcmVkIgogIGFuZCBFbmNvdW50ZXIuIlRoZSBjbGllbnQncyBhZ2UgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDUgeWVhcnMiCiAgYW5kICgKICAgIEVuY291bnRlci4iVGhlIGZpcnN0IHBuZXVtb2NvY2NhbCBkb3NlIHdhcyBhZG1pbmlzdGVyZWQgd2l0aGluIDI0IG1vbnRocyBwb3N0IGJpcnRoIgogICAgb3IgRW5jb3VudGVyLiJDbGllbnQgaXMgYXQgaGlnaCByaXNrIGZvciBwbmV1bW9jb2NjYWwgaW5mZWN0aW9uIgogICkKICBhbmQgbm90ICJTZWNvbmQgcG5ldW1vY29jY2FsIGRvc2UgZnJvbSB0aGUgcHJpbWFyeSBzZXJpZXMgd2FzIGFkbWluaXN0ZXJlZC4gVGhlIHByaW1hcnkgc2VyaWVzIGhhcyBiZWVuIGNvbXBsZXRlZC4iCgoKLyoKQG91dHB1dDogUG5ldW1vY29jY2FsIGRvc2UgMiBDcmVhdGUKQGNyZWF0ZTogUG5ldW1vY29jY2FsIGRvc2UgMiBzaG91bGQgYmUgcHJvdmlkZWQgaWYgdGhlIGNsaWVudCB3YXMgZ2l2ZW4gdGhlIHByZXZpb3VzIGRvc2UgbW9yZSB0aGFuIDggd2Vla3MgYWdvCiovCmRlZmluZSAiUG5ldW1vY29jY2FsIGRvc2UgMiBDcmVhdGUiOgogIGlmICJQbmV1bW9jb2NjYWwgZG9zZSAyIgogIHRoZW4gJ1BuZXVtb2NvY2NhbCBkb3NlIDIgc2hvdWxkIGJlIHByb3ZpZGVkIGlmIHRoZSBjbGllbnQgd2FzIGdpdmVuIHRoZSBwcmV2aW91cyBkb3NlIG1vcmUgdGhhbiA4IHdlZWtzIGFnbycgKyAnCkR1ZSBEYXRlOiAnICsgVG9TdHJpbmcoIlBuZXVtb2NvY2NhbCBkb3NlIDIgRHVlIERhdGUiKQogIGVsc2UgJycKCgovKgpAZHluYW1pY1ZhbHVlOiBQbmV1bW9jb2NjYWwgZG9zZSAyIER1ZSBEYXRlCkBwc2V1ZG9jb2RlOiAiRGF0ZSBhbmQgdGltZSBvZiB2YWNjaW5hdGlvbiIgKHdoZXJlICJWYWNjaW5lIHR5cGUiID0gIlBuZXVtb2NvY2NhbCB2YWNjaW5lcyIpICsgOCB3ZWVrcwoqLwpkZWZpbmUgIlBuZXVtb2NvY2NhbCBkb3NlIDIgRHVlIERhdGUiOgogIGlmICJQbmV1bW9jb2NjYWwgZG9zZSAyIiB0aGVuIEVuY291bnRlci4iRGF0ZSBvZiBMYXRlc3QgUG5ldW1vY29jY2FsIERvc2UiICsgOCB3ZWVrcwogIGVsc2UgbnVsbAoKCi8qCkBkeW5hbWljVmFsdWU6IFBuZXVtb2NvY2NhbCBkb3NlIDIgT3ZlcmR1ZQpAcHNldWRvY29kZTogVG8gYmUgZGV0ZXJtaW5lZCBieSBNZW1iZXIgU3RhdGVzOyBob3dldmVyLCB0aGVyZSBpcyBubyByZWNvbW1lbmRlZCBvdmVyZHVlIGRhdGUuIFdITyBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSByZWNvbW1lbmRhdGlvbnMgb24gdGhlIHVzZSBvZiBwbmV1bW9jb2NjYWwgdmFjY2luZSBpbiBpbmRpdmlkdWFscyBhZ2VkIG92ZXIgNSB5ZWFycy4KKi8KZGVmaW5lICJQbmV1bW9jb2NjYWwgZG9zZSAyIE92ZXJkdWUiOgogIG51bGwKCgovKgpAZHluYW1pY1ZhbHVlOiBQbmV1bW9jb2NjYWwgZG9zZSAyIEV4cGlyYXRpb24KQHBzZXVkb2NvZGU6IFRvIGJlIGRldGVybWluZWQgYnkgTWVtYmVyIFN0YXRlczsgaG93ZXZlciwgdGhlcmUgaXMgbm8gcmVjb21tZW5kZWQgZXhwaXJhdGlvbiBkYXRlLiBXSE8gZG9lcyBub3QgY3VycmVudGx5IGhhdmUgcmVjb21tZW5kYXRpb25zIG9uIHRoZSB1c2Ugb2YgcG5ldW1vY29jY2FsIHZhY2NpbmUgaW4gaW5kaXZpZHVhbHMgYWdlZCBvdmVyIDUgeWVhcnMuCiovCmRlZmluZSAiUG5ldW1vY29jY2FsIGRvc2UgMiBFeHBpcmF0aW9uIjoKICBudWxsCgogIAovKgpAY29tcGxldGU6IFNlY29uZCBwbmV1bW9jb2NjYWwgZG9zZSBmcm9tIHRoZSBwcmltYXJ5IHNlcmllcyB3YXMgYWRtaW5pc3RlcmVkLiBUaGUgcHJpbWFyeSBzZXJpZXMgaGFzIGJlZW4gY29tcGxldGVkLgpAcHNldWRvY29kZTogIkNvbXBsZXRlZCB0aGUgcHJpbWFyeSB2YWNjaW5hdGlvbiBzZXJpZXMiID0gVFJVRSAod2hlcmUgIlZhY2NpbmUgdHlwZSIgPSAiUG5ldW1vY29jY2FsIHZhY2NpbmVzIikiCiovCmRlZmluZSAiU2Vjb25kIHBuZXVtb2NvY2NhbCBkb3NlIGZyb20gdGhlIHByaW1hcnkgc2VyaWVzIHdhcyBhZG1pbmlzdGVyZWQuIFRoZSBwcmltYXJ5IHNlcmllcyBoYXMgYmVlbiBjb21wbGV0ZWQuIjoKICBFbmNvdW50ZXIuIlR3byBwbmV1bW9jb2NjYWwgcHJpbWFyeSBzZXJpZXMgZG9zZXMgd2VyZSBhZG1pbmlzdGVyZWQiCgoKCi8qCkBvdXRwdXQ6IFBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2UKQGRlc2NyaXB0aW9uOiBQcm92aXNpb24gb2YgdGhlIHBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2UKQHRyaWdnZXI6IFNlY29uZCBwbmV1bW9jb2NjYWwgZG9zZSBmcm9tIHRoZSBwcmltYXJ5IHNlcmllcyB3YXMgYWRtaW5pc3RlcmVkIGFuZCBmaXJzdCBwbmV1bW9jb2NjYWwgZG9zZSB3YXMgYWRtaW5pc3RlcmVkIHdpdGhpbiAxMiBtb250aHMgcG9zdCBiaXJ0aApAcHNldWRvOiBDaGlsZCdzIGJpcnRoIEFORCBDb3VudCBvZiB2YWNjaW5lcyBhZG1pbmlzdGVyZWQgKHdoZXJlICJWYWNjaW5lIHR5cGUiID0gIlBuZXVtb2NvY2NhbCB2YWNjaW5lcyIgYW5kICJUeXBlIG9mIGRvc2UiID0gIlByaW1hcnkgc2VyaWVzIikgPSAyIEFORCAoIkRhdGUgYW5kIHRpbWUgb2YgdmFjY2luYXRpb24iICh3aGVyZSAiVmFjY2luZSB0eXBlIiA9ICJQbmV1bW9jb2NjYWwgdmFjY2luZXMiIEFORCAiRG9zZSBudW1iZXIiID0gMSkg4oiSICJEYXRlIG9mIGJpcnRoIiA8IDEyIG1vbnRocwpAdHJpZ2dlckRhdGU6ICJEYXRlIG9mIGJpcnRoIgoqLwpkZWZpbmUgIlBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2UiOgogICJTZWNvbmQgcG5ldW1vY29jY2FsIGRvc2UgZnJvbSB0aGUgcHJpbWFyeSBzZXJpZXMgd2FzIGFkbWluaXN0ZXJlZC4gVGhlIHByaW1hcnkgc2VyaWVzIGhhcyBiZWVuIGNvbXBsZXRlZC4iCiAgYW5kIEVuY291bnRlci4iVGhlIGZpcnN0IHBuZXVtb2NvY2NhbCBkb3NlIHdhcyBhZG1pbmlzdGVyZWQgd2l0aGluIDEyIG1vbnRocyBwb3N0IGJpcnRoIgogIGFuZCBub3QgIlBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2Ugd2FzIGFkbWluaXN0ZXJlZCIKCgovKgpAb3V0cHV0OiBQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIENyZWF0ZQpAY3JlYXRlOiBQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIHNob3VsZCBiZSBwcm92aWRlZCBpZiB0aGUgY2xpZW50IGhhcyByZWNlaXZlZCB0aGUgMiBwcmV2aW91cyBkb3NlcwoqLwpkZWZpbmUgIlBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2UgQ3JlYXRlIjoKICBpZiAiUG5ldW1vY29jY2FsIGJvb3N0ZXIgZG9zZSIKICB0aGVuICdQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIHNob3VsZCBiZSBwcm92aWRlZCBpZiB0aGUgY2xpZW50IGhhcyByZWNlaXZlZCB0aGUgMiBwcmV2aW91cyBkb3NlcycgKyAnCkR1ZSBEYXRlOiAnICsgVG9TdHJpbmcoIlBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2UgRHVlIERhdGUiKSArICcKT3ZlcmR1ZTogJyArIFRvU3RyaW5nKCJQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIE92ZXJkdWUiKQogIGVsc2UgJycKCgovKgpAZHluYW1pY1ZhbHVlOiBQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIER1ZSBEYXRlCkBwc2V1ZG9jb2RlOiAiRGF0ZSBvZiBiaXJ0aCIgKyA5IG1vbnRocwoqLwpkZWZpbmUgIlBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2UgRHVlIERhdGUiOgogIGlmICJQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIiB0aGVuIFBhdGllbnQuYmlydGhEYXRlICsgOSBtb250aHMKICBlbHNlIG51bGwKCgovKgpAZHluYW1pY1ZhbHVlOiBQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIE92ZXJkdWUKQHBzZXVkb2NvZGU6ICJEYXRlIG9mIGJpcnRoIiArIDE4IG1vbnRocwoqLwpkZWZpbmUgIlBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2UgT3ZlcmR1ZSI6CiAgaWYgIlBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2UiIHRoZW4gUGF0aWVudC5iaXJ0aERhdGUgKyAxOCBtb250aHMKICBlbHNlIG51bGwKCgovKgpAZHluYW1pY1ZhbHVlOiBQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIEV4cGlyYXRpb24KQHBzZXVkb2NvZGU6IFRvIGJlIGRldGVybWluZWQgYnkgTWVtYmVyIFN0YXRlczsgaG93ZXZlciwgdGhlcmUgaXMgbm8gcmVjb21tZW5kZWQgZXhwaXJhdGlvbiBkYXRlLiBXSE8gZG9lcyBub3QgY3VycmVudGx5IGhhdmUgcmVjb21tZW5kYXRpb25zIG9uIHRoZSB1c2Ugb2YgcG5ldW1vY29jY2FsIHZhY2NpbmUgaW4gaW5kaXZpZHVhbHMgYWdlZCBvdmVyIDUgeWVhcnMuCiovCmRlZmluZSAiUG5ldW1vY29jY2FsIGJvb3N0ZXIgZG9zZSBFeHBpcmF0aW9uIjoKICBudWxsCgogIAovKgpAY29tcGxldGU6IFBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2Ugd2FzIGFkbWluaXN0ZXJlZApAcHNldWRvY29kZTogQ291bnQgb2YgdmFjY2luZXMgYWRtaW5pc3RlcmVkICh3aGVyZSAiVmFjY2luZSB0eXBlIiA9ICJQbmV1bW9jb2NjYWwgdmFjY2luZXMiIGFuZCAiVHlwZSBvZiBkb3NlIiA9ICJCb29zdGVyIGRvc2UiKSA9IDEKKi8KZGVmaW5lICJQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIHdhcyBhZG1pbmlzdGVyZWQiOgogIEVuY291bnRlci4iT25lIHBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2Ugd2FzIGFkbWluaXN0ZXJlZCIKCgoKLyoKQG91dHB1dDogUG5ldW1vY29jY2FsIHNlY29uZCBib29zdGVyIGRvc2UKQGRlc2NyaXB0aW9uOiBQcm92aXNpb24gb2YgYW5vdGhlciBib29zdGVyIGRvc2UgZm9yIEhJVi1wb3NpdGl2ZSBpbmZhbnRzIGFuZCBwcmV0ZXJtIG5lb25hdGVzCkB0cmlnZ2VyOiBUaGUgcHJpbWFyeSBzZXJpZXMgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBvbmUgYm9vc3RlciBkb3NlIHdhcyBhZG1pbmlzdGVyZWQgdG8gdGhlIGNsaWVudCwgd2hvIGlzIG1vcmUgdGhhbiAxMiBtb250aHMgb2YgYWdlLiBUaGUgbGF0ZXN0IHBuZXVtb2NvY2NhbCBkb3NlIHdhcyBhZG1pbmlzdGVyZWQgd2l0aGluIDEyIG1vbnRocyBwb3N0IGJpcnRoLiBDbGllbnQgaXMgZWl0aGVyIEhJViBwb3NpdGl2ZSBvciBoYWQgYSBwcmV0ZXJtIGJpcnRoCkBwc2V1ZG86ICdUb2RheSdzIGRhdGUg4oiSICJEYXRlIG9mIGJpcnRoIiA+IDEyIG1vbnRocyBBTkQgIkNvbXBsZXRlZCB0aGUgcHJpbWFyeSB2YWNjaW5hdGlvbiBzZXJpZXMiID0gVFJVRSAod2hlcmUgIlZhY2NpbmUgdHlwZSIgPSAiUG5ldW1vY29jY2FsIHZhY2NpbmVzIikgQU5EIENvdW50IG9mIHZhY2NpbmVzIGFkbWluaXN0ZXJlZCAod2hlcmUgIlZhY2NpbmUgdHlwZSIgPSAiUG5ldW1vY29jY2FsIHZhY2NpbmVzIiBhbmQgIlR5cGUgb2YgZG9zZSIgPSAiQm9vc3RlciBkb3NlIikgPSAxIEFORCBMYXRlc3QgIkRhdGUgYW5kIHRpbWUgb2YgdmFjY2luYXRpb24iICh3aGVyZSAiVmFjY2luZSB0eXBlIiA9ICJQbmV1bW9jb2NjYWwgdmFjY2luZXMiKSDiiJIgIkRhdGUgb2YgYmlydGgiIDwgMTIgbW9udGhzIEFORCAoIkhJViBzdGF0dXMiID0gIkhJVi1wb3NpdGl2ZSIgT1IgIlByZXRlcm0gYmlydGgiID0gVFJVRSkKQHRyaWdnZXJEYXRlOiAiRGF0ZSBvZiBiaXJ0aCIKKi8KZGVmaW5lICJQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSI6CiAgIlBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2Ugd2FzIGFkbWluaXN0ZXJlZCIKICBhbmQgRW5jb3VudGVyLiJUaGUgbGF0ZXN0IHBuZXVtb2NvY2NhbCBkb3NlIHdhcyBhZG1pbmlzdGVyZWQgd2l0aGluIDEyIG1vbnRocyBwb3N0IGJpcnRoIgogIGFuZCBFbmNvdW50ZXIuIlRoZSBjbGllbnQncyBhZ2UgaXMgbGVzcyB0aGFuIDI0IG1vbnRocyIKICBhbmQgKAogICAgRW5jb3VudGVyLiJDbGllbnQncyBISVYgc3RhdHVzIGlzIHBvc2l0aXZlIgogICAgb3IgRW5jb3VudGVyLiJDbGllbnQgaGFkIHByZXRlcm0gYmlydGgiCiAgKQogIGFuZCBub3QgIlNlY29uZCBwbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIHdhcyBhZG1pbmlzdGVyZWQiCiAgYW5kICJQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSBFeHBpcmF0aW9uIiBhZnRlciBkYXkgb2YgVG9kYXkKCgovKgpAb3V0cHV0OiBQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSBDcmVhdGUKQGNyZWF0ZTogSElWLXBvc2l0aXZlIGluZmFudHMgYW5kIHByZXRlcm0gbmVvbmF0ZXMgd2hvIGhhdmUgcmVjZWl2ZWQgdGhlaXIgMyBwcmltYXJ5IHZhY2NpbmUgZG9zZXMgYmVmb3JlIDEyIG1vbnRocyBvZiBhZ2UgbWF5IGJlbmVmaXQgZnJvbSBhIGJvb3N0ZXIgZG9zZSBpbiB0aGUgc2Vjb25kIHllYXIgb2YgbGlmZQoqLwpkZWZpbmUgIlBuZXVtb2NvY2NhbCBzZWNvbmQgYm9vc3RlciBkb3NlIENyZWF0ZSI6CiAgaWYgIlBuZXVtb2NvY2NhbCBzZWNvbmQgYm9vc3RlciBkb3NlIgogIHRoZW4gJ0hJVi1wb3NpdGl2ZSBpbmZhbnRzIGFuZCBwcmV0ZXJtIG5lb25hdGVzIHdobyBoYXZlIHJlY2VpdmVkIHRoZWlyIDMgcHJpbWFyeSB2YWNjaW5lIGRvc2VzIGJlZm9yZSAxMiBtb250aHMgb2YgYWdlIG1heSBiZW5lZml0IGZyb20gYSBib29zdGVyIGRvc2UgaW4gdGhlIHNlY29uZCB5ZWFyIG9mIGxpZmUnICsgJwpEdWUgRGF0ZTogJyArIFRvU3RyaW5nKCJQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSBEdWUgRGF0ZSIpICsgJwpPdmVyZHVlOiAnICsgVG9TdHJpbmcoIlBuZXVtb2NvY2NhbCBzZWNvbmQgYm9vc3RlciBkb3NlIE92ZXJkdWUiKSArICcKRXhwaXJhdGlvbjogJyArIFRvU3RyaW5nKCJQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSBFeHBpcmF0aW9uIikKICBlbHNlICcnCgoKLyoKQGR5bmFtaWNWYWx1ZTogUG5ldW1vY29jY2FsIHNlY29uZCBib29zdGVyIGRvc2UgRHVlIERhdGUKQHBzZXVkb2NvZGU6ICJEYXRlIG9mIGJpcnRoIiArIDEyIG1vbnRocwoqLwpkZWZpbmUgIlBuZXVtb2NvY2NhbCBzZWNvbmQgYm9vc3RlciBkb3NlIER1ZSBEYXRlIjoKICBpZiAiUG5ldW1vY29jY2FsIHNlY29uZCBib29zdGVyIGRvc2UiIHRoZW4gUGF0aWVudC5iaXJ0aERhdGUgKyAxMiBtb250aHMKICBlbHNlIG51bGwKCgovKgpAZHluYW1pY1ZhbHVlOiBQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSBPdmVyZHVlCkBwc2V1ZG9jb2RlOiAiRGF0ZSBvZiBiaXJ0aCIgKyAyNCBtb250aHMKKi8KZGVmaW5lICJQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSBPdmVyZHVlIjoKICBpZiAiUG5ldW1vY29jY2FsIHNlY29uZCBib29zdGVyIGRvc2UiIHRoZW4gUGF0aWVudC5iaXJ0aERhdGUgKyAyNCBtb250aHMKICBlbHNlIG51bGwKCgovKgpAZHluYW1pY1ZhbHVlOiBQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSBFeHBpcmF0aW9uCkBwc2V1ZG9jb2RlOiAiRGF0ZSBvZiBiaXJ0aCIgKyAyNCBtb250aHMKKi8KZGVmaW5lICJQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSBFeHBpcmF0aW9uIjoKICBQYXRpZW50LmJpcnRoRGF0ZSArIDI0IG1vbnRocwoKICAKLyoKQGNvbXBsZXRlOiBTZWNvbmQgcG5ldW1vY29jY2FsIGJvb3N0ZXIgZG9zZSB3YXMgYWRtaW5pc3RlcmVkCkBwc2V1ZG9jb2RlOiBDb3VudCBvZiB2YWNjaW5lcyBhZG1pbmlzdGVyZWQgKHdoZXJlICJWYWNjaW5lIHR5cGUiID0gIlBuZXVtb2NvY2NhbCB2YWNjaW5lcyIgYW5kICJUeXBlIG9mIGRvc2UiID0gIkJvb3N0ZXIgZG9zZSIpID0gMgoqLwpkZWZpbmUgIlNlY29uZCBwbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIHdhcyBhZG1pbmlzdGVyZWQiOgogIEVuY291bnRlci4iVHdvIHBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2VzIHdlcmUgYWRtaW5pc3RlcmVkIgoKCgovKgpAdGVzdDogVGVzdCBleHBlY3RlZCByZXN1bHRzIGJhc2VkIG9uIGV4YW1wbGUgcGF0aWVudHMKKi8KZGVmaW5lICJUZXN0IFZhbGlkYXRpb24iOgogIGNhc2UKICAgIHdoZW4gUGF0aWVudC5pZCA9ICdQbmV1bW9jb2NjYWwwOC4xJyB0aGVuICJQbmV1bW9jb2NjYWwgZG9zZSAxIgogICAgd2hlbiBQYXRpZW50LmlkID0gJ1BuZXVtb2NvY2NhbDA5LjInIHRoZW4gIlBuZXVtb2NvY2NhbCBkb3NlIDEiCiAgICB3aGVuIFBhdGllbnQuaWQgPSAnUG5ldW1vY29jY2FsMTAuNCcgdGhlbiAiUG5ldW1vY29jY2FsIGRvc2UgMiIKICAgIHdoZW4gUGF0aWVudC5pZCA9ICdQbmV1bW9jb2NjYWwxMS40JyB0aGVuICJQbmV1bW9jb2NjYWwgZG9zZSAyIgogICAgd2hlbiBQYXRpZW50LmlkID0gJ1BuZXVtb2NvY2NhbDEyLjUnIHRoZW4gIlBuZXVtb2NvY2NhbCBkb3NlIDIiCiAgICB3aGVuIFBhdGllbnQuaWQgPSAnUG5ldW1vY29jY2FsMTMuNScgdGhlbiAiUG5ldW1vY29jY2FsIGRvc2UgMiIKICAgIHdoZW4gUGF0aWVudC5pZCA9ICdQbmV1bW9jb2NjYWwxNC40JyB0aGVuICJGaXJzdCBwbmV1bW9jb2NjYWwgZG9zZSBmcm9tIHRoZSBwcmltYXJ5IHNlcmllcyB3YXMgYWRtaW5pc3RlcmVkIgogICAgICBhbmQgbm90ICJQbmV1bW9jb2NjYWwgZG9zZSAyIgogICAgd2hlbiBQYXRpZW50LmlkID0gJ1BuZXVtb2NvY2NhbDE1LjQnIHRoZW4gIlBuZXVtb2NvY2NhbCBib29zdGVyIGRvc2UiCiAgICB3aGVuIFBhdGllbnQuaWQgPSAnUG5ldW1vY29jY2FsMTYuNCcgdGhlbiAiU2Vjb25kIHBuZXVtb2NvY2NhbCBkb3NlIGZyb20gdGhlIHByaW1hcnkgc2VyaWVzIHdhcyBhZG1pbmlzdGVyZWQuIFRoZSBwcmltYXJ5IHNlcmllcyBoYXMgYmVlbiBjb21wbGV0ZWQuIgogICAgICBhbmQgbm90ICJQbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIgogICAgd2hlbiBQYXRpZW50LmlkID0gJ1BuZXVtb2NvY2NhbDE3LjQnIHRoZW4gIlBuZXVtb2NvY2NhbCBzZWNvbmQgYm9vc3RlciBkb3NlIgogICAgd2hlbiBQYXRpZW50LmlkID0gJ1BuZXVtb2NvY2NhbDE4LjQnIHRoZW4gIlBuZXVtb2NvY2NhbCBzZWNvbmQgYm9vc3RlciBkb3NlIgogICAgd2hlbiBQYXRpZW50LmlkID0gJ1BuZXVtb2NvY2NhbDE5LjUnIHRoZW4gIlBuZXVtb2NvY2NhbCBzZWNvbmQgYm9vc3RlciBkb3NlIgogICAgd2hlbiBQYXRpZW50LmlkID0gJ1BuZXVtb2NvY2NhbDIwLjUnIHRoZW4gIlBuZXVtb2NvY2NhbCBzZWNvbmQgYm9vc3RlciBkb3NlIgogICAgd2hlbiBQYXRpZW50LmlkID0gJ1BuZXVtb2NvY2NhbDIxLjQnIHRoZW4gIlNlY29uZCBwbmV1bW9jb2NjYWwgZG9zZSBmcm9tIHRoZSBwcmltYXJ5IHNlcmllcyB3YXMgYWRtaW5pc3RlcmVkLiBUaGUgcHJpbWFyeSBzZXJpZXMgaGFzIGJlZW4gY29tcGxldGVkLiIKICAgICAgYW5kIG5vdCAiUG5ldW1vY29jY2FsIHNlY29uZCBib29zdGVyIGRvc2UiCiAgICB3aGVuIFBhdGllbnQuaWQgPSAnUG5ldW1vY29jY2FsMjIuNCcgdGhlbiAiU2Vjb25kIHBuZXVtb2NvY2NhbCBkb3NlIGZyb20gdGhlIHByaW1hcnkgc2VyaWVzIHdhcyBhZG1pbmlzdGVyZWQuIFRoZSBwcmltYXJ5IHNlcmllcyBoYXMgYmVlbiBjb21wbGV0ZWQuIgogICAgICBhbmQgbm90ICJQbmV1bW9jb2NjYWwgc2Vjb25kIGJvb3N0ZXIgZG9zZSIKICAgIHdoZW4gUGF0aWVudC5pZCA9ICdQbmV1bW9jb2NjYWwyMy4zJyB0aGVuICJTZWNvbmQgcG5ldW1vY29jY2FsIGRvc2UgZnJvbSB0aGUgcHJpbWFyeSBzZXJpZXMgd2FzIGFkbWluaXN0ZXJlZC4gVGhlIHByaW1hcnkgc2VyaWVzIGhhcyBiZWVuIGNvbXBsZXRlZC4iCiAgICAgIGFuZCBub3QgIlBuZXVtb2NvY2NhbCBzZWNvbmQgYm9vc3RlciBkb3NlIgogICAgd2hlbiBQYXRpZW50LmlkID0gJ1BuZXVtb2NvY2NhbDI0LjInIHRoZW4gIlNlY29uZCBwbmV1bW9jb2NjYWwgYm9vc3RlciBkb3NlIHdhcyBhZG1pbmlzdGVyZWQiCiAgICB3aGVuIFBhdGllbnQuaWQgPSAnUG5ldW1vY29jY2FsMjUuMScgdGhlbiBub3QgIlBuZXVtb2NvY2NhbCBkb3NlIDEiCiAgICBlbHNlICdObyB0ZXN0IGNhc2Ugc2V0JwogIGVuZAo="
    }
  ]
}