From 4122bc97d473ecb29f8d9fe7fd6ca9b17b7713ab Mon Sep 17 00:00:00 2001
From: Michael Vorburger
+* Make sure to update the [Releases.kt](https://github.com/google/android-fhir/blob/master/buildSrc/src/main/kotlin/Releases.kt) configuration file with a new _Version/Artifact ID_
+
+**Step 2:**
+
+* Make a PR (pull request) with the above changes, request a code review
+
+**Step 3:**
+
+* When PR is reviewed and merged - request for the artifact to be published on maven
+
+**Step 4:**
+
+* Update your/any dependent PR (PR using the library) with the new _Artifact ID_ and make/trigger the CI
+
+**NB:** For a specific example on working with FHIR SDK's Common Library during development, see [Common Library](#common-library).
diff --git a/docs/contrib/roadmap.md b/docs/contrib/roadmap.md
new file mode 100644
index 0000000000..f4f5785846
--- /dev/null
+++ b/docs/contrib/roadmap.md
@@ -0,0 +1,45 @@
+# Roadmap
+
+The [product roadmap board](https://github.com/google/android-fhir/projects/7) is where you can learn about what features are being working on, what stage they're in, and release timelines. Have any questions or comments about items on the roadmap or want to know how to get involved? Please use the [discussions section](https://github.com/google/android-fhir/discussions), or email us at &{vxCFIA=SY2uww`JH8JUj1T%gN0>q{r=whP$}5;2SSc)NrmQCzYhmpU+W)
z*Vez(D^`-{9<*&!V;3U}ByQP5cXLN*zijH-KQ90dAD<(!y-=;Pk<;P~T_CGyO`4&7
zPiMw3>pxk;1`Fdw3W)Inc|lJXM|@<2zPpiPn3L%G?#PJs=B`@O>Y>K;DhJe6DRwhX
z!V77~wb78DFh?vG;hcZ0r;l`+yJ&UCO^%Bre@c{}zl@dQU1txch%^90`m83mc{(TW
zG_868+n{4kgva%WTR;Ja$h~<5Q)y366>wX}Uk~FKHIV
zzv^yE*DPB%#(9~zJ0`HeW<}eH+l8>3oJ5^!J8D2;f=#)a5dqFmU@bBkhuNp)A}rbI
z5Sqa!2V)odTEaR)t#=>g@f2+E1{81BKuw2`x0(JbD1YB`sWKFT^8BG!It*c<^QC)r
zUsMNKZ(23ovdnuO#cAQZpT(#7^(85!)j|6^!}l15^sLv7v24MeeO-{;DN`1&=oO$
z%G1Cnk9S{FG}~qQ=C{4a>XQfY#%Fi!{?Zi*2_vjVg3Hk|UoRk*gJEISaH%X-6i_BF
znynBzvphLbiD5~jYkVN?zEtruv+&vUS?4USd;OQlwM|2(-&D{9egj=(IsG?()fQXp
zfkA|0QO~rg+5(_KvD8uT<8LB~x*VYTB_Q1GVZMkSx*|9MBXog4lU>6Z#+NNHwr4>g
zK_ZXJRK-F8N;_1X6XYpwNLD&vrsbat0@ZMr4!t>nUmOF0C~jW;r;iuSN*@B
+Figure 1: FHIR Engine Library components +
+ +## FHIR Engine Library components + +The FHIR Engine library comprises an SQLLite database for offline storage of FHIR Resources and a suite of APIs (sync, search, data-access) for managing FHIR resources on the device. + +### Local db for offline storage of FHIR resources + +* The backbone of the FHIR Engine Library is the **SQLite database** storing FHIR resources in serialized JSON format +* Data stored in the on device storage is **[stored securely](Privacy-Security.md)** +* The database has **indexes for enabling fast retrieval** of resources based on [FHIR Search](https://www.hl7.org/fhir/search.html) + +### FHIR Engine APIs + +* **Data Access API**: basic access to local FHIR resources, namely, the CRUD operations: create, read, update, and delete. This relies on the HAPI FHIR Structures libraries ([api docs](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/) | [documentation](https://hapifhir.io/hapi-fhir/docs/model/working_with_resources.html)) +* **Search API**: a Kotlin DSL (domain-specific language) for searching local FHIR resources +* **Sync API**: synchronizes local FHIR resources with a remote FHIR server/store (such as [HAPI FHIR](https://hapifhir.io/hapi-fhir//) or [Google Cloud Healthcare API](https://cloud.google.com/healthcare-api/docs/how-tos/fhir)) diff --git a/docs/use/SDCL/Author-questionnaires.md b/docs/use/SDCL/Author-questionnaires.md new file mode 100644 index 0000000000..985e51c79a --- /dev/null +++ b/docs/use/SDCL/Author-questionnaires.md @@ -0,0 +1,625 @@ +# Author Questionnaires + +An Android app developer can use the Structured Data Capture Library's capabilities without a deep understanding of FHIR or FHIR questionnaires; similarly, healthcare data experts can build questionnaires independently from the app development workflow. However, understanding FHIR Questionnaires can be helpful for developers to debug issues, implement more advanced features, or authoring questionnaires themselves. This section is meant to provide Android developers a brief overview of the Questionnaire with a focus on the parts relevant for the Structured Data Capture Library. + +You should be familiar with: + +* Reading and writing [JSON](https://www.json.org/) +* Working with data structures besides FHIR +* (Recommended) [FHIR overview for developers](https://www.hl7.org/fhir/overview-dev.html) + +The Structured Data Capture Library uses the [FHIR Questionnaire](https://www.hl7.org/fhir/questionnaire.html) as its fundamental data structure. A FHIR Questionnaire is a structured set of questions for collecting data from the end users. In addition, the [Structured Data Capture](http://hl7.org/fhir/uv/sdc/) (SDC) implementation guide supplements questionnaires by defining capabilities for more advanced control of rendering and question flow. + +* [Example questionnaires from HL7](https://www.hl7.org/fhir/questionnaire-examples.html) +* [Example questionnaires from the SDC IG](http://hl7.org/fhir/uv/sdc/artifacts.html#example-example-instances) + +## Questionnaire builders + +There are a number of web-based tools for building FHIR Questionnaires like the [NLM Form Builder](https://lhcformbuilder.nlm.nih.gov/), which are a great starting point for both developers and non-developers to create and edit Questionnaires. They allow you to add and edit questions using a simple drag-and-drop interface, and include some advanced features like conditional display. Many features which require extensions like [data extraction and population](#data-extraction-and-population) or [item control](FHIR-specification-support.md#item-control) are not included in the UI but can be manually added by saving as a JSON file and editing the file. Typically, if you load a file with manually added extensions back into a Questionnaire builder and edit an item with an extension, the extension is maintained. However, if you add new items any desired extensions would need to be manually added. + +One possible workflow is to have a non-developer create an initial version of a questionnaire using a Questionnaire builder tool, then saving it as a JSON file and it handing off to someone familiar with the FHIR Questionnaire syntax to add any desired extensions or other advanced functionality manually. + +Questionnaire builders may support different parts of the SDC implementation guide than the Structured Data Capture Library does, so double-check the SDC Library's [FHIR specification support](FHIR-specification-support.md) if something doesn't seem to be working. + +## Questionnaire basics + +Following is an example of a very simple Questionnaire: + +```json +{ + "resourceType": "Questionnaire", + "status": "draft", + "item": [ + { + "linkId": "1", + "text": "Name", + "type": "string" + } + ] +} + +``` + +The `item` array contains a single question object which collects a string. The optional `text` field means this question will have a text label containing "Name" when rendered. `linkId` is used to identify the specific component of the Questionnaire. Two common conventions for `linkId` are using the numeric representation of the nested structure (`1`, `1.1`, `1.2`, etc.), or descriptive names (`patient-info`, `patient-info-name`, `patient-info-dob`, for example). + +Let's look at a more complex Questionnaire, focused on the top-level `item` element: + +```json +"item": [ + { + "linkId": "1", + "text": "Patient Information", + "type": "group", + "item": [ + { + "linkId": "1.1", + "text": "Name", + "type": "string", + "required": true + }, + { + "linkId": "1.2", + "text": "Date of birth", + "type": "date" + } + ] + }, + { + "linkId": "2", + "text": "Demographic Information", + "type": "group", + "item": [ + { + "linkId": "2.1", + "text": "Cats are better than dogs", + "type": "boolean" + }, + { + "linkId": "2.2", + "text": "Correct!", + "type": "display", + "enableWhen": [ + { + "question": "2.1", + "operator": "=", + "answerBoolean": true + } + ] + } + ] + } +] +``` + +There are [several options](https://www.hl7.org/fhir/valueset-item-type.html) for the `type` member of `item` objects. The Structured Data Capture Library selects the UI component to use when rendering based on the type. This example also uses the `group` type where `text` acts as section headers and child item objects are logically grouped. + +Some Questionnaire elements control validation or rendering logic. For example, item `1.1` is required, and item `2.1.1` is only shown if item `2.1` is `true`. + +The next example of an item object uses extensions from the SDC implementation guide and also demonstrates the `choice` type: + +```json +... +{ + "linkId": "1.3", + "text": "Gender", + "type": "choice", + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/questionnaire-item-control", + "code": "radio-button", + "display": "Radio Button" + } + ] + } + }, + { + "url" : "http://hl7.org/fhir/StructureDefinition/questionnaire-choiceOrientation", + "valueCode" : "horizontal" + } + ], + "answerOption": [ + { + "valueCoding": { + "code": "female", + "display": "Female", + "system": "http://hl7.org/fhir/gender-identity" + } + }, + { + "valueCoding": { + "code": "male", + "display": "Male", + "system": "http://hl7.org/fhir/gender-identity" + } + }, + { + "valueCoding": { + "code": "other", + "display": "Other", + "system": "http://hl7.org/fhir/gender-identity" + } + } + ] +}, +... +``` + +There are two extensions: the `questionnaire-itemControl` specifies that the `choice` type question should use radio buttons (and not a dropdown menu or checkboxes, for example), and the `questionnaire-choiceOrientation` says question options should be rendered horizontally. + +### Popular features and extensions + +#### Pagination + +[Page](https://build.fhir.org/codesystem-questionnaire-item-control.html#questionnaire-item-control-page) item control on group items for paginated questionnaires. Note: the `page` control type is not yet part of a stable FHIR release, but has been added to the SDC Library due to developer demand. + +Example: + +```json +"item": [ + { + "type": "group", + "linkId": "pagedemo", + "text": "Page title", + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/questionnaire-item-control", + "code": "page", + "display": "Page" + } + ], + "text": "Page" + } + } + ], + "item": [ ... ] + } +] +``` + +#### Value constraints + +[Value constraints](http://hl7.org/fhir/uv/sdc/behavior.html#value-constraints) to add validation to responses. Currently supported: `maxLength`, `minLength`, `regex`, `minValue`, `maxValue`. + +Example: + +```json +"item": [ + { + "type": "decimal", + "linkId": "weightdemo", + "text": "Weight, Measured", + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/minValue", + "valueDecimal": 1 + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/maxValue", + "valueDecimal": 100 + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/maxDecimalPlaces", + "valueInteger": 2 + } + ] + } +] +``` + +#### Conditional display + +Conditional display using [enableWhen](http://hl7.org/fhir/uv/sdc/behavior.html#enableWhen) and [enableWhenExpression](http://hl7.org/fhir/uv/sdc/expressions.html#enableWhenExpression). + +Example: + +```json +"item": [ + { + "linkId": "sex", + "text": "Sex", + "type": "choice", + "answerOption": [ + { + "valueCoding": { + "code": "male", + "display": "Male" + } + }, + { + "valueCoding": { + "code": "female", + "display": "Female" + } + } + ] + }, + { + "linkId": "birthdate", + "text": "Birth date" + "type": "date", + }, + { + "linkId" : "example1", + "text": "Shown only if female", + "type": "text", + "enableWhen": [ + { + "question" : "sex", + "operator": "=", + "answerCoding": { + "code": "female" + } + } + ] + }, + { + "linkId" : "example2", + "text": "Shown only if female over 40 years old", + "type": "text", + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression", + "valueExpression": { + "description": "female over 40", + "language": "text/fhirpath", + "expression": "%resource.repeat(item).where(linkId='sex').answer.value.code ='female' and today().toString().substring(0, 4).toInteger() - %resource.repeat(item).where(linkId='birthdate').answer.value.toString().substring(0, 4).toInteger() >= 40" + } + } + ], + } +] +``` + +#### Autocomplete + +[Autocomplete](http://hl7.org/fhir/R4/codesystem-questionnaire-item-control.html#questionnaire-item-control-autocomplete) for choice-type questionnaire item. + +Example: + +```json +"item": [ + { + "linkId": "state" + "text": "US State", + "type": "choice", + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/questionnaire-item-control", + "code": "autocomplete", + "display": "autocomplete" + } + ] + } + } + ], + "answerOption": [ + { + "valueCoding": { + "code": "AL", + "display": "Alabama" + } + }, + { + "valueCoding": { + "code": "AK", + "display": "Alaska" + } + }, + { + "valueCoding": { + "code": "AS", + "display": "American Samoa" + } + }, + { + "valueCoding": { + "code": "AZ", + "display": "Arizona" + } + }, + { + "valueCoding": { + "code": "AR", + "display": "Arkansas" + } + }, + ... + ] + } +] +``` + +## Data extraction and population + +Mapping FHIR QuestionnaireResponses to other FHIR resources (and back) allows the structured data capture process to be more tightly integrated with clinical workflows. + +For example, if your application has a questionnaire for new patient registration, your ultimate goal may be to create a [FHIR Patient resource](https://www.hl7.org/fhir/patient.html) based on the answers provided to use in your application. Or, if your application has a questionnaire for entering test results, you could create a FHIR Observation resource. The process of mapping a FHIR QuestionnaireResponse to one or more other FHIR resources is called [extraction](http://hl7.org/fhir/uv/sdc/extraction.html). + +On the other hand, you may want to reduce data entry by loading values from existing FHIR resources into your questionnaire. For example, if a questionnaire asks for a patient's name and age, you can pre-populate that information from an existing FHIR Patient resource. The process of mapping one or more FHIR resources to a FHIR QuestionnaireResponse is called [population](http://hl7.org/fhir/uv/sdc/populate.html). + +### Definition-based extraction + +A questionnaire using [definition-based extraction](http://hl7.org/fhir/uv/sdc/extraction.html#definition-based-extraction) includes the [questionnaire-itemExtractionContext](http://hl7.org/fhir/uv/sdc/StructureDefinition-sdc-questionnaire-itemExtractionContext.html) extension to identify the FHIR resource to extract, and fill in the `Questionnaire.item.definition` to specify the resource or profile element that Questionnaire item corresponds to: + +```json +{ + "resourceType": "Questionnaire", + "status": "draft", + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemExtractionContext", + "valueExpression": { + "language": "application/x-fhir-query", + "expression": "Patient", + "name": "patient" + } + } + ], + "item": [ + { + "linkId": "PR", + "type": "group", + "item": [ + { + "linkId": "PR-name", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name", + "item": [ + { + "linkId": "PR-name-given", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given", + "type": "string", + "text": "First Name" + }, + { + "linkId": "PR-name-family", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.family", + "type": "string", + "text": "Family Name" + } + ] + }, + { + "linkId": "PR-birthdate", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.birthDate", + "type": "date", + "text": "Date of Birth" + }, + { + "linkId": "PR-id", + "type": "group", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.identifier", + "item": [ + { + "extension" : [ + { + "url" : "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden", + "valueBoolean" : true + }, + { + "url" : "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueString" : "http://example.org/mrn" + } + ], + "linkId": "PR-name-id-url", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.identifier.system", + "type": "string" + }, + { + "linkId": "PR-name-id", + "definition": "http://hl7.org/fhir/StructureDefinition/Patient#Patient.identifier.value", + "type": "string", + "text": "Patient Id" + } + ] + } + ] + } + ] +} +``` + +This example extracts to a Patient resource. In order to extract to a Patient.identifier, it includes the hidden `PR-name-id-url` item to populate the `Patient.identifier.system` element programmatically. + +One major limitation of expression-based extraction is that the questionnaire must be structured the same as the resource you're extracting to. For example, there is no simple way to extract answers from a single group to multiple different FHIR resources. + +See the [SDC implementation guide on definition-based extraction](http://hl7.org/fhir/uv/sdc/extraction.html#definition-based-extraction) for more information. + +### StructureMap-based extraction + +A questionnaire using [StructureMap-based extraction](http://hl7.org/fhir/uv/sdc/extraction.html#structuremap-based-extraction) includes the `sdc-questionnaire-targetStructureMap` extension specifying the structure map to use when transforming the QuestionnaireResponse to other FHIR resources. + +```json +{ + "resourceType": "Questionnaire", + "status": "active", + "extension": [ + { + "url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-targetStructureMap", + "valueCanonical": "http://example.org/fhir/StructureMap/PatientRegistration" + } + ], + "item": [ + { + "linkId": "PR", + "type": "group", + "item": [ + { + "linkId": "PR-name", + "type": "group", + "item": [ + { + "linkId": "PR-name-given", + "type": "string", + "text": "First Name" + }, + { + "linkId": "PR-name-family", + "type": "string", + "text": "Family Name" + } + ] + }, + { + "linkId": "PR-birthdate", + "type": "date", + "text": "Date of Birth" + }, + { + "linkId": "PR-name-id", + "type": "string", + "text": "Patient Id" + } + ] + } + ] +} +``` + +Structure maps are typically authored in the [FHIR mapping language](http://hl7.org/fhir/R4/mapping-language.html), although they can also be represented by the [StructureMap resource](http://hl7.org/fhir/R4/structuremap.html): + +``` +map "http://example.org/fhir/StructureMap/PatientRegistration" = 'PatientRegistration' +uses "http://hl7.org/fhir/StructureDefinition/QuestionnaireReponse" as source +uses "http://hl7.org/fhir/StructureDefinition/Bundle" as target + +group PatientRegistration(source src : QuestionnaireResponse, target bundle: Bundle) { + src -> bundle.id = uuid() "rule_bundle_id"; + src -> bundle.type = 'collection' "rule_bundle_type"; + src -> bundle.entry as entry, entry.resource = create('Patient') as patient then + ExtractPatient(src, patient) "rule_extract_patient"; +} + +group ExtractPatient(source src : QuestionnaireResponse, target tgt : Patient) { + src.item as item where(linkId = 'PR') then { + item.item as inner_item where (linkId = 'patient-0-birth-date') then { + inner_item.answer first as ans then { + ans.value as val -> tgt.birthDate = val "rule_birthdate"; + }; + }; + + item.item as inner_item where (linkId = 'PR-name-id') then { + inner_item.answer first as ans -> tgt.identifier = create('Identifier') as id then { + ans.value -> id.system = 'http://example.org/mrn' "rule_name_id_code"; + ans.value as val -> id.value = val "rule_name_id_val"; + }; + }; + + item.item as nameItem where(linkId = 'PR-name') -> tgt.name = create('HumanName') as patientName then { + nameItem.item as famItem where (linkId = 'PR-name-family') then { + famItem.answer first as family then { + family.value as val -> patientName.family = val "rule_name_family"; + }; + }; + src -> patientName.given = evaluate(nameItem, ${"$"}this.item.where(linkId = 'PR-name-given').answer.value) "rule_name_given"; + }; + }; +} +``` + +The `PatientRegistration` group creates a Bundle to contain the other resources, which is required by the Structured Data Capture library, then creates an empty Patient and continues to `ExtractPatient`. Most of the example simply searches for items by `linkId` and then navigates the questionnaire's `item` data structure to set Patient element values. For the `Patient.name` element, the example uses the same strategy for the extraction rule `rule_name_family`, but also demonstrates using the [FHIRPath language](https://hl7.org/fhirpath/) to navigate and search the questionnaire structure with the extraction rule `rule_name_given`. + +Relies on HAPI FHIR implementation which does not support all features of mapping language, mostly convenience features so if it doesn't work try a more verbose form. + +See the [FHIR mapping language specification](http://hl7.org/fhir/R4/mapping-language.html) and [FHIR mapping language tutorial](http://hl7.org/fhir/R4/mapping-tutorial.html) for more information. + +The [online fhirpath.js demo](https://hl7.github.io/fhirpath.js/) is useful for learning and iterating on [FHIRPath](https://hl7.org/fhirpath/) expressions. + +### Expression-based population + +A questionnaire using [expression-based population](http://hl7.org/fhir/uv/sdc/populate.html#expression-based-population) primarily relies on the `sdc-questionnaire-initialExpression` extension to specify the starting value for each questionnaire item: + +```json +{ + "resourceType": "Questionnaire", + "status": "active", + "item": [ + { + "linkId": "PR", + "type": "group", + "item": [ + { + "extension" : [ + { + "url" : "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression" : { + "language" : "text/fhirpath", + "expression" : "Patient.name.first().select(given.first() + ' ' + family.first())" + } + } + ], + "linkId": "PR-name", + "type": "string", + "text": " Full name" + }, + { + "extension" : [ + { + "url" : "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression" : { + "language" : "text/fhirpath", + "expression" : "Patient.birthDate" + } + } + ], + "linkId": "PR-birthdate", + "type": "date", + "text": "Date of Birth" + }, + { + "extension" : [ + { + "url" : "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression", + "valueExpression" : { + "language" : "text/fhirpath", + "expression" : "Patient.identifier.where(system='http://example.org/mrn').value" + } + } + ], + "linkId": "PR-name-id", + "type": "string", + "text": "Patient Id" + } + ] + } + ] +} +``` + +Some external examples use FHIR search queries (where `language` is `"application/x-fhir-query"`) - these are not well supported by the Structured Data Capture library as you must directly pass all resources needed for population. + +You can test expression-based population for the example questionnaire with this Patient resource: + +```json +{ + "resourceType": "Patient", + "identifier": [ + { + "system": "http://example.org/mrn", + "value": "abcd-efgh-ijkl-mnop" + } + ], + "active": true, + "name": [ + { + "family": "Ali", + "given": [ + "Salman" + ] + } + ], + "birthDate": "1968-09-17" +} +``` diff --git a/docs/use/SDCL/Customize-how-a-Questionnaire-is-displayed.md b/docs/use/SDCL/Customize-how-a-Questionnaire-is-displayed.md new file mode 100644 index 0000000000..0541490405 --- /dev/null +++ b/docs/use/SDCL/Customize-how-a-Questionnaire-is-displayed.md @@ -0,0 +1,133 @@ +# Customize how a Questionnaire is displayed + +The Structured Data Capture Library provides default UI components and styles to +render FHIR Questionnaire resources based on +[Material Design](https://material.io/design) and the +[Structured Data Capture Implementation Guide](https://build.fhir.org/ig/HL7/sdc/). +In practice, you may want to customize how questionnaires look, and this guide +explains the two primary ways to do so: + +* Adjust the existing components to match the style of the rest of your + application +* Create new components to collect information in non-standard ways, e.g. + connected devices + +## Customize styles + +The Structured Data Capture Library includes a default +[theme](https://developer.android.com/guide/topics/ui/look-and-feel/themes) +[`Theme.Questionnaire`](https://github.com/google/android-fhir/blob/master/datacapture/src/main/res/values/styles.xml#L36) +which defines a number of custom attributes used to style questionnaires. For +example, `questionnaireQuestionTextStyle` defines the style for all question +text, and changing it affects all rendered questionnaires. The custom attributes +are: + +* `groupHeaderTextAppearanceQuestionnaire` +* `questionnaireQuestionTextStyle` +* `questionnaireSubtitleTextStyle` +* `questionnaireRadioButtonStyle` +* `questionnaireCheckBoxStyle` +* `questionnaireDropDownTextStyle` +* `questionnaireDropdownLayoutStyle` +* `questionnaireTextInputLayoutStyle` +* `questionnaireTextInputEditTextStyle` +* `questionnaireChipStyle` +* `questionnaireDialogTitleStyle` +* `questionnaireDialogButtonStyle` +* `questionnaireAddAnotherAnswerButtonStyle` +* `questionnaireErrorTextStyle` +* `questionnaireButtonStyle` +* `questionnaireSubmitButtonStyle` + +To customize the styles used to render questionnaires, create a theme with +different values for the custom attributes. A simple way to do this is to extend +the `Theme.Questionnaire` theme and override the attributes you want to change. + +For example, to change the appearance of question text, open your project's +`res/values/styles.xml` file and add a new theme that extends +`Theme.Questionnaire`, then set the `headerTextAppearanceQuestionnaire` +attribute to your preferred value: + +```xml + +``` + +Next, edit your application's default theme, typically in the +`res/values/themes.xml` file, and add the attribute `questionnaire_theme` set to +the new theme you just created: + +```xml + +``` + +## Custom questionnaire components + +The Structured Data Capture Library uses +[custom UI components](https://github.com/google/android-fhir/tree/master/datacapture/src/main/java/com/google/android/fhir/datacapture/views) +to render questions in a questionnaire. There are predefined components for most +question item types so you do not need to do anything special for most +questions. However, if you want to render a question in a way not described in +the FHIR standard of the SDC implementation guide, you can create a custom +component. + +### Create a custom component + +In order to create a custom component: + +1. Create a layout for the custom component + ([example](https://github.com/google/android-fhir/blob/master/catalog/src/main/res/layout/custom_number_picker_layout.xml)). +2. Create a class for your component that implements + `QuestionnaireItemViewHolderFactory` + ([example](https://github.com/google/android-fhir/blob/master/catalog/src/main/java/com/google/android/fhir/catalog/CustomNumberPickerFactory.kt)). + In that class: + 1. Pass the layout resource for your custom component in the constructor of + your custom factory. + 2. Override the `getQuestionnaireItemViewHolderDelegate()` function. It + must return a `QuestionnaireItemViewHolderDelegate` which implements the + following functions: +3. `init`: a delegate function for the `init` function of + `RecyclerView.ViewHolder` +4. `bind`: a delegate function for the `bind` function of + `RecyclerView.ViewHolder` +5. `displayValidationResult`: displays the validation result for the answer(s) + provided by the user +6. `setReadOnly`: configures the UI based on the read-only status of the + questionnaire item + +### Apply a custom component to questions + +Now that you have defined the custom widget and its behavior, it is time to +configure the Structured Data Capture Library in order for the custom widget to +be applied to the appropriate questions. + +1. Create a QuestionnaireFragment.QuestionnaireItemViewHolderFactoryMatcher + ([example](https://github.com/google/android-fhir/blob/master/catalog/src/main/java/com/google/android/fhir/catalog/CustomQuestionnaireFragment.kt#L26)) + that defines: + 1. factory: The custom component factory to use. + 2. matches: A predicate function which, given a + [`Questionnaire.QuestionnaireItemComponent`](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/org/hl7/fhir/r4/model/Questionnaire.QuestionnaireItemComponent.html), + returns true if the factory should apply to that item. +2. Create a custom implementation of `QuestionnaireFragment` that + overrides `getCustomQuestionnaireItemViewHolderFactoryMatchers` + ([example](https://github.com/google/android-fhir/blob/master/catalog/src/main/java/com/google/android/fhir/catalog/CustomQuestionnaireFragment.kt#L22)). + It should return a list that contains your + `QuestionnaireItemViewHolderFactoryMatcher`. +3. When rendering your questionnaire, use your custom implementation of +QuestionnaireFragment
instead.
+
+## Localize questionnaires
+
+When rendering your questionnaire, the library will look for the
+[translation extension](http://hl7.org/fhir/extension-translation.html), and if
+the lang element matches the application default locale, will use the value of
+the content element of the extension instead of the text element of the
+questionnaire item. You can also use the
+[Locale.setDefault()](https://developer.android.com/reference/java/util/Locale#setDefault\(java.util.Locale\))
+method to manually set the locale to check against.
diff --git a/docs/use/SDCL/Demo-app.md b/docs/use/SDCL/Demo-app.md
new file mode 100644
index 0000000000..db3f56c23a
--- /dev/null
+++ b/docs/use/SDCL/Demo-app.md
@@ -0,0 +1,11 @@
+# Demo App
+
+![Catalog App Hero Image](https://user-images.githubusercontent.com/7772901/171482222-7b3a4b55-3cb5-4deb-bf25-bc1e44fe9017.png)
+
+The *Structured Data Capture Catalog* demonstrates the capabilities of Structured Data Capture Library. In the Structured Data Capture Catalog you can see and interact with components and layouts that are supported by the Structured Data Capture library. The components and layouts are interactive, so you can see various states, interactions and transitions.
+
+To try out the Structured Data Capture Catalog app, you can either run the catalog module in Android Studio or run the following Gradle command:
+
+```shell
+./gradlew :catalog:installDebug
+```
diff --git a/docs/use/SDCL/FHIR-specification-support.md b/docs/use/SDCL/FHIR-specification-support.md
new file mode 100644
index 0000000000..b446c73193
--- /dev/null
+++ b/docs/use/SDCL/FHIR-specification-support.md
@@ -0,0 +1,213 @@
+# FHIR specification support
+
+There are two specifications that serve as requirements for the library:
+
+* [FHIR Questionnaire](https://www.hl7.org/fhir/questionnaire.html)
+* [Structured Data Capture Specification](http://hl7.org/fhir/uv/sdc/)
+
+In this section, we will provide details on how each requirement in these two specifications is supported by the library.
+
+## FHIR Questionnaire
+
+### Questionnaire item
+
+The following table summarizes the library's support for the key fields in the [questionnaire item element](https://www.hl7.org/fhir/questionnaire-definitions.html#Questionnaire.item).
+
+| | Support | Notes |
+|:------------------|:-------:|:--------------------------------|
+| linkId | ✅ | |
+| definition | ✅ | See [Definition-based extraction](http://build.fhir.org/ig/HL7/sdc/extraction.html#definition-based-extraction) |
+| code | ⛔️ | |
+| prefix | ✅ | |
+| text | ✅ | |
+| type | ✅ | See [Questionnaire item type](#questionnaire-item-type) |
+| enableWhen | ✅ | |
+| enableBehavior | ✅ | |
+| required | ✅ | |
+| repeats | ✅ | |
+| readOnly | ✅ | |
+| maxLength | ✅ | For text only |
+| answerConstraint | ⛔️ | |
+| answerValueSet | ✅ | |
+| answerOption | ✅ | |
+| initial | ✅ | |
+| item | ⚠️ | Items nested under group are supported (see [#726](https://github.com/google/android-fhir/issues/726)); items nested under non-group questions are not yet supported (see [#910](https://github.com/google/android-fhir/issues/910)). |
+
+### Questionnaire item type
+
+The following table summarizes the library's support for [questionnaire item types](https://www.hl7.org/fhir/codesystem-item-type.html).
+
+|Item type | Support | Example | Notes |
+|:------------------|:-------:|:------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------|
+| Group | ✅ | | |
+| Display | ✅ | | |
+| Question | ✅ | | See sub-types below |
+| Boolean | ✅ | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_boolean_choice.json) | |
+| Decimal | ✅ | | |
+| Integer | ✅ | | |
+| Date | ✅ | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_date_picker.json) | |
+| Date time | ✅ | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_date_time_picker.json) | |
+| Time | ⛔️ | | |
+| String | ✅ | | Rendered as single-line text box |
+| Text | ✅ | | Rendered as multi-line text box |
+| Url | ⛔️ | | |
+| Choice | ✅ | | |
+| ~~Open Choice~~ | ✅ | | Deprecated in R5. Use `answerConstraint` instead. |
+| Attachment | ✅ | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_attachment.json) | |
+| Reference | ⛔️ | | |
+| Quantity | ✅ | | |
+
+## Structured Data Capture Specification
+
+### Advanced form rendering
+
+This section summarizes the library's support for [advanced form rendering](http://build.fhir.org/ig/HL7/sdc/rendering.html).
+
+#### Text appearance
+
+| Code | Support | Example | Notes |
+|:-------------------|:-------:|:--------|:-------------------------|
+| rendering-style | ⛔️ | | |
+| rendering-xhtml | ⛔️ | | |
+| displayCatagory | ⚠️ | | `instructions` code only |
+| openLabel | ⛔️ | | |
+| hidden | ✅ | | |
+| itemMedia | ✅ | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_item_media.json) | |
+| itemAnswerMedia | ✅ | | |
+
+#### Control appearance
+
+| Control appearance | Support | Notes |
+|:-------------------|:--------|:------------------|
+| itemControl | ✅ | See below |
+| choiceOrientation | ✅ | |
+| sliderStepValue | ✅ | |
+| width | ⛔️ | |
+| collapsible | ⛔️ | |
+
+##### Item control
+
+The [`itemControl`](https://build.fhir.org/ig/HL7/fhir-extensions/ValueSet-questionnaire-item-control.html) extension allows for the selection of a specific control widget for questionnaire items. See [example usage](http://build.fhir.org/ig/HL7/sdc/examples.html#itemControl). Item controls are only compatible with certain questionnaire item types (e.g. drop down item control cannot be applied to boolean type questions). This is listed in the `Compatible item type` column in the following table. Unsupported item controls are omitted in the table below.
+
+| Item control | Compatible item type | Example | Notes | Image |
+|:--------------|:---------------------|:--------|:----------------------------------------------|:-----:|
+| Page | Group | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/layout_paginated.json) | | |
+| Fly-over | Display | | |
+| Help-Button | Display | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_help.json) | | |
+| Auto-complete | Choice | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_auto_complete.json) | Filter-forward based on inlined answerOptions | |
+| Drop down | Choice | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_dropdown.json) | Default for 4 or more answer options | [](sdc-ref-dropdown.png) |
+| Check-box | Choice | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_multi_select_choice.json) | Default for repeat answers | |
+| Radio Button | Choice | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_single_choice.json) | Default for less than 4 answer options | |
+| Slider | Integer | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/component_slider.json) | | |
+
+#### Additional display content
+
+| Code | Support | Notes |
+|:-------------------|:-------:|:----------------------------------------------------------------|
+| supportLink | ⛔️ | |
+| choiceColumn | ⛔️ | |
+| optionPrefix | ⛔️ | |
+| valueset-label | ⛔️ | |
+| entryFormat | ⚠️ | Used in SDC for user guidance, not for validation. However, we use it to validate date where appropriate. See [#1850](https://github.com/google/android-fhir/issues/1850). |
+| shortText | ⛔️ | |
+
+#### Other
+
+| Code | Support | Notes |
+|:-------------------------|:-------:|:-----------------------------------|
+| required | ✅ | |
+| repeats | ✅ | |
+| readOnly | ✅ | |
+| rendering-styleSensitive | ⛔️ | |
+| optionalDisplay | ⛔️ | |
+
+### Enhanced behavior
+
+This section summarizes the library's support for [form behavior and calculation](http://hl7.org/fhir/uv/sdc/behavior.html).
+
+#### Value constraints
+
+The library supports the following [value constraints](http://hl7.org/fhir/uv/sdc/behavior.html#value-constraints) which limit the allowed values for answers.
+
+| Value constraint | Support | Notes |
+|:-------------------|:-------:|:--------------|
+| maxLength | ✅ | For text only |
+| minLength | ✅ | For text only |
+| regex | ✅ | |
+| minValue | ✅ | |
+| maxValue | ✅ | |
+| minQuantity | ⛔️ | |
+| maxQuantity | ⛔️ | |
+| maxDecimalPlaces | ✅ | |
+| mimeType | ⛔️ | |
+| maxSize | ⛔️ | |
+
+#### Choice restriction
+
+The library supports the following [choice restrictions](http://hl7.org/fhir/uv/sdc/behavior.html#choice-restriction). Note some of these are already covered in [Questionnaire item](#questionnaire-item) support.
+
+| Choice restriction | Support | Notes |
+|:---------------------|:-------:|:--------------------------------|
+| answerOption | ✅ | |
+| answerValueSet | ✅ | |
+| answerExpression | ✅ | |
+| required | ✅ | |
+| repeats | ✅ | |
+| readOnly | ✅ | |
+| minOccurs | ⛔️ | |
+| maxOccurs | ⛔️ | |
+| optionExclusive | ✅ | |
+| unitOption | ⛔️ | |
+| unitValueSet | ⛔️ | |
+| referenceResource | ⛔️ | |
+| referenceProfile | ⛔️ | |
+| candidateExpression | ✅ | |
+| lookupQuestionnaire | ⛔️ | |
+
+#### Calculations
+
+| Code | Support | Example | Notes |
+|:---------------------|:-------:|:--------|:-----------------------------------|
+| cqf-library | ⛔️ | | |
+| launchContext | ✅ | | |
+| variable | ✅ | | |
+| initialExpression | ✅ | | |
+| calculatedExpression | ✅ | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/behavior_calculated_expression.json) |
+| cqf-calculatedValue | ⛔️ | | |
+| cqf-expression | ⚠️ | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/behavior_dynamic_question_text.json) | `text` only |
+
+#### Other control
+
+| Code | Support | Notes |
+|:---------------------|:-------:|:-----------------------------------|
+| entryMode | ✅ | |
+| intial | ✅ | |
+| enableWhen | ✅ | |
+| enableWhenBehavior | ✅ | |
+| enableWhenExpression | ✅ | |
+| usageMode | ⛔️ | |
+| constraint | ⛔️ | |
+| endpoint | ⛔️ | |
+| signatureRequired | ⛔️ | |
+| ordinalValue | ⛔️ | |
+| text | ⛔️ | |
+
+## Expression extensions
+
+This section summarizes the library's support for [expressions](http://build.fhir.org/ig/HL7/sdc/expressions.html).
+
+| Name | Support | Example | Notes |
+| ---------------------------- | :-----: | :------ | ----------------------------------------------------------- |
+| variable | ✅ | | |
+| answerExpression | ✅ | | |
+| initialExpression | ✅ | | |
+| candidateExpression | ⚠️ | | [#1038](https://github.com/google/android-fhir/issues/1038) |
+| contextExpression | ⛔️ | | |
+| calculatedExpression | ✅ | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/behavior_calculated_expression.json) | |
+| enableWhenExpression | ✅ | [JSON](https://github.com/google/android-fhir/blob/master/catalog/src/main/assets/behavior_skip_logic.json) | |
+| answerOptionToggleExpression | ⛔️ | | |
+| itemPopulationContext | ⛔️ | | |
+| itemExtractionContext | ⛔️ | | |
+| constraint | ⛔️ | | |
+| library | ⛔️ | | [#1060](https://github.com/google/android-fhir/issues/1060) |
+| launchContext | ✅ | | |
diff --git a/docs/use/SDCL/Getting-Started.md b/docs/use/SDCL/Getting-Started.md
new file mode 100644
index 0000000000..3d20bf0718
--- /dev/null
+++ b/docs/use/SDCL/Getting-Started.md
@@ -0,0 +1,179 @@
+# Getting Started
+
+This page describes how to configure an Android Studio project to use the
+Structured Data Capture Library, and simple examples of how to use the library.
+
+This guide is intended for developers who are familiar with basic Android
+development with Kotlin, and proficient in working with
+[FHIR](http://hl7.org/fhir/) concepts and resources.
+
+## Dependencies
+
+The Structured Data Capture Library is available through
+[Google's Maven repository](https://maven.google.com/web/index.html), which
+should be already configured for Android projects created in Android Studio 3.0
+and higher.
+
+Add the following dependencies to your module's app-level `build.gradle` file,
+typically `app/build.gradle`:
+
+```gradle
+dependencies {
+ // ...
+
+ implementation 'com.google.android.fhir:data-capture:1.0.0'
+ implementation 'androidx.fragment:fragment-ktx:1.5.5'
+}
+```
+
+The minimum API level supported is 24. The library also requires
+[Android Gradle Plugin](https://developer.android.com/studio/releases/gradle-plugin)
+version 4.0.0 or later for
+[Java 8+ API desugaring support](https://developer.android.com/studio/write/java8-support#library-desugaring).
+
+The following examples assume you already have a
+[FHIR questionnaire](https://www.hl7.org/fhir/questionnaire.html) as a JSON
+file. If you need one, the FHIR specification has
+[several examples](https://www.hl7.org/fhir/questionnaire-examples.html) like
+[this one](https://www.hl7.org/fhir/questionnaire-example-f201-lifelines.json).
+
+## Display a Questionnaire
+
+`QuestionnaireFragment` is the interface for working with
+[FHIR questionnaires](https://www.hl7.org/fhir/questionnaire.html), and also a
+[fragment](https://developer.android.com/guide/fragments) for rendering them.
+See the QuestionnaireFragment guide for details. To render a questionnaire in
+your app, follow these steps:
+
+1. Add a `FragmentContainerView` to your activity's layout to contain the
+ Questionnaire.
+
+ ```xml
+
+ [Application](https://developer.android.com/reference/android/app/Application)
class. Be sure to provide the same configuration throughout your application's lifecycle to avoid any configuration issues.
+
+## Value sets
+
+If a value set is not included as a [contained resource](http://www.hl7.org/fhir/references.html#contained) within the questionnaire or structure map that references it, you must provide an implementation of `ExternalAnswerValueSetResolver.resolve()` which describes how to translate a value set's canonical URL to the list of actual codes:
+
+```
+class FhirApplication : Application(), DataCaptureConfig.Provider {
+
+ private val dataCaptureConfiguration by lazy {
+ DataCaptureConfig(
+ valueSetResolverExternal =
+ object : ExternalAnswerValueSetResolver {
+ override suspend fun resolve(uri: String): List[FragmentManager](https://developer.android.com/guide/fragments/fragmentmanager)
+to programmatically set the fragment to the FragmentContainerView.
+
+```kotlin
+if (savedInstanceState == null) {
+ supportFragmentManager.commit {
+ setReorderingAllowed(true)
+ add(
+ R.id.fragment_container_view,
+ QuestionnaireFragment.builder().setQuestionnaire(questionnaire).build(),
+ QUESTIONNAIRE_FRAGMENT_TAG
+ )
+ }
+}
+```
+
+This example shows the minimal code to
+[add a fragment programmatically](https://developer.android.com/guide/fragments/create#add-programmatic),
+but Android strongly recommends using the
+[Navigation library](https://developer.android.com/guide/navigation) to manage
+navigation in a real app.
+
+## Collect a Questionnaire response
+
+Once the user has finished filling out the questionnaire, you can collect the
+questionnaire response. Typically you should use `FragmentManager` to find your
+questionnaire fragment and then call `getQuestionnaireResponse()`.
+
+```kotlin
+val fragment: QuestionnaireFragment =
+ supportFragmentManager.findFragmentById(R.id.fragment_container_view) as QuestionnaireFragment
+val questionnaireResponse = fragment.getQuestionnaireResponse()
+```
+
+The form answers are structured as a
+[FHIR QuestionnaireResponse](http://www.hl7.org/fhir/questionnaireresponse.html),
+which is a structured set of answers to the questions in the corresponding FHIR
+Questionnaire. More specifically, it an instance of
+[org.hl7.fhir.r4.model.QuestionnaireResponse](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/org/hl7/fhir/r4/model/QuestionnaireResponse.html)
,
+a class in the [HAPI FHIR](https://hapifhir.io/)
+[Structures library](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/)
+which is used as the in-memory data model for FHIR resources in the SDK. This
+provides a relatively convenient interface to work with the data:
+
+```kotlin
+// Get the first answer for the first item
+val questionnaireResponseFirstAnswer =
+ questionnaireResponse.item[0].answer[0].value.asStringValue()
+
+// Convert the whole response to a JSON string and send to log
+val jsonParser = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser()
+val questionnaireResponseString = jsonParser.encodeResourceToString(questionnaireResponse)
+Log.d( "response", questionnaireResponseString)
+
+```
+
+Learn more about
+[working with HAPI FHIR resources](https://hapifhir.io/hapi-fhir/docs/model/working_with_resources.html).
+
+What you do with the questionnaire response depends on your use case:
+
+* If your existing application does not store data using FHIR, you can
+ navigate the response's item and answer structure to get and store responses
+ in your app's native format.
+* If the questionnaire you are using implements
+ [form data extraction](http://build.fhir.org/ig/HL7/sdc/extraction.html),
+ you can use Structured Data Capture Library's `ResourceMapper` to extract
+ additional FHIR resources based on the questionnaire response.
+
+## Pre-fill a questionnaire with existing answers
+
+If you want your questionnaire to start with some answers already filled,
+include a questionnaire response in your arguments bundle for your
+`QuestionnaireFragment`.
+
+```kotlin
+val questionnaireFragment =
+ QuestionnaireFragment.builder()
+ .setQuestionnaire(questionnaire)
+ .setQuestionnaireResponse(questionnaireResponse)
+ .build()
+```
+
+This may be useful if, for example, you allow a user to edit a form they have
+previously submitted, or to pre-fill certain fields where you already know the
+value based on another source.
+
+Provide one of `setQuestionnaire(questionnaireJson: String)` or
+`setQuestionnaire(questionnaireUri: Uri)` in the QuestionnaireFragment.Builder.
+ If both are provided, `setQuestionnaire(questionnaireUri: Uri)` takes precedence and
+`setQuestionnaire(questionnaireJson: String)` is ignored.
+
+Similar to questionnaires, do not pass questionnaire responses over a few KBs in
+size as a `String` in `setQuestionnaireResponse(questionnaireResponseJson: String)`,
+ but instead provide a `URI` using `setQuestionnaireResponse(questionnaireResponseUri: Uri)`.
+
+## Further reading
+
+* [Customize how a questionnaire is displayed](Customize-how-a-Questionnaire-is-displayed.md)
diff --git a/docs/use/SDCL/Use-QuestionnaireResponseValidator.md b/docs/use/SDCL/Use-QuestionnaireResponseValidator.md
new file mode 100644
index 0000000000..94a931c588
--- /dev/null
+++ b/docs/use/SDCL/Use-QuestionnaireResponseValidator.md
@@ -0,0 +1,7 @@
+# Use `QuestionnaireResponseValidator`
+
+The Structured Data Capture Library provides an API to validate a FHIR QuestionnaireResponse resource against the FHIR Questionnaire resource it is answering.
+
+```kotlin
+val validationResult = QuestionnaireResponseValidator.validate(questionnaire, questionnaireResponse, context)
+```
diff --git a/docs/use/SDCL/Use-ResourceMapper.md b/docs/use/SDCL/Use-ResourceMapper.md
new file mode 100644
index 0000000000..d42d6a6f28
--- /dev/null
+++ b/docs/use/SDCL/Use-ResourceMapper.md
@@ -0,0 +1,157 @@
+# Use `ResourceMapper`
+
+Mapping FHIR Questionnaire Responses to other FHIR resources (and back) allows
+the structured data capture process to be more tightly integrated with clinical
+workflows.
+
+For example, if your application has a questionnaire for new patient
+registration, your ultimate goal may be to create a
+[FHIR Patient resource](https://www.hl7.org/fhir/patient.html) based on the
+answers provided to use in your application. Or, if your application has a
+questionnaire for entering test results, you could create a FHIR Observation
+resource. The process of mapping a FHIR QuestionnaireResponse to one or more
+other FHIR resources is called
+[extraction](http://hl7.org/fhir/uv/sdc/extraction.html).
+
+On the other hand, you may want to reduce data entry by loading values from
+existing FHIR resources into your questionnaire. For example, if a questionnaire
+asks for a patient's name and age, you can pre-populate that information from an
+existing FHIR Patient resource. The process of mapping one or more FHIR
+resources to a FHIR QuestionnaireResponse is called
+[population](http://hl7.org/fhir/uv/sdc/populate.html).
+
+This section shows how to use the
+[`ResourceMapper`](https://github.com/google/android-fhir/blob/master/datacapture/src/main/java/com/google/android/fhir/datacapture/mapping/ResourceMapper.kt)
+class from the Structured Data Capture Library to perform extraction and
+population.
+
+## Extract FHIR resources from a questionnaire response
+
+The Structured Data Capture Library supports two mechanisms for data extraction:
+[Definition-based extraction](http://hl7.org/fhir/uv/sdc/extraction.html#definition-based-extraction)
+and
+[StuctureMap-based extraction](http://hl7.org/fhir/uv/sdc/extraction.html#structuremap-based-extraction).
+
+Both methods of extraction require a HAPI FHIR `Questionnaire` that includes
+data extraction FHIR extensions, plus a corresponding `QuestionnaireResponse`
+containing the answers to extract. You can use HAPI FHIR's
+[`JsonParser.parseResource()`](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-base/ca/uhn/fhir/parser/JsonParser.html#parseResource\(ca.uhn.fhir.parser.json.JsonLikeStructure\))
+from
+[`FhirContext.newJsonParser()`](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-base/ca/uhn/fhir/context/FhirContext.html#newJsonParser\(\))
+to deserialize your JSON content to a questionnaire:
+
+```kotlin
+val jsonParser = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser()
+
+// From a JSON string
+val myQuestionnaire =
+ jsonParser.parseResource(questionnaireJsonString) as Questionnaire
+
+// From a URI for a JSON file
+val myQuestionnaire =
+ jsonParser.parseResource(contentResolver.openInputStream(questionnaireUri)) as Questionnaire
+```
+
+The `QuestionnaireResponse` you use with data extraction is likely from calling
+`QuestionnaireFragment.getQuestionnaireResponse()` after your user fills out a
+questionnaire:
+
+```kotlin
+val myQuestionnaireResponse = fragment.getQuestionnaireResponse()
+```
+
+[Learn more about QuestionnaireFragment](Use-QuestionnaireFragment.md)
+and how to collect responses from a questionnaire.
+
+Next, call `ResourceMapper.extract()` to extract the FHIR resources. It returns
+a
+[HAPI FHIR Bundle](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/org/hl7/fhir/r4/model/Bundle.html)
+containing one or more FHIR resources as specified by the data extraction FHIR
+extensions in the questionnaire. Note that `ResourceMapper.extract()` is a
+suspend function, so the following examples must be called from an appropriate
+[coroutine](https://developer.android.com/kotlin/coroutines), such as
+[`ViewModelScope` if you are using a ViewModel in your app](https://medium.com/androiddevelopers/easy-coroutines-in-android-viewmodelscope-25bffb605471).
+
+### Definition-based extraction
+
+For Definition-based extraction, all the metadata required to perform data
+extraction are within the questionnaire, so no additional information is
+necessary. Simply pass the `Questionnaire` and `QuestionnaireResponse` to
+`ResourceMapper.extract()`:
+
+```kotlin
+val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
+```
+
+### StructureMap-based extraction
+
+In addition to the Questionnaire and QuestionnaireResponse, StructureMap-based
+Extraction also requires a `StructureMapExtractionContext` to retrieve a
+StructureMap. To create a `StructureMapExtractionContext`, pass your
+application's context and provide a `structureMapProvider` lambda function which
+returns the `StructureMap`.
+
+The function includes a String parameter which contains the canonical URL for
+the Structure Map referenced in the
+[Target structure map extension](http://hl7.org/fhir/uv/sdc/StructureDefinition-sdc-questionnaire-targetStructureMap.html)
+of the questionnaire, and a HAPI FHIR
+[`IWorkerContext`](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/org/hl7/fhir/r4/context/IWorkerContext.html)
+which may be used with other HAPI FHIR classes, like
+[`StructureMapUtilities`](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/org/hl7/fhir/r4/utils/StructureMapUtilities.html).
+
+A StructureMap may be written in the
+[FHIR Mapping Language](http://hl7.org/fhir/R4/mapping-language.html) or as a
+[StructureMap FHIR resource](http://hl7.org/fhir/R4/structuremap.html).
+
+For example, if your StructureMap is hard-coded and written in the FHIR Mapping
+Language:
+
+```kotlin
+val mappingStr = "map ..."
+val bundle = ResourceMapper.extract(
+ myQuestionnaire,
+ myQuestionnaireResponse,
+ StructureMapExtractionContext(context = applicationContext) { _, worker ->
+ StructureMapUtilities(worker).parse(mapping, "")
+ },
+)
+```
+
+As another example, this code uses a StructureMap resource as JSON based on its
+URL:
+
+```kotlin
+val bundle = ResourceMapper.extract(
+ myQuestionnaire,
+ myQuestionnaireResponse,
+ StructureMapExtractionContext(context = applicationContext) { targetStructureMapUrl, _ ->
+ val structureMapJson = getJsonFromUrl(targetStructureMapUrl)
+ jsonParser.parseResource(mappingJson) as StructureMap
+ )
+ },
+)
+```
+
+## Populate a questionnaire response based on other FHIR resources
+
+The Structured Data Capture Library supports
+[expression-based population](http://hl7.org/fhir/uv/sdc/populate.html#expression-based-population).
+If a questionnaire implements the
+[SDC Questionnaire Populate - Expression profile](http://hl7.org/fhir/uv/sdc/StructureDefinition-sdc-questionnaire-pop-exp.html),
+then you can use `ResourceMapper.populate()` to generate a questionnaire
+response based on the values in other FHIR resources:
+
+```kotlin
+val questionnaireResponse = ResourceMapper.populate(questionnaire, resource1, resource2, ...)
+```
+
+In this example, `resource1, resource2, ...` are FHIR resources represented by
+instances of
+[HAPI FHIR Structures](https://hapifhir.io/hapi-fhir/apidocs/hapi-fhir-structures-r4/org/hl7/fhir/r4/model/package-summary.html).
+To understand which resources you should include, look at the expression-based
+population extensions used in the questionnaire, most often the
+[Initial Expression extension](https://hl7.org/fhir/uv/sdc/StructureDefinition-sdc-questionnaire-initialExpression.html).
+
+`ResourceMapper.populate()` returns a `QuestionnaireResponse` which can be used
+to
+[pre-fill a questionnaire with existing answers](Use-QuestionnaireFragment.md#pre-fill-a-questionnaire-with-existing-answers).
diff --git a/docs/use/SDCL/index.md b/docs/use/SDCL/index.md
new file mode 100644
index 0000000000..b731e0302f
--- /dev/null
+++ b/docs/use/SDCL/index.md
@@ -0,0 +1,30 @@
+# What is the Structured Data Capture Library?
+
+The Structured Data Capture Library lets you easily build Android applications that capture and process healthcare data using the [FHIR Questionnaire](https://www.hl7.org/fhir/questionnaire.html).
+
+## Key Capabilities
+
+* **Render FHIR Questionnaires** Displays the questionnaire for you in a [Fragment](https://developer.android.com/guide/fragments) using consistent, [Material](https://material.io/)-based components
+* **Standards-based form responses** Answers are consistently formatted as a [FHIR QuestionnaireResponse](http://www.hl7.org/fhir/questionnaireresponse.html)
+* **Validate answers** Validate individual fields during user entry or entire questionnaire responses
+* **Extract additional FHIR resources** Convert the QuestionnaireResponse to other FHIR resources to populate a FHIR-based health record
+* **Powerful form controls** Advanced rendering and form behaviors such as skip-logic, pagination, runtime validation and multi-language support based on the [HL7 Structured Data Capture](http://build.fhir.org/ig/HL7/sdc/) implementation guide
+* **Custom look and feel** Supports custom themes or creating your own question widgets
+
+## Why would you use the Structured Data Capture Library?
+
+Forms to collect data are a very common component of healthcare applications today. When building a typical Android application you need to design and code the business logic and UI for each form you create. This quickly becomes unsustainable for the many different forms used in a modern healthcare environment.
+
+With the Structured Data Capture Library, forms are defined using a [FHIR Questionnaire](https://www.hl7.org/fhir/questionnaire.html) and rendered for you. This separates form design from application development, allowing forms to be easily added, shared, and updated without building UI layouts, and healthcare data experts can author questionnaires without any knowledge of Android development.
+
+The Structured Data Capture Library also simplifies the process of creating FHIR resources based on form answers and using existing FHIR data to pre-populate forms. These two processes make data collected using FHIR Questionnaires more meaningful and useful in clinical workflows and enable more advanced use cases.
+
+## How does the Structured Data Capture Library work?
+
+There are three main public APIs in the Structured Data Capture Library:
+
+* [QuestionnaireFragment](Use-QuestionnaireFragment.md): the main class for rendering questionnaires
+* [ResourceMapper](Use-ResourceMapper.md): handles data extraction and questionnaire population
+* [QuestionnaireResponseValidator](Use-QuestionnaireResponseValidator.md): validates questionnaire responses against questionnaires
+
+You can also browse the pages in the navigation sidebar for more information.
diff --git a/docs/use/SDCL/sdc-lib-intro-1.png b/docs/use/SDCL/sdc-lib-intro-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..138f827c0282b6966e4bfcbadbdc057d590d9b18
GIT binary patch
literal 41781
zcmeFY=R;Fl)9|gwqoP!m7OJR7lis8&5s==CRFNJ^ga8pjv0#wyp@^YM?;s_igMxsR
zP(vp~K{^2?BtU5I)^lC=`~Cs%^Xa+sX(!oxty!~X&6+jy+fhaaTJ)DWE}uDbhF<&O
z1Cujn&PAL#^OqIP1>hIOF2UI|XP%$YesJIHnf+$w#rG^4O-OSI5zybD3(Nyg&ZK;J
zC~=+UI6j=+UC}fDT&h=e^lz|C zL>gT}4SJB4u|)hW{A(EaZ-1WLv#m1VRYsv<3ClP;!^?Dh`P}pYW=b$p7&k`^vz@zU z^}S!66+G*7IqmF8NM4U->4?gDgXJP+_pDv=q=Q2USg`45FCg^7>-ohh1A$!?^bn{y zpFU?H<4J5VEpw;r&Sw?Zuk;|hbiUolv1UGxf{KAOdMTWun__%$(DD3V&t-B-__wSn zQOmaL-%S)$&dl?Hi$nUfswE&9$*Ds1f{aZ>xa&zo)ZZ>D>&e~ z7mzPC+1`zCKLSbOg+_T1WQfMKGdZ7f9`wtLH@zyW8DtW^GP0ou|AI4;MOnpJ(m&{= zIdUQ3--`3!>i|gv5R^i|#pb5u8F{GsSuOY{yxlS|U>m&-@uFV5qQl7ZEWrDyU(*RY z{?4Tc<%lmBx9mR$IPCZsS_rr@E*dtZGHE|+%{SO}UOrsI9c}MT!p3YRdjh(Jv d=}b!SPm=%KGTAR zjVfw6un`KI3JP~HK^`_Mp2-cr81W>wZ|$Hz-it2BXwxEOm$!^>tn&L-@GWbP1~-J8 zwZ0jQ8x8f2xqP1j1m+LUYJoGEV`cu<8ES hQUF^b_2KbmjcXPh9@tGy&Z|6DRpmM3n-x8s| zj|1jGI&Y-;h~uyIWfRRvcNb3@ys`#Jp+5TEQ|+A7sTlMNz6iB*(JW0T0iAsnr6p>0 zVvqijnNw^^ZbYyqUuB#e#9dovMZ6Jvo;$BWpOhf>@q?3)u~FjU*6Id&SxqZRp5IVs zHJ79zWBEwiP{w12t #^z=tMH_i?RkgjAQ( z=Eqk=?>F;IxHs3ZLZb>KCp%`gLzgxe%}@=5*_qLo$Ow_jVtV)0CZA7b++RQRo@ty~ z@;SM?3%8Nivb8bE@+YDvXKIWWe`s 1LDVoXLxMeK>GCK}CS+MyS227VGElopX*jDw$ErsVgR=BBTiN=EP z*TF4wuwOFDCU6h4!Sm6pFC~0XzOtJ1O6KP*K&=AQ=k9w)D(5d$$Soo5)+$lbQ5;tb zQ|jyNOgi`IbB4KHLJMzOZAjxgXn<_Pv#49QJix`*3wjJ1_>r;)R)vPkW&|6}0d8p< zu%Poq%KJ5g_iYKwh9%{R7N-W^W WS>Rf6pdZ-Q5SL*3T&K|@`l7%&)tG_*v?wa zjwxRQ$yaQaOd5j)$N0c`HP!(JM1vl)jF`&5%jY#jOFx80+f-((FS1r$_2J3*ktM#) zsowPjB+Jhr71>l<>Ezj9m2;0v0-huS$b%#0kUnhZwM(w^ znS0>~FM)&7ytsXAn9ZJT-6*piAIo+9)!S8wz>*zMmnd4c)naqFy$_L#RNprCG957T z8pevDMe$~PaY_B1{x`LMJyb}s_bg55SM!HWtH|j#zI&3o%m$G$@wdB_y7+KCE|!O| z#M3u4cW%=qVi#4K?Z;YCzE(^FF4kx;b6e7s@{+QRMx{Y3V4&9C6u|QkX!qzeyR<`j z_YfMq+!h>7QN;vv`Murw)gZC$zCI&4AiW6qtxNx0J%bOmG#YNXf>Ls0m$mK7QQClH z2v?cQjNc2`v+Rve4__GOhLP7x%8}-M_gt*G?twqc(3vdZe&)hgxH&j0mF{x*2|JZG z&r ?H6cKh7bP`wv3b%``xd~qR9Nq>*CvfRuS)D*HP$%xMs8l(X!;49z(Z!eK~ zUGjct=P@(a+v*u{k+$VFkZ+$PB5$w3$orR1t=8|yc3+JQeu&1akj%47CQtURt_!^p zLl)e6*qO20NM$H3+X~#coe`gN<+{3j*X~TkP7! @or-9${1<%+Hq pU(yx4*TBn@||k!v)0T?$XN*qBYdL_O~|EdXkc z7rACLp?`<>*v>?SY=2x~+_sV}ZWS&Op`iXEl9uDlXav%4{r1%}_pFU7Sz6CBp7H(P z+QI+%5=s6b)5-o~g6qzY-a?1=utNQGxx$YhhrK?2zCe@nCQZiU$xJ;IYM^%PFAb!; zNI+ukK>w2Pl?7IHPc~l>Ws3@Hm#wA^v9V@2bgU`B^9h?eXxHtHU5R9bh()=C3W6dt zUS=-c+7uw2)DtI7yVXu8&yemp+F36Hnx7Bd(I)NYYcF?~Rml-&F|q-WNx5?u=p-CM z$ti@o4}S^8+l-f`tG32VFzRtYS%<=hLof>-PGMmze9R*P+XGTVY5@t2E=Medoi8f% zGZnv7*j7LO{MT5Cseoy#CjD3$LDKbz+jIaY!1liAUAY7_gkl(B^uVzFs1mg^HRifc zmQOpLMT ikzm$(qJ3XoeNjbkMv8=BIDft&aLc1H^Inba vv!@ElKfJk^LVK* zr4X^V<=RY4Pphssl+;x_5_@-aBcg9&OxH54c98c8gbmbL_rvx+XUFdXi44J89%eg~ zwY*JQ?n< H5e^)M^FOJdR|cN9}OD*yhxvh z&$u$vp5ICNuxk+k_k7EI7uBU*76Pgtu<|9xy6SPet&dlD+arkP?Uy (xmSjYLhnA^h)5jIlgB#;PJ0NDfYQ!^ z{*}HL3lrZX;j*c8s NYQi5dwF3wM!fB3`i Z zD! t7oghH&svNfrM=E)3QC>svqC6p_)}#JZb(ugAkK?bR$@x+6 zJul7lJ+g~KU4!;(anDP~TpIJNL69;|^`)@POR0$V6KYwBLw#jX0Cm@DG@7ZD{rIDE zl#u)Ir pPD$Xv|xX4640!>`&hj?l_A2Z{m7m8@+Yz z82|pqK4e?OG|#o-gJ0!iy6@>#?LKL;K3uwHSJYGT#E3H}E#9Cn&@`h9{i)*eN?RZ8 z?q~x~#j7Hqm=c?M%mJ~UaI}1>;3H&Q7|6})^C%`5F^vCuE4EzS!$V4U8>H!GvWG9F zxZXQGslEkhN`XW2=?Bm=%5>ORgcQ3hB){?Ty;G}1U~tL-cR!|}6kvq}P)6$53)dJ+=&OK5WXMx=on-^^xh0zoE+t|@TM z%T=F~SJwy-zi1ZPGLQk}JHkj2CabgcRUpLd5385IyTX%JZO2OWZQ6sDV}Vg;HE%&! z4Kq1(O@5EM-gQ6%n Oysp@jhjVjmCc) z#9BAZc@gSR1Z9|}1kxxWecyd+?$5BeLfam{C^64N{+5peN9YbAf1dmIq0pVdJ7f9U zPQRODW@dih*gv1ZUkr?Cj06pJg-nz#$q!{*iRCM=8PQxWa_N7fEv#Pbw+k~qoGmWq zR;QSim~ {V|UEF@$ YQU&kLX~k7C`_Fz0UdH?*8voW|9nh2S1~Vb5`2jk)zQ0 zmZ>)KxQ(>yl+!8T!Mz+js3%LQM8tg9Lex}Se!%wEf0n;<`n>UmTLbYAM$Bam3S0g% zAK78@+t~6yGgVSoL8Q6OsO5@O-gu&o!|@LJ24Zt)KAn5k@|{^KTXv%WM#ZD`l)C7; z@8Xtrdi3!Q#*lizOY42yKPn pz<5GFZ RyIIE7XBBb2EV%s xGlcd*|0$0-8hxh-OI@xib=vZ2Q+nI2u+PhxGChfL9{7s6euKb+B_=MJJlebib zR(6O*`6kt!vH&Np=pllAy|Tv`nm2i3%-i~;k`HnxRgZgZRsCKz1`kwJhw}aFYWz)( ze#qR?=aB4}@I7S})k9Zcq{>)Dqf>e ?+C72tFrH=wi?%!X zXUC5{&F~vRwLY~yVc)hqom?ih4lz^XwsJp`rve4sXbyLk1t+8*GCFG8J)8HX*gDdT zB@Cuyzeg7487Oz+O6}^u))C#UF{;-w?aGS9{a0N3D==c!#LdsC=}AK%E)kn|g@g9) z@vDgP<4JGN;g7?cvy@L()8v2X^fH6V*p2X01 Dc>NTWr^<(|gM+Ktg# zqRSb`YiCShM*bWEuOf|9f=d^V1fcTt^%ZV2oAp}ddYC?Enj{kq_713O*o0Tzh^FiJ zF?bh6K>_^ivqEopky^S$L^uzy1a#H*C(O$1JGtgJ++oyDF<2z0k2_ELsZP1=|Fppn z$>Y 5e9WcQw_pzJJQq&00Mi_5He-^Z?n2lHr!VB$1BYHH(UF~s{IUNfKv(A zY(=_9<3?p6ISY{%W1!F#QvLV^UjF;2E-^5a;6t2EkBOmpAnGEY{=$_|PQzP?n5pXQ zY^koTvGy>=@81B}NgsosFcT^*!}Qn92Vi9>r>NkSEwLH+(G{)tQ2P)`jCd*KaLcp3 zxm~4nhrJ`RJ5E}FHz;4F%5DZN?M;~}+gB>LZ<%7yCkB6e;hMk=uRAmlEM4r^Soxwh z2-} txGAeyLLt2fvwESWu&pXIcv&y`_%Kq7BhOs%fdi=nP!%ZijrcJ44 z2bg@q+RXT7 z$HdGvc8Z@#U;&Xc9 zO2EVG+mBs NKd)?6->q=AUt^A-lxhTSVy= z?CYn+$y+bQ4dPOgocAl6*SW@ieG1)_=*>Iig4hQKCgS%7N7o9&37wmVaC{JAR%Cy~ zM%qawVkI*uxsf_5{iNq)vB+}ZQ4vMXNh<^DpoO4uQwvT~s5A9Mc#)l(oHiUl)~8n4 zZHM{zz1`UMFBA>(H
wfHH?ll#xc753`$}&EJ~cn1W>EvC~Cl$x~_|R>BrEWE!v5 z!8PnEUh78U*54Dmn1=9a?F-vm^|d$+ebKm+IOf$jaVRI>89g}J10AaAv6tENvC$-{ zlC8< t z*jyZV|Bhc@k))fWqX)N*{_^n6yC6V+ergd2Pnh*bb<&O4FnoiILC zZF`J`+Dv@ZqyN4+)tEl*QLmzxevVNpm5$fb{&@dl^Y*^<1?w>j^m;c24&A4RPZ39W zIwb1}ZhP3E1N>BVRr8up^Y-g{HSrPf{sO{b`V?Bd^bR9$cxqWSx3=Q&gqry@xO=`; zT8tfHptPMkMJbkX@B@5;^@has4!b&5D|svA8D`oud!o>;Xt1j_gGAV$%1~G}8Edi= z81pK!!>W4Eppu4ooU=m7ucmzcvls+}w<{5K5|QLpPvGD;odNHa5V3UqHvHZ7XUa`% zQp|i!p@j=MD~eIYW3P;X$hZa^t-K8pu>x7)Hz^9jV+U_kDSLC!QwGX@jAf;;@pAH6 zwzM)$!V@Snu(;W4`?nA%43SYTHKD0wf6g%M=n=whs@+C|JPh4EvdQjJ6;J&WASS(~ z&q)j(ho0nXQ^?PABOIz+`i^Sq?Sl$r6Qo?(m_dJ|;^N9IWR+xmy!5p_kP?cKMxDm> zGf!w??z5Qc#f@j_-ZfE~k*h;|1I{$r`~41HD9=HqsxQ7L2Yn)#&9kD`UsP`jgUrZx zRs9y@szZ%adYINj)|I}RO_p0=2eDkT?r&vhrJgG~q+KlWqqe0(n@U7asd)*kyiV&= z)rF80;lhvi&q@DmSkxPO#ZW`AQ9)5BQ#k#0dR_am^7YGp^{&{>pb= JeYg_<7srv7h^TBZb5$xth-8IC_r1e(~vI;5LzPd@b!5z7N7^c3^oZ^$_3!$ zAI)zrCskV*CqB+Zh0%~7Q3u2=28Db>=v&PiZJ-Tb+TsU)tLF6h*u*BAJDsI_U6_=| z^NMjk 0+h-#kLgek zGu2wPR!R?iuwK(K;&*fQVRchOVWMymotI_r+q8JR=!*yP`r;aPG8X)#>bF_|oRYN= zo?u|n#DJL!k@jRZX8`Z7r~_vaJ+MjHIYn#JA9|m*5NH`2Z#!(uQJA*rb+R(`@59iv z?bZaMescB5#;ayZ-Jz~@#E3$Ksp~-fHt6YydG#Wj%=};){jr*2 I((e GycHO;OtPN)VEstbm7` z=2>`~76{fSKAJdCtg{iHr7hiV)PIHKS9SZz;;D&VJzTRTuflDOm1l5ioos|dE#F3B z8qrxlYyEms8OfpD@#djD$TsCO)4PPnkldsNfg--u6_@_ N|<01j0HKwY8WVjhiF z3VmmZz^+8PHzrC2X@3~g=gc7`e6zq?H#^;A!3v9kIwK}?XG2OXebR%`1KiidVu&$) zAaystP`j{^(;+o~Aa=sa%R<}g3RB5N;tn5GB4kUU-fUG-l+lvNO5@LRu7|hjW9myT znrnZb6Yvq5rw|25oAA- 2TAMYc@SySSFF)BBQ(>)7!>|> zHA%e9oAg$-Ckq(%`qC&xPvwbm@3Y=BhqIx*5(-J_+To#VnF}>i5vBF98TLv}1wm=0 zN$oSGeI+deCH88&xEPB3+GwpqRF)yiJB37_gQ0KPO q%t0TLI~tp zVP9E~d6n!BvnpAxiK<9sfU8slY^x#ffdc)N@jdvm{^;TZvkCfy08JSPM`q>SjXTXl z70erS-$llXQUwKIWyGQRQ1~x7y6^w7#m0%#qlN*FzsWZ=>dPVx0s>V667^z(Bb&HJ z S4yiT!e)f{oGKVUlV(J30DjCMT(R#_V%XBOFdfP`W zqDeAy#!Jo%N1?_Q-YFw^xVN?K1gIkmub6xnIhY-r5^Q|DShiAYft4kgwrk@RW%VNi zMV*$msQoOIsW!gkv$5}*UFNz1o7IvjZz?a&@TlxH+2gG-k;A84 Q`S%hQ=$6Qw$pI3xJ}1zGLdRCr+kc)!ME_ z-xW6Wu0kid{}z3LnPFNxesabF6qlw9QqL?}Nj+`-BI(-pv#`-=y&MRD+R65a*k5oJ zXNT-(69*LZfKOdU@Kbrb7wJ7;a!?GzFWa4Z=;on$!s;Qk1%WMQp{JkloTL@Hwlb;R zc|X7)lP`rYwk>cJQbVouQ9?=}UY0}|L}zCpuamn=eAYA5?s{2O$FDXl$Lr!&=~Rd^ z&EDQa=Lfo(bk %J?xJLVHd!<+0DRf@9!NrX)NBq)g zi#1;6&dLawx&+X*PUxR$^=Vs-$M6^v>+pergjY`8Q-G~fFWAWcRcBXL-t=cq{+!)m z6>e^ol2)0F5GQ@)*uJsn$v4RR9Fek|f| eF!oI#t;CK;^0nO+fFqee``!{j<5WM z!L$T3q8$>vhc`$=s<$cjZjVF3cm02A^Y^Xo&xqym;495d#?O_Vh97^I#>5V$4-| ?N*o?yzQBjn>iCJWEj9mfOdn*(NlAN2eykG{zKEfht-d>CdphZ`RB>^^Om`7zS{ zM&OjN>i+NvQIY(l=NGV$Gxla8C%$qa*3TSTyBZ*GQX8VZ=)a@oD?vB5`+76h$SISj z1rHP)N?*+s1%EjTZR=BVt_#LmR}&KlW+D)UD42L#)3ZTBHz(92_k=^Ul&|Fk!B4-m zOP^yA8TW2vyL8dxpAV}Pn{C9L4{s1jg@Rs|TSp`F`pmQn?A3@c7^e#jd=4E{uDbrn zLSb)Hht84mx9PP^W;F#Y8h2RK=vivxk?4^WWqd%2SDEm!Q9uN4S{VaCNMtsm5?`pH zuNp%2@bsU{01E*{eKZ~cJ-l-tr7bTb4Kb0@zOAz)1rm4IctS%!?DSrp9S5&2<9k0s z99cz|rA`)P;a!=0EkAIw;NGM8yV@&~NqoEE*F0%xFY9;#zE*m_fc{kqF6lQ*v>uc) z;sh}$39pm{H2fz-T((YIDQHUJmrpiRu?eo|(mz^!095XedI(vVPD62!e{N_+Ba|bU zBlK gjC&E;VrVN8p$gUpdT3SZTxlG6!6gdqQ;t-w`Yiwj@x< z_psHx)aFq%1OIr-eJm#_VG-c$1kq{@G2DLpK=OHJUNUsvVJo!mSvUr1)aoQ idfo^UP}lxox&0q=)LG!wf^!#{0wD z^GU0m9n@LYWI@s?^5^@jv!UPyhgpgX!>g3#){}okMZl|j?7Hk70YKtlHGjX?qjD+s zjm6vDJ?+-hsy!pxgjMu1&3Zs#m#fU2X{RCi6fnDshAJ*AS0D!Itac-rH_4R7V}N?5 zG6*Z}4JuW9_Glqux->B|Yxj53z$?(9{9AN6$m%8%G59_|eLpS` +cQo6huP?Q zzBWjG?@%ppOuu^Q*K583!++_~QemR<|TCD%GwHx;|Qy*B;&^a$cO zfiz0Iglmygq28x0-fv9+K&;S8WGy6zQ`9F bsJ5;M-zg*1ZE%j5m8jV=D9R67m5Z*pZ1xr#KR?faSm@nt`Sg*eiXuKmf=-3OrC zfPR@F14j1LgRz%_*1t?=>#PfqiJB|v+EVAz_EvZ{0s71zX$YIy 7-2x zUMuc$!^M;wz{5Ze){n+Sk+pLCjx^+B^zcBa;T^$hJ4WBhJuZ09ISN|u-Hu^+4kt)O zlsze#54T-4G{W@Vy-}}&>9(PS?1=WSq%m91s!TYB^f%t=Tu38}a)R>y<3nprqbhOb zwfw6~&O5lVXJ)Blz;2M)r-7IU0Bh|8_2IV~6?&yCck>Q`@1aPGzSwt3GRelUW#_rN z57BxkhwfC>S% S><6KYHg<&>w(W3+(Io SW$ao8LG3( bzG^S?wE-KclLpjC+6f*&fiYBo~qa z7`Mx;b@x3(d&^)dC9cgoI#k7RG|l+dNRRGAr|kxUk6|Cvdb3uzg8=BHdse 3&QFsVEt!|!}s1A w~oRLO!8|E`f`+^xT`5??A{#^nBx7`Y1p8uIMyVI31Y=LQ_6iA4Uu6%BRb@ z^{T?#+Fes6MG@-r6@q*Fu7?S-m206rt{U#+R9VoZPMIR5@F`#mcDWQ#D)qT;x7Q^9 zE 7cdHP!)5Oz z$$`Q>bdAP;vh-NA7 )Rd>T zHBjoFkF5Tl`(;tCMGGFRGflywfzo8RXiE04IZu9yi&R7!xX4}(%ZQWymAmBfL`K~B zf;MvKw7gg*#5B9C$8`Tt$|IB>P-+3sWcqd}ZV;7$e%i=AU#hr)P=uAjL>G%$?x9DE z=rRTxfh_WE7aG}YV@*T(3t}8{Gbi)w-%X(veH!#0z-|F!AX|6F$lj8tu0{hTj=9VK zHJr= yzy<5*^G4-{?n0_{k7`zQs-xi+%|iy-nr7Whab2c z4k)3d+kpfC9}Y$=^+u=Q#m26QZu7`iW84^ZfXuL*XZh}%3*ipGCqdTGq^w?Z2tPOr zg>K~bxbDY%`g#{)pWjz9so(wr*}0z4B(>p5;}UDQJv+$}Y$ h+o6>rumVJMKwGdv2U zEfUsryhjMoF9CLh-ci+x4{O^%JfNC)d{#6%L3Hs4r6er)&Z~8iymj9GR13@TbJNE} zRB{Aga@~H+U}{-=@QO^8(TYY@Ud*REh!fSrDH`v|VS~(=+3u>fgSYq1P{7hn4A!CL zsEkT5P)r! RK9UNR zI?JIcY`U^NxyXQfwaS@tE8qM S(`K$@1|5#?cP!5R%$vEm%k#=_uybDbS< U2pA I5&F#cblplibVEHyjN=!FZ1eJc*|3778nUI2_UU{Spk1)rXTc&09)2nZ- zP;%s}rIC`j^ERW`pIB0kK=h98qfcZw4AOqzm9O=D%0rh?+4xB_Yvu?#zcJ$kVHEfu zLcp=>p-2>vE0cgdoRy7Xb?-81*W)O-IPA$@q*s|mF3M@ W z)6?Op`UynCGMPP-vgZ)AG4^n*_VRW!Da}g3O!W^bVdXmt+mWd
={EzEPbmtdng0E@J}H~` zU00$h!1-u<0}xi}Z`NtJF_@Ud>(ncxUc8epSIl*T`K4q8d1FGB7n{lXhjF@zRzrio zW?dlHOFD!~$iMpl5M+i9 ALQzP 5KQzO4&GrMLk$p6c6l_XV4haOVM=>o|w2gl#r2=x2`n>;%5 z*OtEx+8r&Uq=5n66l)%!TP3LdSFD?2?Q_4|%F~ROV9OX&`*)B%JmXlsjJqSyEThYc zmMT;(?tfV^CqwSXl_1GcXqLiFcJO|8jZ5JpN5}ulHGhZ7R^xWCv*g;to%ZEV@2d_3 zF*#XJ3whv0=$${3na6R+Vn-R 3>z9`yni})@!EDD)%?TSAs7&zJCBv znH52Z-hY34rlK5_zlN)B{TI)h>Wyt9&;Oyvo~i6?n$&uC{?-0yIr#(K_xFySdfQ;e zIDP=hjZT@tzxS;C1we *cKj9Zm@uKorH*Xy@|KrKy94tRU?XF7lR`OMnev$C>4 zs*YRN;)*&;*&rT~zR?p)PIoc5)W>u}?H3Q6KC~<{{Fhn$XC{3HU)6rHF0cLduS|KB zum!x!nA0T@_2LDYFx=y@RvXK9ZS{9t^A*h?zwu(L8emj+Rpd@t4jZC|{VG4u<-C^& z241n=n_uoJ&~=IuQ5Sqvl3CKK&(1lKSz6~y(w9dCdfU7Y4{w)wR|jCAlK`HA3J&m0 zPZ6=CVz1OZSgAC?H@Q;hQk}Gchl5(FzZii+3ud|dlKcTya^-I~n$!J7#<8UjuLgi( ze(Z0i)43pUg8c23ck` @?{CL(rmc+?{)S9@>(<8f z@8@;9o^bN^Bw9uo)hHfh+%JTsR^DH>{R~pC4kklPr#|L1!uEe!{T0KcqX}_ OOydxrsEC@SBSzC(WeHq|ShD^+dCX=p}W(cHMk)|2I)v7d9$kOs0Es zAxW$7qhnq-9j`|5Uo!jAR|-G+I;G!?(D{fo3OQIxb=|WIl kA4wg3lbIa~ GkN(s(j~2zsWXzVV?;#1f^8Oppv%pQvrT$KhA`jXnpAFIP#p+hJB^f#sTRtZj7r zLL(hMdaKrtvT3ywW7MWgR40Oo4~QB>O`^b$@0Y_hz2?@ZJI$)>vAYU2F+tz9HU<`g zk_OzivGD-qz0`~ov(HkSR+jO|SJ+zhDb$REP;yAhZXb6>6t;(R@=7dPkqWtcBg<5q z+v$f{R*!)?;SGTJPTn?YelO+J1_E-4h5c8w(g63G&Z81sD7>N*$LD|aKPWz-tx&(r zqVVH~Pya#jabh!dKHgN|&G^}v8Tudb3k~MGh&qq48D>_w=wnwvq|3CldK(jmsQFd| zs(GuazuX$#2h}m^{eRkf@2IA>u6-0miXwudA|Oo#l-?1Lt{@$$(m@2IBUQQxqSBS# zMM~&Vst`g1rS~p@5K(ENM1jyk;I4r0Ip_VxH^%+vjyvwSzr$a9Y_iv0d+oL7n)8{@ zGuMK|fZJfHkz18z=~&^tyq2%n2;u|3^Ij4!?yJ|er(`!9xlTedbmB1;$q?lSsyE@K zC(ng_J3- +7 1T8#`PAPplH{L#K!5F|5#2TN=945t {@{cCsrAGXR? z@cTfNGvQp->ulvQ z!vyNMxww~@!)he~Z<=t0grxaHulVG7F2fg>JzgT1NZ4-rZ!SBCPq`~G)q(bAvE=u; z1jFA?^O}7eU{oN3G 5HQUQE8$c`Dt SAgvv-E}53dTZ}9Gjj6Q?CE`E-j6}C* kDO z#C7@pIv$I_Yf_*4(pJu{qyhK$?hO}G>J_jQi2N@tokkW?Eb99h?vIvk?w2b{GhrqD zV%n#Gqv+^Rc(*Z>G`Ha?P~GM}_3?4>OY=Wsy5**&in*^>V+BKUBm|Ow0@WRaD93rh z{N$~}hjEMAAceJsMsc?$nB?z|S9|MndZIY$DRb8r!zAoeiQIOR+D8^6O+YPn`P!Ea z;O1vFc=yJaDyJFA?#muEXH1onafX7`&ZPPgLtx(pF!^*!+hQ2gmipx6jwEqcBasHp zwUd8o>aM#wu#9{?8)l=*r}&5Ks8@vNooC|o)G#rE3S z!nbel4M-ZrN9dGtT@ZJEw0c?gR&oc3bq1AyBC!Fm0l^%cbbI#x%ym~WSF=Zj8jYMs z|Bo*Ip#g8G>2ZQqP6g|BoEAry7Ni}twG*R*#Aw&XC3d|!SGd)o?u|8M&$@xd<0V7j z_g5cIfd7}VWC=DeH~xs71I6dofMkxewfr;8M=0gAl;j^lU9SHr#P)Yj#0^Es!J|;) zY{?Up2R6@cKFjx{@cgMhTCGdcW7QzLz5ZjU;KR=g?1_yL*})BqldwAU`P|D>f$N%u z=99@~_h0F7sD4%vg9uVbiG@c37hkWA<@4>cCAYK09u+N4*5#ltdur)K`~u=cF(Ui` z)yiQ}Hvs`?9&0kM5E(UNDv;(4yS<4gi!`NXbheo`7ndOhgxp#nD^nWR(lA(V>gzc; zI^KS$m{X+^cbR<8_A!&^y3) 6I0&9WeNZFyk8URh!v9dx@%&NJ zz3<%A?5&J5JZjCc!{BPK5FzeQ5PWe2>Xr;@^c@ArP NTwze*Cz(dB<`reRY1wN1C0A4ou9u`+v(vlRXT)&BEvG=$aB3d zO7Ey28^EM#;x{P{fhO?8bNj~qtw)Fs(2>~T3w!?{I{s5%R6OU~4j*`7os3GOoKfts ze{c82=Spej{^;8heC^UWH5u_l-0JPyPd( Axk29Rfc>=DnIL_7;#}aKGTaw zD!-g4BwG2-3T-7sEs1+hPL4O~=$Q}*OGi-R69b->EUR=}c1P$4ID!W4>gh-t2}Zbw zQH#Gk{B07F{b8JpCBtFgBac$C9smppe15*}S@B6Ao}1z!>Pm=GH+BG&AIjp`Tg$B+ zp8@gQ)?t!?sH`Jqaf!0HBe4efRTo_Gl$HYtQCWAz$Cieu!aK@>fnRw*k5F--tUJWH zfeP>6+x;Iqn3iHhL5!JC8-raRvoBF;F|oH(J2fI?)6+FkwQ^wj5!-aXzH0;+NN1Tt zHCa *Ds-yte? zm#)$+3x(iUXTLU8=C4DxWF!e~Uz-9i94bJaygp~?^%{rqi&S0Yk6Vet%s?zEXIY-C z`FUca{WcHQEe@_5R#a94nxZpv{>g;G_DvPB4J1<~w-JlXdKY?G2%E8E=8Q&)ZpPw! zCFw2BPG&>@WO8Oo=ipp9hsBVI@);loh=DC!325T9^vxnVY=ndGTqT=XZat#TZs}e@ z(LNC!pTt(1e~ze~(wcOkpRAKbKKv1*2~|4t%EdBcsy;BdD-rblP*P(>Ild4dTfSWX z1e>Jt0G~-zs7!bbYxXoVZ&g8kCmf`QJ)q_fK>J42GN>_AMzQ6oufdSBM%j91s|EI4 zt((x&KB<~InK?Ox$t56D4Bqj79fVGUY(%bf8~u^wYOLQIM+;A6NB!u(bZL^_VE*dv z*C}UW%KmM)%GWKTkgm+kRu$*|yT~0@_<^7$>{?RS#q8Jf>H}eko56;8{ril~1N>Ma z5%4WBkcf5ZH##&HhlI(wyfcm{r1Qs_h`AN6?3XK^$bb}cjdILrFQzrB7t$~5#Ce9v zZu-gc2QY&YPtRP;aIp(%AM!tV*ielCQi)3~@`sAvLki=%CXF_WLw~ESlGdvg&jy!0 z9aCjnoPXQMV@d3cM}&J+uY?HS=9FYDx)|sKBHyHP*YZXPYW)46pv*#_KGe8-q!dx^ zw=$gb0AFwi8|)xH;Uz*;w%~UM{knU^eqaR!8VP=7&bFNlExqFC2bvl|n1cHZi!H#( z<2EQo3SVjwyzn<;ATC|lL-T?6PMUq&rfPSgW);3)axN7lLe(PN`?Gw6HL0k2iL#MR z_4!S#TP@G^_wew;7XBlvT-OBRqz}bFRq3Gnv3v&zpFqb9@yo85kqYbXUAzYe(DAMDsvkL&uDqj6>UqempD%hNP4@=7P2oU+&ZBb>1^wH1JKW<(_!@eL%RSYL z(JKdt&sg+UNK=2k)4^u&ST5hvGNB9|jIe}ml~#=fZ%TDnX1n#b`;VE7r`i-W>!kS3 z{=B;$L2Ww`%^ I{-LT ?TOZ7p|v*y4k&WPsfhQw(>M;)r3leNh7%kr3;)FlfSsHK&@nIEg*i;H1p9gdK{ zRI1*3<8 a7nlQwljfc{8{> !Hgp& LMMP8))#j>q!NX03DwP8zSbTy_}Cq@Q z=F5Ah!6?$Px8t2L82amA-z6iu9#39uaCJB^`JR}$EA00v$&Jy%yG+M(Egg;a7Cux` z6c#)7Ay?*}crAJ-VMS_!KXdBV29k9Ww%;0O3;Vtjbwrw3AlJ0=dsnrC6PtZw5-?)@ zqLbV?hWGq8nAw=Nf*obixK5g(>ef~df{X7L=YZ7&o}OA|ZNKYw1QeZ}+7Bv|u2{rg zZ=GBTJtcHGBrkKk>`v~mvL$l2qFB|Yuvf%oMgF4~?qdDI(5CL%h@NKAt 3M$5R z94Qp3-!Wdq`JM(PjWt47#tYQ1{c^awiFABFy0WqIRcJ^H0SRkgkl&sg*6uFeS@MR_ zk<*BWh+| ze%|kfQEj5WhJby`(DxVZccHE+=~$Fxb&kXO4qhNbq3>n0kxCQfSjp{I2^ui2i&Lz| zh=BD3JJgT$_MOf4VXE+e+FKm+S*EZ7hdi+oqlDbB-PE9=+QCrwPor7A4Vy0fg3aDt zA15`Qj117Dv>@${F(rEV({yZ*SXSO7?&K6b^@|!iYsYhC-$D$cly%F#{^sQ6_j_0t z-L&p6xiX@cAB-~Lq;!=2=ah0@@t>cg$Qyn*{{r1wX1UWgSvYMb^Q*Q)3eVC~CwpLQ zQoCq{^u`R1YjBOeC`{xwZ#y9tL=s&)?5 )Z@zrPuo`Q*E*Zn2{ngRtYXlg}9M_liT| zH-=o7@F7XjJ Q#zwIq>vkB(I|+s`LRaweQ^ z_H{w&l@-eH4-NWtnG ;tgc}UiImq0#-*N9v zPpySd)=9Lh#OZBd*=R2={5^>b#Pk o44(F9VyFVz_!5vY>LSRN-!AH;PmS5qhIsZyev32if5|HYU>TAFA0YbL=cGNnBak zuiPS|yX?(m!8QV^z^qL%__jIg MN0~GKQO o2jX(5*nPzjjz6Q>1=xJnEFn6TEA@;kz*- ziQN2sfvKm`0yi?d7 s1CGzKh1IPL+#0=09hIR zU(%G}LjRZ!NiO$cwP~`&Mr3er#;+SCM$>b>uf2WP0 !;AHOx?K9m7F95 zHdaUm|Ja`%f@E>dk3+GOg~3qgV%^s~@20(s@uAWosOru=Spiy1>CNgai;3#GMP>o& zXAK%`(W3?5&y)B3=6(oFpsa8y+d!F_xJaezN>m7U5xXZg$^i^i$ljXwI<#BLd}O*% zwq75Bea@bxRZLol*q=41Dl?+Oac65O^p+S(uE|hC{A+rrEvg4Y2VlEJ&HebmZ5N|X z28jLPgdMi@HimpgPU2((1SGhG%{NzP#&?nCgK#UWSu#bq_B|*g#))IO*1yrqv1I?h z-uoy;`+|XBmf~Xh@V9)Ufj$SXU=34gS_|Zi2i;yRbH}<%oyF%iU5=~6dyRH@d|}g* z=6gzouJg%f^Lj(z0hh38w gBFyL3pLZMKk6ZUO zFx%CmHS6%TOF?tb?`QFs4qM{x->%Ep8i^{*qNjvIYP2#5MQ$0NSF;|;n(lVlfw>7r zuwk|*dqLp?1*CX+`5qZ*DLt!y2X6>rcgbVz6_?sUg}DuKB2-5yp5IBnyF`~mnc8S~ zqTxA}<|LCpE>eRAwRgK25xyj9KyB~e|F)LFcd6V%@%Q(+Q+e>XL1hZXtca4y^xruS zdAs(42Q3JX0^`^-;WoO`H9ch~@kCDn=a{RdH~Oh~2`Br-P1elm_*|xg@Ajq;`1Xss z{o`^hLPv6NnC$5#$QCW8l9>|b^|8Y&ly{k3DsI2nDjuSJFKD*@*|BV`(3(ky4$vq0 zq7VyIVbJN31Z~+t4dzjw6N-qDitRxgTN({LR4fXgx)_tO8RVKgFAy+snJeoQ0}6cZ zHICzAHOgT* tKineVzmZ*zAr#fBPwb#-35uKFK4Fo z=7#VG3@cMi2iyPbEcRi`#NBTWJL&CM3O9#GLP9RWwRKX&PG?VkOoO73Q#3u|pl^B) zy^SX)+vTx{k^cQ--2W0*A6PfE#3WV$zvPz{sb8A8m-=RkLHlV7>m(jy@w?w zjLejB=5>9`pS@Km!~MPQg{+QL7Mu+CVKQJ<`~j@f+XhYeuEW8EOis`*h2iA?axs(O zg}xM?+BsTr`eJNInz(y;q%*NG>OCJCKidB2p!(*5YZjRH6}#p*F!BvT%1>CX+OiOy z90=GEy^QgPW9$#6AFasWTne4BGls;t27Bl3Ou(>%XTo ?t1 QK@^EkHXhnEx$FQKq7yZ_9pbBbGi?&@cs)EE4dJqLn4Hu)*IgOIGksm~j<3^_8t} zcbq6%1|{fkopdAE#O)w4=ld1{FdJP~#d_LF)*xduFkWxKQ#B1Ua_h`jwd0-(1Dm2u zCWDEE?WRdJxxb0nt2~)5l{AXym7;Yd8I}8SXFh9wvQUd_RPae(nti%0+*fC732spO z0J%7#3m*a>C`ytn?o}ODOn<%BStxY7omsj^nApciy-R}arSZ)U+)F4^h|w2)f~4;- zU6T*+(3faVk=yLXUxZ~f6)IxuqJqs^-!l2D`kP4lVFrH}_5~hHkXKn?N0(4PgzFpi zN)=gYZJa0+Q8cJ*axu8?J+$0HO$}-8Y8ZdW?z} rOKv{^;`*nzv&Q8`d|3+`%YWZA7M$SLvxG ziymut1zrxd_ilDeOEzUmb1&?B5hm#QE^2W-M|^8)vDOPdT?*Mcrj@>)y0hnwy%0TJ zQM-OT*WWt$(+FW4i?QEzq%?N}_J?(2|84+`$0DTE3U=W4UL(tsF`XyIM;cC}JLwnt ztBK;2E7i-U@d3}z)7m{jucr@3?H_N}LU6b^Me1&v_=9k03|Q!IylZflJE2Uf0|(nK zB_Raz3PUhKuj~z=t`*Au+T^2ei`e;KfT{>x-aW5_-y-@zSr>SEf~!HvzVNOEHb*&q z nw;+tvQehEj zUOGw}@8X-!k9jtpV#qA4lzOfU*o1ynpKa;WAvQ=CeSEI4lz|>38KY$UZn8I3bma2< z!eY*J&@2C(w-T*-qs4g+7rN443_sbr%%UnyTf)bGb9^~Pme1>Z(7}4wDG=E32x IW|4r74cPv}^S)2p z<5gzxmDK9iiaeMatjF_)xxLkjWQ9ci;j(v?bG{U#e-}RS$Kpy&_;@_}XI}I2(qhi* znEMWLtUOrdswU0Vq8be XiScA*rVPu z-gWuRl(}9Jnu5WWeC*Yqr>tih^fOzYN?JTWt)*uUZz v~wKlNvx~bm)yo3Z% zv5iOWLp)JT7XDw&42Hdtn< %q}FaUmN#*S#=BM*XJ(=-;|nhw9|~DqgDY zTQHDxgELc#Z99G&_3^LyRg<*-aOX|uT()wMOSskrTvO@Hy>T%I{q|e#DwayQAwJX< z4Vu7*J8w!ICw0N#VA)^8Yqykz&b-bgs2R&iyIbJX8ppyDU=?}50bSW2IKh;~U9yFr z$SDPjl953wo-*o!2#w=l0FAd)q1NPxH;o)zcn)uoI%K5ygvM!*wg6f@fD3{${lsV0 zJ|_e5N~~ l6;Zr(!ca?Hq}^cjMe%Lz$&Ha0qYI;=)T)C^_Nbt` z3D*s$8?pJaC#zSU)3=ok^JFx{kb(U#%Epa!zix40Mw`{s#l?(Hd57R43#N@8$@M6Q zWs*x1%qABN c5wOsn$eVQ38L1tdxd-`xkv`|04l%O#I`Br85nvX< zKFOKJJd@Rfz}J MSC)JQvicRnb%#bd9&fpTlbyb1*S?&>1is=r;258O1bP z&C;U*qPO%x9xO1>p~Wzh<^GWXNRLpC3L^4*j4vY5HE365x*y_rHxvJbstM~ #)E|*DN=9spGeG3!~qrZIfEq<`MiET=s3e$UmZy$o4{VKDdOo<%ny@ zTnVE|9vboFChh{$!Is;Br`*rid*2C052npuzDPk{kUP=xP7f04FOWwQCgq~fs%8VN z8|5l!+TXNq!aXkz+4qKly6 N-iYMMu@wS9lv8!Yi*9pZhKbMF>HStuwPb&?v z-G6WOf5ZTum)?J}b3 nO)H>ku zU~j9MhY$5@U|g3YqN7h6XW&EKo`T yB zlNY^Ay=l+a^;%uP$= rz)Lo2VYR& zVM{^Kg=_2c{dM5s$Yl)81I!i=JG&f!Vq=hd{01eH5Frx!Yh~}4LrjmxVM{hKWxRg) z^19`UlPXqV!z wIwOcBf}f^_@`U z$kXNMG;f-c(7E&FodMoldA7?ZCH!Vl@;!rT)Q6+fz7yY7hZ+pjVWur^10~*0X;N;l zh_C1lwhFqE$Za69?3$*Zc`975JuYR{1-VUL`tp9YBO*h}`WcFY{Y;^D4yTcq+Y(dJ zl?Q{n{n$G77?H|{KiXn^>cY|TamGG4k!xE&!kU`7uUsro@x~B$W2}PN>OSVC-Cye# znES8=^YjQLHN4HsSc7mt4DVB@#Ie+Y%^$l0>Lr_w@m#r>1y+>=EoSMj=I6fW+q7$W zw5Q%UY%Z(c?JLIx9s>{8o>_f1eLL+O{$57WcqM7yUGj>Tm&%a+)rj6~q0g(4?&o{b zL`>5y2XyucpS93$FPshYMc3M2lPQ08`KJ4))mU0C|7Gs{0(F4(H!1L3A;%Ko{0L3{ z_=zg}NtDpyO?t`@0?x=GWU)ZF%u){h4YXi@H^z&*XduGSaV&^4%*gI6C5r9C8~d?B z6PC+L-XtX0_};mxwsFbsp BgnKfh6Kf`kCdKv=*C^~%; zO>*&U*gbs8rpSt$`|`r$p02LM_W8IiYOAwCmq4^W{ysLENxE(I*)M4ZX`jpyr-68# zm-oYCL)@G6yL&u*dS)N8>2G4u0>+~yonP3M0!fW;-x9B}w6(QM4<>KUZ5NT2Rxi}N zyvo#Z<@<-?;oDVJ!fT(u-G?nT3%$$Lfu0u*IxqA@B|7`MvGIgfTzw{Wco!fG@p<>j znpR+j?#NmqrX`B*e96 qfyH6PV%!h6BpbfR9W%p=aM#-}B` z$Os@$<23PF_%Ir93a20flig`Pym}p1Czs%AWX9o*8SxJ8ne}4R58mIgXApW2o^Mpd zricBgv{vi O zt_&k}FU&|NMaMM~nYP`HdqEtnr0dDQ*8IPqXKG3PgfaWYZ<3Q)(uGpiLkE-us(e N%*-t#sZF0oR;)+eG6;`BnHR2IsaR0}e*Yksz+Ze;ep`koe z6+g#8{fXL{$2(v>4h*yWqHlz6-K371O>3p;Fo47ErU@4mcrO_?+6$gs5ONzW@eW?$ zzM8VN%s0IDd4^8FHBn4@6MuA*C@zaBw&6McH?igos>OQ;^DkU_E~LvZJYE=JH_ntB zSQ#x%5p_Z83yX*lxA0W@a=pg#(ZN9QJHj12^)(vI#qVwzX~vp;atDEn({LEzi0Z7Z ztu0raIH`PaW&^8uptXT5WUQeYoIi*VGFmv!{xQnu6v OI z2w&d<#_FY9ABA{#aRn WxlcC{Z&Bt9G9fI8?Bo#pAoYe8DMCrwu&2|!!zQH^d8ls#*6Q!oE zUL{AqZB9!$lRDAp=Xs45>|Q*`OG@%l3p)*;r3u*%+oAU*E)vJe4ItV6B@CY4t5XyE zm%jNbu!YMP8CMmiHRzNY^5L(NkZ}2J&%EgUq;{Y{MZ(6bUv4tGr<6P<_>_%}R*|hI zU95Xg9kx$T!gl)S++2EyEvvLo8R0C+(<+TDsnHSsa%&O=dC=wnQ&x8}U$+ti37hD` z=SzTDdIzk2I=N!%PV_X1p>HY8*=~6)#Dk#azCUjHhGvH7>z?T7R4%hC-ygrpO1nWX z=EhG7g=ra9nB6$oo0nSwtLru0I{(@6^1>Z&o`i }A5C{Rmzt%ZUn-Uu<_)o%QFZ*2LiKmcM}!0Qt#XK%su zMd$A%7i?#qq|?vUlOp+@WPJH%JEuI>`N9+pV3{TxBZdn# zsqU W3f<$Vrn$X|x7!p?p{PDG{VW7*j(-F~7k5n`n6u zJUnh4T6~jjsI|F_boEu(&WdJ`HpFBO>xeHCzDUI1`C^q>|BInGK6!OHwYy$^dkKnA zgGC7>gN)A(`FjwW^!KK7*pHRnkRxm)pf1c@A7~iO4Kl6wd=zpRn;0nNTHM&fboZ}R zP^!Grq8sH23s?B^ZY!6gzmv89R(GdRif5?%SmKSLG6hn}YEOvUugI6p0pqxF_5N;w zI@p!VWS(~Y$#cDZv#*j~p45fJVPu|LKe-=Px M2Z~o+89IQ$~F(<_8 zh5kxG9GG*@(nC;^lEldDVvOACS9XRZ?#{`8EhLBtzol3PzwSyJnuSkYCI)s m_N!hB}8IOz%PHD&@DJ zvpAgh;wYvKkgr&nZj-oA44ZRg(+zXYil%Y1r*^Xyf@*HBwo?QV16Gq4aoN|5Hdk$Y zyYs*6vyGIVukTL5AI8VQFu$rqK68`(%{s&c>RfP`BZI+D6mxe_n89scf1J$oFxUF# z)#P7HVBZ>Kqx}F2F?xpK2yXcr6CPSI^_eHb13Wzol 1%{@0vVcTk8+mA0`4GAO^_SNULo0Vi9^};iW3=x4$#LvYI9e z8l+Q>d7}`tyG>sFGW8M;6&~jH%@P?G(V4*65pQ~Q`lhM4oHnp_4!+tqPXn|fg BZ;oGKei7J?3u1tGIE1DCwRR5(=(= zoR`R>*G6oN+o OL zB$X+{U%D>nqCD)h!BOWpk-I`Xbr)QCoc$fs5##1K`-8Q^tQ+x^F6{dY`Iie3hiQj! z`Io7IL {rz=TPtn!JYt;BiB)Ve@Zs2Xv^`>WHp@hnNc|hL`31flmAE7s z!Pajs?iRy$HT@qha--+7?Z@37Av2#0bvE_Kwu1Cey36EJNcTikju?LZQ)7Ejj`jP$ ziErn_0AIvbJ?TwViP2V21(9H##H}BHjw|aS@*Jg}`d?Is8{`mr%I+jS+kKeLk8_qx zIKT{3dv%V?J4!y)|L>lR%7YtoM8AOTZVe^-{v>+P4oYkqGJn!7?-y{#tr7g@Jt4mH zKev%(!9UNg8;?f`h#&Cr(y~m|_G)kt7DkPNawZ(5sl9gBUmu^5aBH+i2IF#S2hUN` zLH^=upAQ2>Si-JXBAwQC{?D!}OHO%){T19Y4HrksKa;gU&y*!=A2h1%d%M5DRy{%h zpf7NLzk6=}Dp|{c@AYx#ekUh&HjT`qx35ec4oTwXOR2_k+jb=hcp(?~t}18rGm5zc zf0h4;BOtnXCZ`iLv4JyqUL kB@Z2i2fH)vg_@D3W2k4}ca8vc`pin0&@#a0KD zJobLK(@VK{$=A8+LhLlx)0im{s7B)o?6iyrPKWSg5z_5hWw%r72?)%p^+N@k8Q)tY zJ4bh{e?|JN^mur&?YZ|dE>4vsIppOmA`;D!WyU@5s1q$;7XRXhwtm| hWFyw0=`y2yvmUP*n zy~}`mv8Bx{cb_{^fX*Q!?Vf73vFHuE0B{@CKa9@vVdGTcdaS`Mm)Bq9SS&i}{fMh6 zXg3&FO`tN}IX R8aQ|{#=pjGkNBx>Xz(y*DJ1z(Y;zXjCCVW z(jNxoi?+zdTn4UJ$`HWDL&8#*4&Nwo9T^OJK%*seA1?oqhf5_r+cP%PL6eE_xc$rx z%fjerX3-9MKo4^OJfQsh!PY}7WodGj$yynlxPxsKy|U!q)Uy+P`RqzPzS1?$H%jOF zlI#n$Q>vUs1ks~73%0$bLQM~U<%mQnoPL_5M}AqzvXI}#KEA-wzv1^fZb=hly}x_? z#R7TYu1wL=N)smpc7l3;v#=L98h2wbqdiGd1VBrc-GvO=p`L5@zfSRBNu(B#;SF ^BNKA!45zOib>B3|V> zYgWZ)4ngCPXDR8p{;;w1PJ_AQ_;o1WPMaxcvnFc}`~8ExC626R9Bi+CVTebyc*vF* z(AdtbjSAag%x+k+qsoSh3oRzcT%^-NG_WD-@pq-+m?wcB9tef%uwKm5(-XVy_| geu7qXns~{uc&VXkN`Q*RJXQF?wrfVBfRRaG zS&~a|?DXolj0#Z~OH;{yUK-|+c3$lC-a`#o6a18&_>)kbu)K&b*(sLihPAfx9Dexg z0(#pXh#&2kLj@oIZH{oqbN2&{=UJK@^2X6VFZ9dIMo$Py({46x+O2O@TTSo?O$OTa z8j8p|P8L9nHx+H6PULOX8HlpC7r`Vb EKD3ng3ttAK27eapi$5YToH z+}6ID22G+6c**rNas~6T#azbAD?a{r?g8$V&OvFnfSh#qxKCStE?JHHFr8f*c-tV2 zp4Z;RlKS8mc&;=ms_bW%Wn8LFe7x&-Bbw*zrD^R9pzLXooSDf&6NELLB(7R_Zr(bN zD{TccDho3Qbo;v?SV(M*%3-6gTUvIi+v&GVb6FTMIC{T-QM(?z2Yg9$*TJHD50ML7 zleL{drYA9*1y#<>Fk5L~l zYadah gvRzwBlRVh(?+qK_UGf?f zFYn)~8RmJ0?4t_zrC!388q^BhlIgAH0F&`QDw#`-KrsQ-3}89c7QtQ{nT1#&AMUec z2k%f r&*&^_sl5FCFp=@5oA8s*8vw}8@Wh`uwXN*@ymf~P1Jt; zSnfbvP5wchu>vGM`k!8YizCHzk-1wxbpQ(~%woe@cvF0I(Ra!k*(B zPh zi^Jtpvso#{;xUAm&+A=h6pud9zo@{MGJV+gcAy!vKNF|`zjCCf`jqWeBN8AnP|!)q z!!E7wf$UO`Jv_k7F4^1BVJWI_y=J|35m1ES&-n#_w4*-cz2Lg6g*{l*|6y*X0V~)s zejT)!)V#p+6tIwf6@~Uq7nTfb WDQTJT8k{sZRSG |uJRwE%mJ zv3kQH&&hHxp&q-F;A@nI^I@BUc^4axmHKb`paWfA?`U9UMrQ3aF{%ZTv%T=AgDV@M zLd1Cx*9-6G6)+batm_5tmCy=JP|c0X95Bm>!3j~j09Lv);T8i!4tYr>h6$l{Xoj7h zGvW55k}6#ggXmie97y0zrBU=P^zV`|pbC8tEUS}B9^O8l+w?{;N3jIa?h0x4*xiHJ zwk`z_d7_X1%gs6yUZO=dYNWE@H6RBnBRmAeGD~wE_Z%&BEVE5*@v#pN_kD2=dD9L4 zHI8YeAvw2EZrdQP^yup3%5Zsd%)RTqwViQ}BO|=mh=u>7y^2x^|Dh%Nk9h5TSk-&^ zkIs*q^#|7b%3WA~elM>h&5eMWhzWDZlxObY1fa^u#obt!jEol|%M)vf#`ACsMN&&I z*qIdbM`Hn@zb50x(s&X (Kmz=yLvSX%o|RQpn{qV1 zFoa?d8uy-b#>F>Q%;iubmNCrYH&lkGJczL~MswZ25^~zdHG%2@%l#iUQNcw$tt+rp zz^Nk5tMlvr6`(mOjm>dQ{>y(lWa(cj1A@K!JSvvX;O{57Zd z&IdoA9-Djh&L4`7wFho;Kv3s7x^uYBydM-a;@X^}FWU7>beaRvK#_x9UmBNKYB2XN zPHQR2)kc`+I!|=KDF270HNMX_vY5@-=tWpAzItT|d{h`Ed$q)yowr_jEu$nl0E0fY zG!&_o0{4+3=v!*uYkVS9KZA4?cAGP|JLNE|M&`}4TSK>-W|21XV&Inhfz`TJi&Ra& z;EEUCg6LZS&e0L=uNg3XYt*5oJ-?v_FxMV`U=w6sFwSj^p3U;#5Np;!ixtsC4EoYz zx-szD-9(*o6~@GOVpXUY68VXp1eGC+8v^rIA}mznSrfk+#_&mb~76h<9;dMGcGq zD%}6Vy-DCt{MYg{AI-?o%Ot)5-!LCXAtBltlPYb|LQCk{!k3OuM~bs|OI~3>?j0xN z-?5)!xk=!se!1J?7nEaFzU)i~_M7p|nJ8>ZZ*kfplHz&7y`4sdbMMvpY0mep?W+si zK?VZYXeWER^w9y!-;tQ*swE#^hD2h$$ZE7PbXeY-02nhdWy1kmUZ^m=h}P;Ld%SRc zr3zDLU)h6aGaTiN8NTO`2zBTh%Cnt>Zet@TeAn@05cP9c&(XCsAs6ok$4T|{G_Gt+ zDW^%zqia0LT5%2{yM0TVO!zG;VkGoJKJ^l`akH=^%;XkpfNMEX<=Cc?K@YgrH%7)4 zZ$pRa`_Q6Zi6@^fCY7WfOy62&shZw5XZ$Yu6ywC}I4(VYYjgt>T6ZV=GN#^j+*0Gx zi0@fUqCTpyY5#jK0j-R@)$|~2LIs~hf2r|btm0p==l?ATE8#&qs{j%8AYy%&Y7QLa z!nbdLbl2WiTzymXjVqj5D`Bls^nXZNK->0{DHAZtMr4a@D2?1XX${rX6aE4h9S??y zSYW;Got?SQHAlcEF;tF@F7eq4{~Z7NHM^6i+^<9Ulqj~#H!6GhzW| GV-PNa9)g)w*rY7m{k zIen+j9 z0KB?#Jr5fc1{inI6ZRvbM}y7Hki?_Dx;EPsN~De sA27bQn9%y-h=uZRY zkNVP>hPRxFNu4X7-n`5zQ$E1a@ykxq1!~F>D87V9y-;_|msdk@O(wJzxWsV9cbHSV z7Iy7RGpI*38@aj?ND2^nlYcgG5+ eo; zhYE+-TZ__H(@r7gB!~>P7$mwH?Qjs5rxIs6+m-Z_n2I2#9QptY3S{}14|5S8^tkFh zm(L%z*EcV*{3bGqTUuhygPWGSiZxJ&|K^t2VantiNSTxnH1HXl(%S?;TT@B5bk8P+ zV@JfaCYS!Z{{Cc=?%$rGnAx>9z7`bx589gYyd_)Jdi&{$88fy$+_+@{!8WDy{XQWm z%;@%M!xj6L$yzbOnP55pJt?n80={Qp(-Q6=HPnlLlJ(FYY+bDtOHBO?+T7<8Q9n!^ zJpuoPyAB9Cpqs)HZ20Go=X(75rqEepsChA(X`boRl?Q^32SdSy1nO93y}C-_+23Sz zL8SL@pH`+0n-?qN0%X7%7~7s!+w1}2ZE%=!xZ;;9Uf-9=-lV0?f<#oOe9 D+L zWfG{9Y=RjpzG`G1Tp!pJd_+itZ040Vc#9C!@bo9*icP(j)DWfqUA{Rk8`O?xe=qEf zH!}-+b}_%n&TbPOymC9Pd|L0x_{STSO9`xpi90EY6}*Q3W>Z)6Ni$YYNoLBVoREEE z<>*W7iw+LLE2}ULx9*FFIl{8d43G#(3(hB~;xC+Me%+9i&0kfB;tJ^x7?$X`^W|!( zK$d0g!;+DkKfFLNLq`*@O5z`lyT8P9qfl<`rT|oBj~S@Ov{y53Y7VWnlUOr&O0rVQ zYzR96oS?u9kkI%L_xZAglq@V8^kwhE#w51yXm}qH!-ixK|D>#qm$RT?9ePo$i7rej zo%9rAvoue(w#h%eEMBI^k9TawXm^XK+jRlfnkrze^-_)a^;>-(w5e!s@=6mPB1Fmx zJMI6dT%H}bHD5i3{zfk}ih7SHHO@xM*~wJim$ICeNwldLIH4E^m;jyMTcZk$pcX^b z4tkwEJ&8YJrO%wr8wt)ODB)ji(yvIw-zqYFi74NUTJM*$Z1BbMQ_=G$Ha6aZ@hChS zM353-0|+_-EZ2v9mw* J% zK#o5lI}JV&Yh)jVKwd!}J$#_`(s&ttHbxtN(7Za4zpR8xG1m{LCti@f`6~?0PE^@C zFRNEnN~7Nr#(neb+0>6v+DA5unRWrUl#=|DQp_a|JmGE@SnsabnZYsh+1j|!W}@jV ztaGe_pfWdxcP~A-1l|X^%DvajO8Ntma)zAk@L!Jq|KFo?_&L%vkd4_kZCK9G$<1-d z)i0ge936%4 4AU8jdo_Ri>9I79o7?I;x=CDaz zUq}o#l2%wP^hOCXjUkct!v%FF?f;B5u$pQL9-Qe_vhO;5&JMe^niy;#-7;&A`O|1I zGUC8^0`l`r01c#6%DuB`v5~>pO8&}=cYFNiidKGKXbR1@_kwtrf1IE$#vu>JO?JVg zufPHfo?;dU2Gb2hcxYu5t_T#Uvf7SUiy}TAm%5@xcI+v|Zq3sNR#Oo)8ui=L7i~w= zg3qzsA2vC83}WyOJRNO{u5=TQr)Z`LEAZYy+3J+oXy@H0|GT$n)1MbrhwtX<2MFt* zWm|1KWf^b3M Q68#>${_Y}-h;esIS4ljlEv>NIx3`O5 z{vgo#+fW+9&PFQ@dDrtEGden7g`=|1xFG!}egH3knIw9Ryxo8kgKj~d3V Yx>vUmlge)vUXp2 z4Xe;7w-|91U-_|zA>xn(22F_6U3Jp5Gp!Lt+L4ieN8{((BOMrBVP{?VGbT0$t33rq z3rzix8OI@kuSpx(>4NWHL@C_#zrmw_+D|&;iraGvru#1o{vDA-b0KVOD_|vCwMlOv zOS^oH9b$KybV%={6%<}fF-XtU<5f!c_lU$GE=U3yX~E|MK7O3OrOy^4juFk)yxmY( zRJ12c4^bmKdhB8@4d=$ XJIy*+&kAy8b~= zKjtG38ZGV^+D`DAIEqEDq{sWNF_=Q6PLgKIaFCNbde;z7yaf?chUD^Z9o3wD5(_kD z$OOK@U u^I15o|XqGIi4}GAKDmxGeQ6Ud+6pNPICMB!XhJjG5$Zg1k~D>GXAS zHnv~N4;UiU1-T1peAh= hq2f_7>r^VLnuC?v|p@dk6k}mM@dhAr#s+SkX z2dCaL?KLt&dRc%vK6}V^<3`0ujP%xEv*hp?Z{hCIH^sjjsAZTk{6GFoEs*{u>SB{Y zd3xJo!3*wu`c<(!X`Q(pt>pFz7o;zIm36u0ANcfRsw6KJUENia-GWY&m}6HlhmuAs zEgcrUOgDM$i5A=LR@*=+!S@U?NC1)o{ePXX4w>yxCs{<@)q_18{NEM+lr<-N r6qdTpCmf>rgRr`cdUg A`6gE5^@Ri$*l=y| A*Y0nD+0F!abKp_ z1iFf^Q;FUXWO=?0C6v#ZJPC0`i> !zQR4QT^jDm%n%K z2F$#P2}5O?HIL!qtCx7n)DJcbOcOoJZk$^hED^8tpbkEBmVB}Y!E90HioGIq-Rw@4 zxsYX $`3}b_&g$!>CeRpshdV{8HJR`!=hOYb$;Iq4dN^ z4;Opd{wsY09W7+`32BN{XgGW{SCNkBGW*!JFDFua*gE}q7lCNjM5+6+GTtL@6h`>b zAyS2>7P1F!X%N5GX5=YWV y@QzwMGra3a=3ZfDMxQ@O<{?1 zxSAp3a-0NVBjt9yD^fMoXHS-4q;HQ{)!eu1(iBVq{n82TFW%0tz7RzpdB&mgm(6lz zHVm_0eDynRz3j!?l@r-6 IC z0W9*k#&_bl;ylZE%v$Hl JNdP`>Vs2)nI;o8xXXP@k_7*Y zW8;-gRXD6Kf@+2tcCc50l%FFq4`oF}Bh_oX1{V|j#&*3vwD6}RvuD*u`jHW*-4>_! zxz~4frtgQ$+B*M!jh)+ot(PHhr6=s*RQWaYRXTv=Ck_2!cmS*#?FW+WQDBPLKW)SL zkO|}EpeY~xV#2oTw~F}kZ^dXy97pq&sXzp|2H)n+N4C6h>(GSSQ1_M$6Ea-Q z^RpT%Z5-}mU)5nr>osuoNGrsLQrnT<(g}A1gPpoF6=s}KC0W`<$y89mi78^wxMIy< zQs)5$xoN>rpX&4y8F^w{-!~%G1;%c9|Dbv_s1hF{j@l1qnj0nV^b~bf5>)fAU+QCl z((z*0D4UFZ=h<`@ljx*t-crZ;qJphMV_RdJsK;TBMAJTPGs|GcDPQBc2d6_bp*~TL zE8Jz%A=cD$66csIdzp8c-$<9+&a{Ff#C_kqU}HGvep)iV74f0+8AB?i28cD>N#b<+ zx_pT1;eiw;H(bcp&0P%Coqp+LHA_^5Mu?|LC(9fwsl!RC;PQ-eL9mHk`a>%nK?~KH zjuVCMQ;phxb xOW z%(-{2|G7M@V7=P4?Y#(ss-q(oT~)Q(@*+)!OeoEzeYg4jV`uWjq?%xq8GVdj+FGLL zwJz>EDs276wXIdlVfn-JPRg-o7(IOriVa6IKZ~#Tvl1@SO4Aj#5IEj#LQdmP2NWa( zEzWN*dP`y=mIqRU#Gh-!u*JG6ed+dI2TABkHg*eNwtkkOmTiaHbq$d`7qRQjCCyHu zVs2wYbrX*eX*;@)G49w3hp0~R54$yD@_cKnt`3P!j^$f_#_j@XO*u380is5kt(#w3 zBOH5>y2X_7tMk1*YFeVqs>d|6E_kt|?2%cWaq=6DG3gAMtJj;g=H0tmT0ES;f=iNZ zl%306@P6Py5ga4^VwEG^KQ5Xz_Dts5bSQBo#)XV^VSr0enZZ=u^W3;eY*0G%z1V#L zc7M)qQS`Yl&%jS0X%;!Zf5M*%=td@}JZI~NWq7`EfhNnsE( hlv!Sn?Ji4>0Z%Ec?axJ=S{Keb? zoltzCXh1iwH42|Okxno`x{UN^R`j{5$0gAC^1J5{J&kCa;LE=^ulllmxNoS#p~6PF zuky(}FF}oLWce6`6+|NJZ#tRA-1_K5{0>*?;E^yVSnW8`EqJs1O}Yarug1NSrqzAa z?&8LnaD-TFXd1pZO_C4;8*BM<3B 8Q #cN&wdXa83hTQOTU``}>cI|AS310cOy7}17jXu%1Pk0uCAKG#v z=`@RusWR@`5BIWb7M gUXbxm{BrJZ;27|v)Gksx zOY4`ctUOaR1$lYCNnuj`WZt}93!dEJQ3BWdMHsrk7*>Hrt~QOyh$GOxRj}YXd#+jJ zZXuBo!_gZjV{{`mK{|toTUd3qTKv=z72u0BA-m4&kklL!qf6NAJN0Zm%Ax8{V7J+J zPcEm5*kVTa%i{2dK%_N;mskSpzF{9_7(lHIVQ2kTpQ>6lm)fJZ-;;tEX8P>AsW*Uf z8F*Sr#4<6)IA-FhmWJ{$ftCATE(fL3ELLmoDQlzrh&R&|*A4fsUAo~i+YiiiSmZ^B zlrIPw+3T~kvzL=%f)5r4vPTCE9PMq33Z;QiDLQSX^VI%P4f?Q2V_lnYFH_L9g@faA zUxgE@AuYdTj`QA04cOS5Q5N<}4eJL1YG=uNE_#fekD6tWX4cONYP9mjXj5R}>GKwg zmG_jKvCs_YGq3%gPJGapFn0gSz^uF*S=N<>+2j?*4Uq=~c;5XbTlC!BZwDb*v=Ilz zxICSxk+PP_8AQ8-H8_Zt--G8-+37MbfhoHpH?DuQ7k>5r#pWY)>p-fg(z#w%vD{xG#sGG0}ETm60axD1^T zdhkJLa&$itZ=)KYCi|u8s^$yd& nw}j@_PB3(d^@`}gvyD%AIc&XQ26DcIO)B|PF+8)R!W7Cr;R&eJ`LD& zX%)Z8j^c^DFS>~99gq~tW9pI*SrR_~sqDhpB)p^>uQZf5)^9 rWh1s; 6ocd51jpgVuamV%csPJ)VoTOTR%Em zIReCP^WS4to!iK~N k?%7NwvGv=VG|NMV${tadI&J UV2;KLIjxdvsWy2hT3tZ5+KpSE*gyRz2)@F*f@uie`;02yf% z7}gp8oI+xkulThh*&{=8F8@e@^tT{EY>$CJ)<~Hwt DFALc`7qDnwLC74Y{?P_xi2DLPN6B@wJgd)h7`7r^^2)#) zYDvn!**FmC+4fAZsT(e)lL)^PQesKq$U{0~#YbNqJFz>N@&A3~A2;{+iH_MCseyZ2 zQ=$7Q8HcYP;i{J{xED}hjUW6^dV3WEC5*WY<{62@%ca}|_<`m8ixxboa+k{>J3X1i z520y_IxmG1$Cgjot-PEagVQx@l5iFT0 zbqE{O^Kg=q_hFEpe;hnbb;atdu~(*~VaAJ@){(6C_HH>&wj29Bg}Sxg6>8^G0BAQ0 z^7^Z}n35r5VYfvsc)3~xmrgP3EoJh*5L?dsi@B)02pQRr03nD52*Io3h{#Cmb4 srBIb?ty~xo_pKm;T)nH@g?Hj$(o9+Y zAGa)*e-m@|zH|Tg#Oqy>2TuSNX21HUaX;nS21tSPkn>4@XRla$Q)K^i0-Jd4NzDI1 z23NU(q3A@F+AmQvv;psAHxncJ52QC?9BeljZV6OG;h*ajxD9!=3uLcX13|^SoS7cC zh6uvM<7z4X?$+D{Y0GrbLJ9IZCAjew&Nn1Yz7#+sh1#C^YH}#x0KnS*9BAJV57(ci z;Pn^QAwi)NCjJx&@j#0DW^?ys{~|?Fs0yH97!Z4{Bh1#CS>aDW{=pI8e}g?<`P);y zA`=QaDajIBO8^7W@Nk}hm;!^55_^K`-j7?Vam&=r%ZV}1MzX9m9W+!GVv@~sWcyAm ze}Xwuf~NwEv`B!>;S&+6l6(EY8C#BwjO?d;vmYz(K^5Cs*HpTmwf}KJT9L;mZ{9|} z_ FZYL$(kCyqd`n8$1f6N6*)buN6qil0LaO3+c76ygS-<$Vmn5u3pF`(Yv^tbbr zJ9ov(%|^Q{)db1R`O4RK+dWA;SO2EgNnl>p_<(usZQ9vbvM)os7dh5$H^mpr&UVDw zR%z$jbWvWSL45;r_!d9bo+t_Q+3A^A+Yb7&-DgtJq`XN<_n*A)Rq ^w Pfa=K;T9zaW1Xs zR;Ljzl}&W|cc_rBK2Tjol41XJ>JaGrNYCQCWhxF-eQ$DWxO~v}z_jq(JQ{7Ioo@jX z&TxeC)DFin3AW6JusTZC9Qaz9ef#LzT9~Pc>5DNpZTBIJY%mx-Ckk0VFR|4wv&P+L z sD1nD*@mhX#}?EGW$2EgSkbLs6E8D;wl-I; zIdZ6L73%stb79D(jF2K_<{{E#3GKvPd>8li>kViTzVrKAQ`DpOWy3sgA6#Idy8! }n-uRAvC&LArf$LO`vku`H$Lg@@x6)5a zlgx7lOwSB=lua-I(HfgzfqbL}cFi31_8e1=POknY(7Bz@e-vTYM_ERiu=4{##mAJw zn8-~>T4P1qhJlZ^=wsLgV)?13B4DQVD}h1#FR*Kligv8E?uZs4ATCOmC1w~^eSsc4 zKj@ab^T?Rp-~6^&Jc|`$i4BU0)ra)vTNeAz>A18v0M>tq3!9_#EMv`O-cqh2E?R)- zL#M_|hzZ~Ss=MjVBNg!cb^SE=Y@LBPA2+#-UD>v8Wpg9gbC-#rus}j+U-2t3c=Xhq zffF$za1H5>Sn;97{$B;U%~VwO{b4^5(oZUrT~0e9XZW-AiYlRmogB4QE_Ui*?}n%{ zt0~?%$j41!pjvYhWe})^^mr`w?EorPBm7W)=^q3~;yJ^xVKp)(k6Be#Gent#QBK3d z>n_%1aqf)+ptN!8pA}@w2GMWsEaej$9+jAymDX%vtK92GZllJmy8?vWAMMJp-SOF8 zPwv@l4#kbGnbdw4o!DjMgf%`YqPNF1el^B3Jo@J-dg}uya^-?Am-_B`!8Lk2c3(ug zAtzO` -DP!_bjVN=Ql*&KKk`m`Ws4buT9H<4_2-Ga#EsdyE4db z!sl`o*QwCU1eJ{G#xR1#zLo7@&MK%J{XOvB+_G_-AtR4i$(RdiT{~keS5~7&6`1$y z&$ur{h>U)cFDnvrTha?4r^}hk6)A_ZwQ8ezJx--1tS^rEd78!Oa$u{!-{--9X|EPv zF7O-3)$KwRLz{S(+&`a#IcR(;3ujlUHTdFn;6et`I0o!_WHJmgn5o%3+Yvpds(7}@ zqN8w8NWgA!E?b%@_r|{Z!b-EkNbr}UvpBf p(yb(TO!y2@iOpYy-%H&! zAzsWGJ+~*#lz(GCktR*I(%1u0B02dSe*PrHPMYnc+H4Gbe_QzF%2P1 KMo-BhYWGO;ZPt?{3)EA{pv)mwl4FKjKioX%Yc93@SXdZ! zK!Kg*!HMV*Oc|kM*)ETh9MbpzoP@=g`>6e34a@^xuC={{3w9ru)gAt*Zs2~=LBk2C z6t5Vy$M_%kawt-`694WPq!Ac5wOdw>QhPfan9r&btG6RK#r$2jRwf6_f5qvP8T%~t zZ|gH{wNMDV|M7<5KAT80)!*18X@*410m6U<%Pcm|Q@*Z0TJu0gobV=SSN1GK?J;T3 z^=DYUpAxZE`I3fN9gzafJDV8W=J;;5^kuAR)v`v<=IFsyqI2WvuOhe1D_>|H8p}V` zqYhQE16>@iF(I~&Wpj5}BO@dClTJY19SW1vY9qsF!UMlu)2k0tk3%54L8`Kl)N$aI z(KTnj@)#|u9+w8v1DT%GJTH|gV$;tq4vgrY=~Yf(U?HAcS|`;OnSIuKge}@H!7sfF z1ioF0MS|{FxD6;S*8qPz07Awk)#FJZDusMRkS5nh`tIc@edXEbQ@eUJNtTeq*l-#E z<)}}b`giDHv2|b0qtCa%Q1+vtHb%bNGlNJt9Da$N7DVZE2TUjs!7NJ~TdwO1OMKE%z<<)W^g2B}Z~?hxOnDyawR zrS=_BLSPn!qgnbZ=Hg(>VM;u!h}X|R9Q)5^Iwgq9W}0b_|M%0@9KE8P2Y#oKvM& zj|T=EoeC!?QWw?w5W!2o|GSi_c=-NzBM AbXAf3+lXR^epP{~~| z%fH_&eUfMSUeqNq%6ht#>^~Q+pa*WIsBGM;?SDRfWa7OV00QtfU<-b$9{;cLk3_~_ zCR3>O9vxq6kMRQxbHA~4Ldw7UPR5^h+rLUf{h#~3Iy2vzR9VmdU!SDT$N5zf60i@* zex5j54M)S zeos{LiP1AY3ca&NoI6=9}PDkN?+r z#u~4ULfibBK`{PEq!rGBxL5}`%4l(qJjt`{>PKt4`8Z1O7uEe0DWCz)|9 qW*Asfd;H08U L(dFp7VSwNWe%N)?aevlI5zjmT`e%$ZeWx)cyB8% kTU?E30lJW$khT3_CBfdKex8WCPbdMIp z5$Ch1XFE|_1H_;CXd!`Sq0m9&my@S}6%s$%qm$(Bil26-MkC2OfLT0_W|`a};2gi2 z_*O_#-Z*(QOZhG3s9|7qzyjHh7AUP8FM+-+;;>A8;w;Ee|7z8REMUUGMM}aiDO@^w zAD`_|9>|rlQG^LNxZ(?>T<1_dZ?u2AYqks+Hk*jo{znGxtjq3d^Js>8GI(F&zwf(a zRN2p|o%I}`^qaSjos~U$=d w*Sc7y{`f z2ceLmp$FQ{eJQsLh_D9cdoxQOB^KBicK{6%KOciAh=b+cbRbzN02CUOJ0*gRaqfi% zg7{=~bJVeG`~d_4s83g^jNyB3wmnG!U^B6u)&nfkJnknUKak)?6vsdy>mY-m0?s3) z&(mKVS1kZLa||*J3~$22Juu6^wo6L!CAgbCpkKW@nRomTcJZOgKv5kk7jD^(mgZv0 zCVX{3xHiVsd_F8B)2OOc$ab(@%ys@LSYc6q?M|zS>xE}6AKBao^(?m=thvQ4V>jyG zop QnyP>wniF*0zZL8a^W0sL&m`Z7vLFxIodbi7v-mn+(LU|jG6U_B%FhPNXa zC=7+rOxp@N2f6w{QJby*v_rZ|Y>spQId(S%!~-4Uo^#9|p2V9eGA zAH!xMbeCJX@{23omh^#Pv;Y0$b*V+iW%y>f^>}qf&Gu~cz7r}EYWoGcH=kTO3s_wF zG5K>Jm@IjrTM0hGrf;~T#Rh`UhhZbdY{E%3>{5@;O2vbs>CTugw-6r4tDl^70V|`9 z$P$uS2XU1M6W`NU;y2Do^+*6xS6Nve5J6zU`8+ndUhb^5@uG1kfbU9j*gxmie}0?A zBgR}S-yw7p%Z!5D@_*P>+>?yirDC=l;?%b5{_)znhUM6+hl< !xTHnt_R?)>FxP&h(0qUTf(yPwWb~ZK*l+6e;KWd %07ghI!fa*(f;$lgQ6+IQkv;p+?{5UI0DBhoKB zgocJm;p|}=e{A@;S#yXR3~f1M=M<6h{^D&E8{*0z>aU)hC za<>kD~x;p2+{r=9f$2bm3ds*A_|D9+gD*K8I_9_;qT z(+XgI4T0ovZ$lSsi$EAMK?pxR%XTxG&1dIHGIaB|{&7HI zK4JIY7-~~0P#QUFmAQ=cQq*1X-I~Pm^}F&v`$;CArk&j_$HjI-LJ!o(b+YBo@d%!Q z+`N+tP^>g%``(mC`+TqN^(H1Wi@O7?4+Bza=T!c2!o9~r0AwvJL!6_qF9s~UuV=hA zi!Z9&t24O*ScF&2$tRO!gL1q!7O`s>$OZYi>G@qG9hc75=Rn!A!fx%?eZOKvU2=S5 z#S()7$ o)qk?~k5gc4Nf4~a13RlWwRJqjvx$wIkka+-dHpa>mMuiI*@;Rre zH! S0L8xBw1K^xx(k$ zs-+}ojg<$lVmC1^H{s)9B?Cx`2an;V#mp{RN^Rrcj1ie9q^eUMv-J JWxz56T2}aA!AxjIUgG~lih|~v- zG@2K<2Uk6dm$ft0>R5TgJE1usc-RBFxSztG|Ev>M@_cRjFRr=mGWZyF5Nv9ZZ4tS* zooVh<)ot?d804-(q;&a!j=>1PLUu_jG0!)wc(L!480WRfvDBUDCmBP(ZVZSblqBTx z!smm10y2-r_pVEh_C#(L_tv5k{O&0TE$K)Oc5j= i%nur>x z9|RegSW}y-$lXVcUKScdGnYUh?~LpWUOCe)HL<@6qif?Yf4TZBTfZc058(RyDaBHx zV#517{;dIXaaLbVHYMTe;3YDvWss>mUxL*kH+jF9uK>8WfGfYcmsN#{1W7X?Y4Qx$ zUJqndM0dnNM*%hjk!9bfe;U(Rc$Yk3y0MUQF)(GpTl*=A;}>i~79o$V=~212e-G{q z=1$xK%b{;0Ek}3E+-b2tvvkN91`K=Z+<-3PZ_T1uy4-!6Bt+MA@0@vciO!LN?^s~f zUGl3EfmM{oUJI$hPQRt#_i}TN*mqU|Y71Tq3+}&e##Y#fLVhN^G >XB{^~r>lFY~z0B$Npc9I_QdQdAvHy$$!Y Z?H&fR-g4xk}+TY z@+oQSLy?B|Fl-Gnm|1+#B>Wfz6rKtmnYR7@z$lQTo-7AE+#!SVrv_OB5rKTB9L@6Q zA5P|QN`ZL+i16I!Vm)>mtb<64zi11Hj@d#w0?8o&wd*>p*3ea-`t~%y{=@Ni$Twf= zN^FPpL1u!f!qwt$r*a?iL30AsM5o^5xf7s%ha^nnb?zTG*saWpi+4bngx=P{&vpId zx>91^e0dP-;nJ@z4`e5pNU9l;*qy|lyMt3{#)tJ8-W~d<7if#`>Z7WGk1oa45-W!; zJ_kWw2? wsB46sLQ2q zfV&vMrOU&iD?wb$&bI?mT`7P&y5qyO00*{>7dhrog%SSR##7bac_06nRC g@?NP%(?JsSdE(a*QNB-&;1BYMCusu*if5J~bc{|?wkFSR{uYbJnPNw9qh_4_^ z9ao+hqezSabv)YoE1 >F<)y|=%0o?9KFPC&(F_q z2fXPTf*F&E0$I>< e##8b3Q zhym^Z%5d<;j#X5cCCddDf{=xje$BEdb(wUDCdil)H +gt4OEkr zbziLyj9`if;0;3Yo#V>yx>69QRt)9JTwxNl`rWiqba|;aHHeu1qV5z!d0|Sv_J!*p z=0XK~V8=u~mO*G;G?;5pwHhU4s}Fh;&_k$l6Hq7=57(Z$oNZW9DE@N;l)p;A<_Cip z?zbq2RclRoj5*6=zjY31Mvj?(H5wCS-pR^V%i^=fMK!saw*nQJz*uYQh1?16O;=?V zF#!;+T_|+Z2^Tvq6KrqIMq6_`>UQBBkkoHr3G;4CKI*3Z_c@n _h=aGTh1`crpTyIk{+#w-4PU$`N}$-1ztc-Y D51JOaeY @P}8~4AE({p zQa$;WX{?-T>D)u{=UV1&fG%Iw-rhd;oz-`%ZgDVoDbRVvONk54SiP8)ZD=k3?LWIK z-_Q={CsBrnQ`@7y=j5cgS*35Xlfavrw5uql4bYl06J1syeb4Flk9VTE!vQN`N3Oa; z(3x<}wT|0j4@-3O;k*?_fD1Jv@ BJ)m07#=9ubhIksqfKqg8t6RO#DTjW*;uF--tlBk(~nvZ zI$4~qJ98fu;rsx^4I|D=+3e<|GV*t&NFg&l!$-EElh;G naZ))rMK{toZ(B4qkW_#>yeKyMZ6;!5XI_je8{Ym3cD#SpSZM9&Z zEm<|FP-6?s9;OpoC!|RI8V){m|FAGQiY)F>a9JCDyRlZ!`AI9wb@Z%JfMEF#MbiMM z+4jf^vqN^D$cB$PAsC#^JT9Q0 OQ;w z1CAhf@w3dF70(*U32vqVeD_%S5`u!P#(4eH `wtgfB^A3~Y^E0OZF<5^Fb=6x* Po@v|Lxbp6#Z9>pXX zc|VtqH_{mtwI|6r{VPAdH)*|5eosk_446v~-RGV6rapM%-*4_L7c@{|w@=;VUF+6B z`#vxe`za9Sz%hA%1>qb_eq#%SZEYevmG?p%X!9EcXW$3Kcv##%H;-#bqVEvc5pxvN zcI`Xzj69x26CnZidJ(j%CiWXod-ABt$>Oi-_<8q>wEzJcR>pTJ-?4vVuEsE>&L&q^ zPE86-4NSnH%hJ`Sb%@fkK)gBn>fZpj{P?DH{uEf23v9&obtHfy%AuAF#xE12-A4cm zwv#oy0;EkN0Qehw0!VMLqS6ryCXbR%;0J#NFD%AZ=KAHaU)J*`;mWO#r{m;fFQy%* z-`)Ssr$#5R=V0XKGFczs@HkbcQN#6H3e`qGjy;P;(aBMk*_YAKNv=z`tXhq6kWN#U zz|@cL*@o4{i5dNPh*Xj^0lZT#Kb5%qq9UB(mT{hG(ez^~*Ary4Hfra0>s}d~0Adw- zxAOPnt7~8ADp!K{S$2$5C0-hNb-f{qat1N*cJ6KWvOhVk?KI(uh!$b6u