From cb7bed50e34a5e1abb49b84e8062f6592865c350 Mon Sep 17 00:00:00 2001 From: Ludovico Magnocavallo Date: Sat, 3 May 2025 23:21:38 +0200 Subject: [PATCH] New FAST data platform (#3066) * copy from broken dp dev branch * remove extra excalidraw file * fix networking yaml * tfdoc * tfdoc * nuke old data platform * fix tests * tests * tflint * high level diagram * make location optional in composer schema * add composer outputs * docs * remove schema docs * tfdoc * update service agent encryption composer def for composer 3 * encryption keys * typo * typo * fix security IAM * inventory * tflint * Fix roles and diagram. * Fix tflint * Fix test DP. * Fix test * Diagrams excalidraw gz --------- Co-authored-by: lcaggio --- blueprints/README.md | 2 +- blueprints/data-solutions/README.md | 7 - .../data-platform-foundations/01-dropoff.tf | 138 ------ .../data-platform-foundations/02-load.tf | 135 ------ .../data-platform-foundations/03-composer.tf | 152 ------ .../03-orchestration.tf | 195 -------- .../04-transformation.tf | 151 ------ .../05-datawarehouse.tf | 182 -------- .../data-platform-foundations/06-common.tf | 115 ----- .../data-platform-foundations/07-exposure.tf | 28 -- .../data-platform-foundations/IAM.md | 89 ---- .../data-platform-foundations/OWNERS | 1 - .../data-platform-foundations/README.md | 315 ------------- .../backend.tf.sample | 30 -- .../data-platform-foundations/demo/README.md | 33 -- .../demo/data/customer_purchase.json | 50 -- .../demo/data/customers.csv | 12 - .../demo/data/customers.json | 26 -- .../demo/data/customers_schema.json | 28 -- .../demo/data/customers_udf.js | 12 - .../demo/data/purchases.csv | 20 - .../demo/data/purchases.json | 32 -- .../demo/data/purchases_schema.json | 34 -- .../demo/data/purchases_udf.js | 13 - .../demo/dataflow-csv2bq/.gitignore | 160 ------- .../demo/dataflow-csv2bq/Dockerfile | 29 -- .../demo/dataflow-csv2bq/README.md | 122 ----- .../demo/dataflow-csv2bq/cloudbuild.yaml | 30 -- .../demo/dataflow-csv2bq/src/csv2bq.py | 74 --- .../demo/dataflow-csv2bq/src/requirements.txt | 1 - .../demo/datapipeline.py | 213 --------- .../demo/datapipeline_dc_tags.py | 419 ----------------- .../demo/datapipeline_dc_tags_flex.py | 432 ------------------ .../demo/datapipeline_flex.py | 209 --------- .../demo/delete_table.py | 133 ------ .../images/df_demo_pipeline.png | Bin 58976 -> 0 bytes .../images/dlp_diagram.png | Bin 28056 -> 0 bytes .../images/kms_diagram.png | Bin 20271 -> 0 bytes .../images/overview_diagram.png | Bin 147940 -> 0 bytes .../locals-01-dropoff.tf | 37 -- .../locals-02-load.tf | 47 -- .../locals-03-orchestration.tf | 50 -- .../locals-04-transformation.tf | 47 -- .../locals-05-datawarehouse.tf | 69 --- .../data-platform-foundations/main.tf | 85 ---- .../data-platform-foundations/outputs.tf | 114 ----- .../data-platform-foundations/variables.tf | 249 ---------- .../data-platform-minimal/README.md | 2 +- fast/stages/.gitignore | 1 + fast/stages/0-bootstrap/automation.tf | 1 + fast/stages/1-resman/README.md | 3 +- .../1-resman/data/stage-2/networking.yaml | 63 ++- .../1-resman/data/stage-2/security.yaml | 11 +- .../data/stage-3/data-platform-dev.yaml | 21 + .../data/top-level-folders/data-platform.yaml | 17 + fast/stages/1-resman/outputs.tf | 5 + fast/stages/2-networking-a-simple/README.md | 2 +- fast/stages/2-networking-a-simple/main.tf | 4 +- .../2-networking-a-simple/variables-fast.tf | 2 +- fast/stages/2-networking-b-nva/README.md | 2 +- fast/stages/2-networking-b-nva/main.tf | 4 +- .../2-networking-b-nva/variables-fast.tf | 2 +- .../2-networking-c-separate-envs/README.md | 2 +- .../2-networking-c-separate-envs/main.tf | 4 +- .../variables-fast.tf | 2 +- fast/stages/2-security/README.md | 11 +- fast/stages/2-security/main.tf | 6 +- fast/stages/2-security/variables-fast.tf | 9 - .../3-data-platform-dev/.fast-stage.env | 5 + fast/stages/3-data-platform-dev/README.md | 261 +++++++++++ .../data-domains-automation.tf | 63 +++ .../data-domains-composer.tf | 123 +++++ .../3-data-platform-dev/data-domains.tf | 246 ++++++++++ .../data-products-automation.tf | 63 +++ .../data-products-exposure.tf | 86 ++++ .../3-data-platform-dev/data-products.tf | 172 +++++++ .../data/aspect-types/test-0.yaml | 46 ++ .../data/data-domains/domain-0/_config.yaml | 68 +++ .../data/data-domains/domain-0/product-0.yaml | 78 ++++ fast/stages/3-data-platform-dev/diagram.png | Bin 0 -> 152881 bytes fast/stages/3-data-platform-dev/factory.tf | 197 ++++++++ fast/stages/3-data-platform-dev/main.tf | 135 ++++++ fast/stages/3-data-platform-dev/outputs.tf | 214 +++++++++ .../schemas/aspect-type.schema.json | 1 + .../schemas/data-domain.schema.json | 378 +++++++++++++++ .../schemas/data-product.schema.json | 290 ++++++++++++ .../templates/providers.tf.tpl | 36 +- .../3-data-platform-dev/variables-fast.tf | 108 +++++ fast/stages/3-data-platform-dev/variables.tf | 173 +++++++ fast/stages/diagrams.excalidraw.gz | Bin 122563 -> 143405 bytes fast/stages/fast-links.sh | 2 +- modules/data-catalog-tag-template/README.md | 8 +- modules/data-catalog-tag-template/main.tf | 10 +- .../data-catalog-tag-template/variables.tf | 4 + modules/dataplex-aspect-types/README.md | 21 +- modules/dataplex-aspect-types/iam.tf | 14 +- modules/dataplex-aspect-types/variables.tf | 3 + modules/project-factory/README.md | 3 +- modules/project-factory/factory-budgets.tf | 3 +- modules/project-factory/factory-folders.tf | 13 +- modules/project-factory/variables.tf | 246 +++++++++- modules/project/README.md | 8 +- modules/project/cmek.tf | 7 +- modules/project/variables.tf | 3 +- tests/fast/stages/s0_bootstrap/cicd.yaml | 4 +- tests/fast/stages/s0_bootstrap/simple.yaml | 4 +- tests/fast/stages/s1_resman/simple.yaml | 28 +- tests/fast/stages/s2_security/simple.tfvars | 4 - .../stages/s3_data_platform_dev/__init__.py | 13 + .../stages/s3_data_platform_dev/simple.tfvars | 44 ++ .../stages/s3_data_platform_dev/simple.yaml | 41 ++ .../stages/s3_data_platform_dev/tftest.yaml | 18 + tests/fixtures.py | 2 +- 113 files changed, 3307 insertions(+), 4433 deletions(-) delete mode 100644 blueprints/data-solutions/data-platform-foundations/01-dropoff.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/02-load.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/03-composer.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/03-orchestration.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/04-transformation.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/05-datawarehouse.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/06-common.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/07-exposure.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/IAM.md delete mode 100644 blueprints/data-solutions/data-platform-foundations/OWNERS delete mode 100644 blueprints/data-solutions/data-platform-foundations/README.md delete mode 100644 blueprints/data-solutions/data-platform-foundations/backend.tf.sample delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/README.md delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/data/customer_purchase.json delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/data/customers.csv delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/data/customers.json delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/data/customers_schema.json delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/data/customers_udf.js delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/data/purchases.csv delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/data/purchases.json delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/data/purchases_schema.json delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/data/purchases_udf.js delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/.gitignore delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/Dockerfile delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/README.md delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/cloudbuild.yaml delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/src/csv2bq.py delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/src/requirements.txt delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/datapipeline.py delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/datapipeline_dc_tags.py delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/datapipeline_dc_tags_flex.py delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/datapipeline_flex.py delete mode 100644 blueprints/data-solutions/data-platform-foundations/demo/delete_table.py delete mode 100644 blueprints/data-solutions/data-platform-foundations/images/df_demo_pipeline.png delete mode 100644 blueprints/data-solutions/data-platform-foundations/images/dlp_diagram.png delete mode 100644 blueprints/data-solutions/data-platform-foundations/images/kms_diagram.png delete mode 100644 blueprints/data-solutions/data-platform-foundations/images/overview_diagram.png delete mode 100644 blueprints/data-solutions/data-platform-foundations/locals-01-dropoff.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/locals-02-load.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/locals-03-orchestration.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/locals-04-transformation.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/locals-05-datawarehouse.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/main.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/outputs.tf delete mode 100644 blueprints/data-solutions/data-platform-foundations/variables.tf create mode 100644 fast/stages/.gitignore create mode 100644 fast/stages/1-resman/data/stage-3/data-platform-dev.yaml create mode 100644 fast/stages/1-resman/data/top-level-folders/data-platform.yaml create mode 100644 fast/stages/3-data-platform-dev/.fast-stage.env create mode 100644 fast/stages/3-data-platform-dev/README.md create mode 100644 fast/stages/3-data-platform-dev/data-domains-automation.tf create mode 100644 fast/stages/3-data-platform-dev/data-domains-composer.tf create mode 100644 fast/stages/3-data-platform-dev/data-domains.tf create mode 100644 fast/stages/3-data-platform-dev/data-products-automation.tf create mode 100644 fast/stages/3-data-platform-dev/data-products-exposure.tf create mode 100644 fast/stages/3-data-platform-dev/data-products.tf create mode 100644 fast/stages/3-data-platform-dev/data/aspect-types/test-0.yaml create mode 100644 fast/stages/3-data-platform-dev/data/data-domains/domain-0/_config.yaml create mode 100644 fast/stages/3-data-platform-dev/data/data-domains/domain-0/product-0.yaml create mode 100644 fast/stages/3-data-platform-dev/diagram.png create mode 100644 fast/stages/3-data-platform-dev/factory.tf create mode 100644 fast/stages/3-data-platform-dev/main.tf create mode 100644 fast/stages/3-data-platform-dev/outputs.tf create mode 120000 fast/stages/3-data-platform-dev/schemas/aspect-type.schema.json create mode 100644 fast/stages/3-data-platform-dev/schemas/data-domain.schema.json create mode 100644 fast/stages/3-data-platform-dev/schemas/data-product.schema.json rename blueprints/data-solutions/data-platform-foundations/locals-06-common.tf => fast/stages/3-data-platform-dev/templates/providers.tf.tpl (51%) create mode 100644 fast/stages/3-data-platform-dev/variables-fast.tf create mode 100644 fast/stages/3-data-platform-dev/variables.tf create mode 100644 tests/fast/stages/s3_data_platform_dev/__init__.py create mode 100644 tests/fast/stages/s3_data_platform_dev/simple.tfvars create mode 100644 tests/fast/stages/s3_data_platform_dev/simple.yaml create mode 100644 tests/fast/stages/s3_data_platform_dev/tftest.yaml diff --git a/blueprints/README.md b/blueprints/README.md index 37a6ae979..dbeb28fbd 100644 --- a/blueprints/README.md +++ b/blueprints/README.md @@ -6,7 +6,7 @@ Currently available blueprints: - **apigee** - [Apigee X foundations](./apigee/apigee-x-foundations/). [Apigee Hybrid on GKE](./apigee/hybrid-gke/), [Apigee X analytics in BigQuery](./apigee/bigquery-analytics), [Apigee network patterns](./apigee/network-patterns/) - **cloud operations** - [Active Directory Federation Services](./cloud-operations/adfs), [Cloud Asset Inventory feeds for resource change tracking and remediation](./cloud-operations/asset-inventory-feed-remediation), [Fine-grained Cloud DNS IAM via Service Directory](./cloud-operations/dns-fine-grained-iam), [Cloud DNS & Shared VPC design](./cloud-operations/dns-shared-vpc), [Delegated Role Grants](./cloud-operations/iam-delegated-role-grants), [Network Quota Monitoring](./cloud-operations/network-quota-monitoring), [Compute Image builder with Hashicorp Packer](./cloud-operations/packer-image-builder), [Packer example](./cloud-operations/packer-image-builder/packer), [Compute Engine quota monitoring](./cloud-operations/compute-quota-monitoring), [Scheduled Cloud Asset Inventory Export to Bigquery](./cloud-operations/scheduled-asset-inventory-export-bq), [Configuring workload identity federation with Terraform Cloud/Enterprise workflows](./cloud-operations/terraform-cloud-dynamic-credentials), [TCP healthcheck and restart for unmanaged GCE instances](./cloud-operations/unmanaged-instances-healthcheck), [Migrate for Compute Engine (v5) blueprints](./cloud-operations/vm-migration), [Configuring workload identity federation to access Google Cloud resources from apps running on Azure](./cloud-operations/workload-identity-federation) -- **data solutions** - [GCE and GCS CMEK via centralized Cloud KMS](./data-solutions/cmek-via-centralized-kms), [Cloud SQL instance with multi-region read replicas](./data-solutions/cloudsql-multiregion), [Data Platform](./data-solutions/data-platform-foundations), [Minimal Data Platform](./data-solutions/data-platform-minimal), [Spinning up a foundation data pipeline on Google Cloud using Cloud Storage, Dataflow and BigQuery](./data-solutions/gcs-to-bq-with-least-privileges), [#SQL Server Always On Groups blueprint](./data-solutions/sqlserver-alwayson), [Data Playground](./data-solutions/data-playground), [MLOps with Vertex AI](./data-solutions/vertex-mlops), [Shielded Folder](./data-solutions/shielded-folder), [BigQuery ML and Vertex AI Pipeline](./data-solutions/bq-ml) +- **data solutions** - [GCE and GCS CMEK via centralized Cloud KMS](./data-solutions/cmek-via-centralized-kms), [Cloud SQL instance with multi-region read replicas](./data-solutions/cloudsql-multiregion), [Minimal Data Platform](./data-solutions/data-platform-minimal), [Spinning up a foundation data pipeline on Google Cloud using Cloud Storage, Dataflow and BigQuery](./data-solutions/gcs-to-bq-with-least-privileges), [#SQL Server Always On Groups blueprint](./data-solutions/sqlserver-alwayson), [Data Playground](./data-solutions/data-playground), [MLOps with Vertex AI](./data-solutions/vertex-mlops), [Shielded Folder](./data-solutions/shielded-folder), [BigQuery ML and Vertex AI Pipeline](./data-solutions/bq-ml) - **factories** - [Fabric resource factories](./factories) - **GKE** - [Binary Authorization Pipeline Blueprint](./gke/binauthz), [Storage API](./gke/binauthz/image), [Multi-cluster mesh on GKE (fleet API)](./gke/multi-cluster-mesh-gke-fleet-api), [GKE Multitenant](../fast/stages/3-gke-dev), [Shared VPC with GKE support](./networking/shared-vpc-gke/), [GKE Autopilot](./gke/autopilot) - **networking** - [Calling a private Cloud Function from On-premises](./networking/private-cloud-function-from-onprem), [HA VPN over Interconnect](./networking/ha-vpn-over-interconnect/), [GLB and multi-regional daisy-chaining through hybrid NEGs](./networking/glb-hybrid-neg-internal), [Hybrid connectivity to on-premise services through PSC](./networking/psc-hybrid), [HTTP Load Balancer with Cloud Armor](./networking/glb-and-armor), On-prem DNS and Google Private Access, [PSC Producer](./networking/psc-hybrid/psc-producer), [PSC Consumer](./networking/psc-hybrid/psc-consumer), [Shared VPC with optional GKE cluster](./networking/shared-vpc-gke), [VPC Connectivity Lab](./networking/vpc-connectivity-lab/) diff --git a/blueprints/data-solutions/README.md b/blueprints/data-solutions/README.md index cce860112..a2b518485 100644 --- a/blueprints/data-solutions/README.md +++ b/blueprints/data-solutions/README.md @@ -25,13 +25,6 @@ This blueprint is deprecated. To create a Cloud Composer instance please consult
-### Data Platform Foundations - - -This [blueprint](./data-platform-foundations/) implements a robust and flexible Data Platform on GCP that provides opinionated defaults, allowing customers to build and scale out additional data pipelines quickly and reliably. - -
- ### Minimal Data Platform diff --git a/blueprints/data-solutions/data-platform-foundations/01-dropoff.tf b/blueprints/data-solutions/data-platform-foundations/01-dropoff.tf deleted file mode 100644 index 152d20045..000000000 --- a/blueprints/data-solutions/data-platform-foundations/01-dropoff.tf +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description drop off project and resources. - -locals { - drp_iam = { - data_engineers = [ - "roles/bigquery.dataEditor", - "roles/bigquery.user" - ] - sa_drop_bq = [ - "roles/bigquery.dataEditor" - ] - sa_drop_cs = [ - "roles/storage.objectCreator" - ] - sa_drop_ps = [ - "roles/pubsub.publisher" - ] - sa_load = [ - "roles/bigquery.user", - "roles/pubsub.subscriber", - "roles/storage.objectAdmin" - ] - sa_orch = [ - "roles/pubsub.subscriber", - "roles/storage.objectViewer" - ] - } -} - -module "drop-project" { - source = "../../../modules/project" - parent = var.project_config.parent - billing_account = var.project_config.billing_account_id - project_reuse = var.project_config.project_create ? null : {} - prefix = local.use_projects ? null : var.prefix - name = ( - local.use_projects - ? var.project_config.project_ids.drop - : "${var.project_config.project_ids.drop}${local.project_suffix}" - ) - iam = local.use_projects ? {} : local.drp_iam_auth - iam_bindings_additive = !local.use_projects ? {} : local.drp_iam_additive - services = concat(var.project_services, [ - "bigquery.googleapis.com", - "bigqueryreservation.googleapis.com", - "bigquerystorage.googleapis.com", - "cloudkms.googleapis.com", - "pubsub.googleapis.com", - "storage.googleapis.com", - "storage-component.googleapis.com", - ]) - service_encryption_key_ids = { - "bigquery.googleapis.com" = compact([var.service_encryption_keys.bq]) - "pubsub.googleapis.com" = compact([var.service_encryption_keys.pubsub]) - "storage.googleapis.com" = compact([var.service_encryption_keys.storage]) - } -} - -module "drop-sa-cs-0" { - source = "../../../modules/iam-service-account" - project_id = module.drop-project.project_id - prefix = var.prefix - name = "drp-cs-0" - display_name = "Data platform GCS drop off service account." - iam = { - "roles/iam.serviceAccountTokenCreator" = [ - local.groups_iam.data-engineers - ] - } -} - -module "drop-cs-0" { - source = "../../../modules/gcs" - project_id = module.drop-project.project_id - prefix = var.prefix - name = "drp-cs-0" - location = var.location - storage_class = "MULTI_REGIONAL" - encryption_key = var.service_encryption_keys.storage - force_destroy = !var.deletion_protection - # retention_policy = { - # retention_period = 7776000 # 90 * 24 * 60 * 60 - # is_locked = false - # } -} - -module "drop-sa-ps-0" { - source = "../../../modules/iam-service-account" - project_id = module.drop-project.project_id - prefix = var.prefix - name = "drp-ps-0" - display_name = "Data platform PubSub drop off service account" - iam = { - "roles/iam.serviceAccountTokenCreator" = [ - local.groups_iam.data-engineers - ] - } -} - -module "drop-ps-0" { - source = "../../../modules/pubsub" - project_id = module.drop-project.project_id - name = "${var.prefix}-drp-ps-0" - kms_key = var.service_encryption_keys.pubsub -} - -module "drop-sa-bq-0" { - source = "../../../modules/iam-service-account" - project_id = module.drop-project.project_id - prefix = var.prefix - name = "drp-bq-0" - display_name = "Data platform BigQuery drop off service account" - iam = { - "roles/iam.serviceAccountTokenCreator" = [local.groups_iam.data-engineers] - } -} - -module "drop-bq-0" { - source = "../../../modules/bigquery-dataset" - project_id = module.drop-project.project_id - id = "${replace(var.prefix, "-", "_")}_drp_bq_0" - location = var.location - encryption_key = var.service_encryption_keys.bq -} diff --git a/blueprints/data-solutions/data-platform-foundations/02-load.tf b/blueprints/data-solutions/data-platform-foundations/02-load.tf deleted file mode 100644 index 32dfe191e..000000000 --- a/blueprints/data-solutions/data-platform-foundations/02-load.tf +++ /dev/null @@ -1,135 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description Load project and VPC. - -locals { - load_iam = { - data_engineers = [ - "roles/dataflow.admin", - "roles/dataflow.developer" - ] - robots_dataflow_load = [ - "roles/storage.objectAdmin" - ] - sa_load = [ - "roles/bigquery.jobUser", - "roles/dataflow.admin", - "roles/dataflow.worker", - "roles/storage.objectAdmin" - ] - sa_orch = [ - "roles/dataflow.admin" - ] - } -} - -module "load-project" { - source = "../../../modules/project" - parent = var.project_config.parent - billing_account = var.project_config.billing_account_id - project_reuse = var.project_config.project_create ? null : {} - prefix = local.use_projects ? null : var.prefix - name = ( - local.use_projects - ? var.project_config.project_ids.load - : "${var.project_config.project_ids.load}${local.project_suffix}" - ) - iam = local.use_projects ? {} : local.load_iam_auth - iam_bindings_additive = !local.use_projects ? {} : local.load_iam_additive - services = concat(var.project_services, [ - "bigquery.googleapis.com", - "bigqueryreservation.googleapis.com", - "bigquerystorage.googleapis.com", - "cloudkms.googleapis.com", - "compute.googleapis.com", - "dataflow.googleapis.com", - "datalineage.googleapis.com", - "dlp.googleapis.com", - "pubsub.googleapis.com", - "servicenetworking.googleapis.com", - "storage.googleapis.com", - "storage-component.googleapis.com" - ]) - service_encryption_key_ids = { - "pubsub.googleapis.com" = compact([var.service_encryption_keys.pubsub]) - "dataflow.googleapis.com" = compact([var.service_encryption_keys.dataflow]) - "storage.googleapis.com" = compact([var.service_encryption_keys.storage]) - } - shared_vpc_service_config = local.shared_vpc_project == null ? null : { - attach = true - host_project = local.shared_vpc_project - } -} - -module "load-sa-df-0" { - source = "../../../modules/iam-service-account" - project_id = module.load-project.project_id - prefix = var.prefix - name = "load-df-0" - display_name = "Data platform Dataflow load service account" - iam = { - "roles/iam.serviceAccountTokenCreator" = [ - local.groups_iam.data-engineers, - module.orch-sa-cmp-0.iam_email - ], - "roles/iam.serviceAccountUser" = [ - module.orch-sa-cmp-0.iam_email - ] - } -} - -module "load-cs-df-0" { - source = "../../../modules/gcs" - project_id = module.load-project.project_id - prefix = var.prefix - name = "load-cs-0" - location = var.location - storage_class = "MULTI_REGIONAL" - encryption_key = var.service_encryption_keys.storage - force_destroy = !var.deletion_protection -} - -module "load-vpc" { - source = "../../../modules/net-vpc" - count = local.use_shared_vpc ? 0 : 1 - project_id = module.load-project.project_id - name = "${var.prefix}-lod" - subnets = [ - { - ip_cidr_range = "10.10.0.0/24" - name = "${var.prefix}-lod" - region = var.region - } - ] -} - -module "load-vpc-firewall" { - source = "../../../modules/net-vpc-firewall" - count = local.use_shared_vpc ? 0 : 1 - project_id = module.load-project.project_id - network = module.load-vpc[0].name - default_rules_config = { - admin_ranges = ["10.10.0.0/24"] - } -} - -module "load-nat" { - source = "../../../modules/net-cloudnat" - count = local.use_shared_vpc ? 0 : 1 - project_id = module.load-project.project_id - name = "${var.prefix}-lod" - region = var.region - router_network = module.load-vpc[0].name -} diff --git a/blueprints/data-solutions/data-platform-foundations/03-composer.tf b/blueprints/data-solutions/data-platform-foundations/03-composer.tf deleted file mode 100644 index 0d8a7ee6e..000000000 --- a/blueprints/data-solutions/data-platform-foundations/03-composer.tf +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description Orchestration Cloud Composer definition. - -locals { - _env_variables = { - BQ_LOCATION = var.location - DATA_CAT_TAGS = try(jsonencode(module.common-datacatalog.tags), "{}") - DF_KMS_KEY = try(var.service_encryption_keys.dataflow, "") - DRP_PRJ = module.drop-project.project_id - DRP_BQ = module.drop-bq-0.dataset_id - DRP_GCS = module.drop-cs-0.url - DRP_PS = module.drop-ps-0.id - DWH_LAND_PRJ = module.dwh-lnd-project.project_id - DWH_LAND_BQ_DATASET = module.dwh-lnd-bq-0.dataset_id - DWH_LAND_GCS = module.dwh-lnd-cs-0.url - DWH_CURATED_PRJ = module.dwh-cur-project.project_id - DWH_CURATED_BQ_DATASET = module.dwh-cur-bq-0.dataset_id - DWH_CURATED_GCS = module.dwh-cur-cs-0.url - DWH_CONFIDENTIAL_PRJ = module.dwh-conf-project.project_id - DWH_CONFIDENTIAL_BQ_DATASET = module.dwh-conf-bq-0.dataset_id - DWH_CONFIDENTIAL_GCS = module.dwh-conf-cs-0.url - GCP_REGION = var.region - LOD_PRJ = module.load-project.project_id - LOD_GCS_STAGING = module.load-cs-df-0.url - LOD_NET_VPC = local.load_vpc - LOD_NET_SUBNET = local.load_subnet - LOD_SA_DF = module.load-sa-df-0.email - ORC_PRJ = module.orch-project.project_id - ORC_GCS = module.orch-cs-0.url - ORC_GCS_TMP_DF = module.orch-cs-df-template.url - TRF_PRJ = module.transf-project.project_id - TRF_GCS_STAGING = module.transf-cs-df-0.url - TRF_NET_VPC = local.transf_vpc - TRF_NET_SUBNET = local.transf_subnet - TRF_SA_DF = module.transf-sa-df-0.email - TRF_SA_BQ = module.transf-sa-bq-0.email - } - env_variables = { - for k, v in merge( - try(var.composer_config.software_config.env_variables, null), - local._env_variables - ) : "AIRFLOW_VAR_${k}" => v - } -} -module "orch-sa-cmp-0" { - source = "../../../modules/iam-service-account" - project_id = module.orch-project.project_id - prefix = var.prefix - name = "orc-cmp-0" - display_name = "Data platform Composer service account" - iam = { - "roles/iam.serviceAccountTokenCreator" = [local.groups_iam.data-engineers] - "roles/iam.serviceAccountUser" = [module.orch-sa-cmp-0.iam_email] - } -} - -resource "google_composer_environment" "orch-cmp-0" { - count = var.composer_config.disable_deployment == true ? 0 : 1 - provider = google-beta - project = module.orch-project.project_id - name = "${var.prefix}-orc-cmp-0" - region = var.region - config { - software_config { - airflow_config_overrides = try(var.composer_config.software_config.airflow_config_overrides, null) - pypi_packages = try(var.composer_config.software_config.pypi_packages, null) - env_variables = local.env_variables - image_version = try(var.composer_config.software_config.image_version, null) - cloud_data_lineage_integration { - enabled = var.composer_config.software_config.cloud_data_lineage_integration - } - } - dynamic "workloads_config" { - for_each = (try(var.composer_config.workloads_config, null) != null ? { 1 = 1 } : {}) - - content { - scheduler { - cpu = try(var.composer_config.workloads_config.scheduler.cpu, null) - memory_gb = try(var.composer_config.workloads_config.scheduler.memory_gb, null) - storage_gb = try(var.composer_config.workloads_config.scheduler.storage_gb, null) - count = try(var.composer_config.workloads_config.scheduler.count, null) - } - web_server { - cpu = try(var.composer_config.workloads_config.web_server.cpu, null) - memory_gb = try(var.composer_config.workloads_config.web_server.memory_gb, null) - storage_gb = try(var.composer_config.workloads_config.web_server.storage_gb, null) - } - worker { - cpu = try(var.composer_config.workloads_config.worker.cpu, null) - memory_gb = try(var.composer_config.workloads_config.worker.memory_gb, null) - storage_gb = try(var.composer_config.workloads_config.worker.storage_gb, null) - min_count = try(var.composer_config.workloads_config.worker.min_count, null) - max_count = try(var.composer_config.workloads_config.worker.max_count, null) - } - } - } - - environment_size = var.composer_config.environment_size - - node_config { - network = local.orch_vpc - subnetwork = local.orch_subnet - service_account = module.orch-sa-cmp-0.email - enable_ip_masq_agent = "true" - tags = ["composer-worker"] - ip_allocation_policy { - cluster_secondary_range_name = try( - var.network_config.composer_secondary_ranges.pods, "pods" - ) - services_secondary_range_name = try( - var.network_config.composer_secondary_ranges.services, "services" - ) - } - } - private_environment_config { - enable_private_endpoint = "true" - cloud_sql_ipv4_cidr_block = try( - var.network_config.composer_ip_ranges.cloudsql, "10.20.10.0/24" - ) - master_ipv4_cidr_block = try( - var.network_config.composer_ip_ranges.gke_master, "10.20.11.0/28" - ) - } - dynamic "encryption_config" { - for_each = ( - try(var.service_encryption_keys[var.region], null) != null - ? { 1 = 1 } - : {} - ) - content { - kms_key_name = try(var.service_encryption_keys[var.region], null) - } - } - } - depends_on = [ - google_project_iam_member.shared_vpc, - module.orch-project - ] -} diff --git a/blueprints/data-solutions/data-platform-foundations/03-orchestration.tf b/blueprints/data-solutions/data-platform-foundations/03-orchestration.tf deleted file mode 100644 index 5663c3b1d..000000000 --- a/blueprints/data-solutions/data-platform-foundations/03-orchestration.tf +++ /dev/null @@ -1,195 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description Orchestration project and VPC. - -locals { - orch_iam = { - data_engineers = [ - "roles/artifactregistry.admin", - "roles/bigquery.dataEditor", - "roles/bigquery.jobUser", - "roles/cloudbuild.builds.editor", - "roles/composer.admin", - "roles/composer.user", - "roles/composer.environmentAndStorageObjectAdmin", - "roles/iam.serviceAccountUser", - "roles/iap.httpsResourceAccessor", - "roles/serviceusage.serviceUsageConsumer", - "roles/storage.objectAdmin" - ] - robots_cloudbuild = [ - "roles/storage.objectAdmin" - ] - robots_composer = [ - "roles/composer.ServiceAgentV2Ext", - "roles/storage.objectAdmin" - ] - sa_df_build = [ - "roles/cloudbuild.serviceAgent", - "roles/storage.objectAdmin" - ] - sa_load = [ - "roles/artifactregistry.reader", - "roles/bigquery.dataEditor", - "roles/storage.objectViewer" - ] - sa_orch = [ - "roles/bigquery.jobUser", - "roles/composer.worker", - "roles/iam.serviceAccountUser", - "roles/storage.objectAdmin" - ] - sa_transf_df = [ - "roles/bigquery.dataEditor" - ] - } -} - -module "orch-project" { - source = "../../../modules/project" - parent = var.project_config.parent - billing_account = var.project_config.billing_account_id - project_reuse = var.project_config.project_create ? null : {} - prefix = local.use_projects ? null : var.prefix - name = ( - local.use_projects - ? var.project_config.project_ids.orc - : "${var.project_config.project_ids.orc}${local.project_suffix}" - ) - iam = local.use_projects ? {} : local.orch_iam_auth - iam_bindings_additive = !local.use_projects ? {} : local.orch_iam_additive - - services = concat(var.project_services, [ - "artifactregistry.googleapis.com", - "bigquery.googleapis.com", - "bigqueryreservation.googleapis.com", - "bigquerystorage.googleapis.com", - "cloudbuild.googleapis.com", - "cloudkms.googleapis.com", - "composer.googleapis.com", - "compute.googleapis.com", - "container.googleapis.com", - "containerregistry.googleapis.com", - "artifactregistry.googleapis.com", - "dataflow.googleapis.com", - "datalineage.googleapis.com", - "orgpolicy.googleapis.com", - "pubsub.googleapis.com", - "servicenetworking.googleapis.com", - "storage.googleapis.com", - "storage-component.googleapis.com" - ]) - service_encryption_key_ids = { - "composer.googleapis.com" = compact([var.service_encryption_keys.composer]) - "storage.googleapis.com" = compact([var.service_encryption_keys.storage]) - } - shared_vpc_service_config = local.shared_vpc_project == null ? null : { - attach = true - host_project = local.shared_vpc_project - } -} - -module "orch-cs-0" { - source = "../../../modules/gcs" - project_id = module.orch-project.project_id - prefix = var.prefix - name = "orc-cs-0" - location = var.location - storage_class = "MULTI_REGIONAL" - encryption_key = var.service_encryption_keys.storage - force_destroy = !var.deletion_protection -} - -module "orch-vpc" { - source = "../../../modules/net-vpc" - count = local.use_shared_vpc ? 0 : 1 - project_id = module.orch-project.project_id - name = "${var.prefix}-orch" - subnets = [ - { - ip_cidr_range = "10.10.0.0/24" - name = "${var.prefix}-orch" - region = var.region - secondary_ip_ranges = { - pods = "10.10.8.0/22" - services = "10.10.12.0/24" - } - } - ] -} - -module "orch-vpc-firewall" { - source = "../../../modules/net-vpc-firewall" - count = local.use_shared_vpc ? 0 : 1 - project_id = module.orch-project.project_id - network = module.orch-vpc[0].name - default_rules_config = { - admin_ranges = ["10.10.0.0/24"] - } -} - -module "orch-nat" { - count = local.use_shared_vpc ? 0 : 1 - source = "../../../modules/net-cloudnat" - project_id = module.orch-project.project_id - name = "${var.prefix}-orch" - region = var.region - router_network = module.orch-vpc[0].name -} - -module "orch-artifact-reg" { - source = "../../../modules/artifact-registry" - project_id = module.orch-project.project_id - name = "${var.prefix}-app-images" - location = var.region - description = "Docker repository storing application images e.g. Dataflow, Cloud Run etc..." - format = { docker = { standard = {} } } -} - -module "orch-cs-df-template" { - source = "../../../modules/gcs" - project_id = module.orch-project.project_id - prefix = var.prefix - name = "orc-cs-df-template" - location = var.location - storage_class = "MULTI_REGIONAL" - encryption_key = var.service_encryption_keys.storage - force_destroy = !var.deletion_protection -} - -module "orch-cs-build-staging" { - source = "../../../modules/gcs" - project_id = module.orch-project.project_id - prefix = var.prefix - name = "orc-cs-build-staging" - location = var.location - storage_class = "MULTI_REGIONAL" - encryption_key = var.service_encryption_keys.storage - force_destroy = !var.deletion_protection -} - -module "orch-sa-df-build" { - source = "../../../modules/iam-service-account" - project_id = module.orch-project.project_id - prefix = var.prefix - name = "orc-sa-df-build" - display_name = "Data platform Dataflow build service account" - # Note values below should pertain to the system / group / users who are able to - # invoke the build via this service account - iam = { - "roles/iam.serviceAccountTokenCreator" = [local.groups_iam.data-engineers] - "roles/iam.serviceAccountUser" = [local.groups_iam.data-engineers] - } -} diff --git a/blueprints/data-solutions/data-platform-foundations/04-transformation.tf b/blueprints/data-solutions/data-platform-foundations/04-transformation.tf deleted file mode 100644 index 2a45def1a..000000000 --- a/blueprints/data-solutions/data-platform-foundations/04-transformation.tf +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description Transformation project and VPC. - -locals { - trf_iam = { - data_engineers = [ - "roles/bigquery.jobUser", - "roles/dataflow.admin" - ] - robots_dataflow_trf = [ - "roles/storage.objectAdmin" - ] - sa_orch = [ - "roles/dataflow.admin" - ] - sa_transf_bq = [ - "roles/bigquery.jobUser" - ] - sa_transf_df = [ - "roles/dataflow.worker", - "roles/storage.objectAdmin" - ] - } -} - -module "transf-project" { - source = "../../../modules/project" - parent = var.project_config.parent - billing_account = var.project_config.billing_account_id - project_reuse = var.project_config.project_create ? null : {} - prefix = local.use_projects ? null : var.prefix - name = ( - local.use_projects - ? var.project_config.project_ids.trf - : "${var.project_config.project_ids.trf}${local.project_suffix}" - ) - iam = local.use_projects ? {} : local.trf_iam_auth - iam_bindings_additive = !local.use_projects ? {} : local.trf_iam_additive - services = concat(var.project_services, [ - "bigquery.googleapis.com", - "bigqueryreservation.googleapis.com", - "bigquerystorage.googleapis.com", - "cloudkms.googleapis.com", - "compute.googleapis.com", - "dataflow.googleapis.com", - "dlp.googleapis.com", - "pubsub.googleapis.com", - "servicenetworking.googleapis.com", - "storage.googleapis.com", - "storage-component.googleapis.com" - ]) - service_encryption_key_ids = { - "dataflow.googleapis.com" = compact([var.service_encryption_keys.dataflow]) - "storage.googleapis.com" = compact([var.service_encryption_keys.storage]) - } - shared_vpc_service_config = local.shared_vpc_project == null ? null : { - attach = true - host_project = local.shared_vpc_project - } -} - -module "transf-sa-df-0" { - source = "../../../modules/iam-service-account" - project_id = module.transf-project.project_id - prefix = var.prefix - name = "trf-df-0" - display_name = "Data platform Dataflow transformation service account" - iam = { - "roles/iam.serviceAccountTokenCreator" = [ - local.groups_iam.data-engineers, - module.orch-sa-cmp-0.iam_email - ], - "roles/iam.serviceAccountUser" = [ - module.orch-sa-cmp-0.iam_email - ] - } -} - -module "transf-cs-df-0" { - source = "../../../modules/gcs" - project_id = module.transf-project.project_id - prefix = var.prefix - name = "trf-cs-0" - location = var.location - storage_class = "MULTI_REGIONAL" - encryption_key = var.service_encryption_keys.storage - force_destroy = !var.deletion_protection -} - -module "transf-sa-bq-0" { - source = "../../../modules/iam-service-account" - project_id = module.transf-project.project_id - prefix = var.prefix - name = "trf-bq-0" - display_name = "Data platform BigQuery transformation service account" - iam = { - "roles/iam.serviceAccountTokenCreator" = [ - local.groups_iam.data-engineers, - module.orch-sa-cmp-0.iam_email - ], - "roles/iam.serviceAccountUser" = [ - module.orch-sa-cmp-0.iam_email - ] - } -} - -module "transf-vpc" { - source = "../../../modules/net-vpc" - count = local.use_shared_vpc ? 0 : 1 - project_id = module.transf-project.project_id - name = "${var.prefix}-trf" - subnets = [ - { - ip_cidr_range = "10.10.0.0/24" - name = "${var.prefix}-trf" - region = var.region - } - ] -} - -module "transf-vpc-firewall" { - source = "../../../modules/net-vpc-firewall" - count = local.use_shared_vpc ? 0 : 1 - project_id = module.transf-project.project_id - network = module.transf-vpc[0].name - default_rules_config = { - admin_ranges = ["10.10.0.0/24"] - } -} - -module "transf-nat" { - source = "../../../modules/net-cloudnat" - count = local.use_shared_vpc ? 0 : 1 - project_id = module.transf-project.project_id - name = "${var.prefix}-trf" - region = var.region - router_network = module.transf-vpc[0].name -} diff --git a/blueprints/data-solutions/data-platform-foundations/05-datawarehouse.tf b/blueprints/data-solutions/data-platform-foundations/05-datawarehouse.tf deleted file mode 100644 index f58dc034a..000000000 --- a/blueprints/data-solutions/data-platform-foundations/05-datawarehouse.tf +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description Data Warehouse projects. - -locals { - dwh_iam = { - data_analysts = [ - "roles/bigquery.dataViewer", - "roles/bigquery.jobUser", - "roles/datacatalog.tagTemplateViewer", - "roles/datacatalog.viewer", - "roles/storage.objectViewer" - ] - data_engineers = [ - "roles/bigquery.dataViewer", - "roles/bigquery.jobUser", - "roles/datacatalog.tagTemplateViewer", - "roles/datacatalog.viewer", - "roles/storage.objectViewer" - ] - sa_transf_bq = [ - "roles/bigquery.dataOwner", - "roles/bigquery.jobUser" - ] - sa_transf_df = [ - "roles/bigquery.dataOwner", - "roles/storage.objectAdmin" - ] - } - lnd_iam = { - data_engineers = [ - "roles/bigquery.dataViewer", - "roles/bigquery.jobUser", - "roles/datacatalog.tagTemplateViewer", - "roles/datacatalog.viewer", - "roles/storage.objectViewer" - ] - sa_load = [ - "roles/bigquery.dataOwner", - "roles/bigquery.jobUser", - "roles/storage.objectCreator" - ] - sa_transf_bq = [ - "roles/bigquery.dataViewer", - "roles/datacatalog.categoryAdmin" - ] - sa_transf_df = [ - "roles/bigquery.dataViewer" - ] - } -} - -# Project - -module "dwh-lnd-project" { - source = "../../../modules/project" - parent = var.project_config.parent - billing_account = var.project_config.billing_account_id - project_reuse = var.project_config.project_create ? null : {} - prefix = local.use_projects ? null : var.prefix - name = ( - local.use_projects - ? var.project_config.project_ids.dwh-lnd - : "${var.project_config.project_ids.dwh-lnd}${local.project_suffix}" - ) - iam = local.use_projects ? {} : local.lnd_iam_auth - iam_bindings_additive = !local.use_projects ? {} : local.lnd_iam_additive - services = local.dwh_services - service_encryption_key_ids = { - "bigquery.googleapis.com" = compact([var.service_encryption_keys.bq]) - "storage.googleapis.com" = compact([var.service_encryption_keys.storage]) - } -} - -module "dwh-cur-project" { - source = "../../../modules/project" - parent = var.project_config.parent - billing_account = var.project_config.billing_account_id - project_reuse = var.project_config.project_create ? null : {} - prefix = local.use_projects ? null : var.prefix - name = ( - local.use_projects - ? var.project_config.project_ids.dwh-cur - : "${var.project_config.project_ids.dwh-cur}${local.project_suffix}" - ) - iam = local.use_projects ? {} : local.dwh_iam_auth - iam_bindings_additive = !local.use_projects ? {} : local.dwh_iam_additive - services = local.dwh_services - service_encryption_key_ids = { - "bigquery.googleapis.com" = compact([var.service_encryption_keys.bq]) - "storage.googleapis.com" = compact([var.service_encryption_keys.storage]) - } -} - -module "dwh-conf-project" { - source = "../../../modules/project" - parent = var.project_config.parent - billing_account = var.project_config.billing_account_id - project_reuse = var.project_config.project_create ? null : {} - prefix = local.use_projects ? null : var.prefix - name = ( - local.use_projects - ? var.project_config.project_ids.dwh-conf - : "${var.project_config.project_ids.dwh-conf}${local.project_suffix}" - ) - iam = local.use_projects ? {} : local.dwh_iam_auth - iam_bindings_additive = !local.use_projects ? {} : local.dwh_iam_additive - services = local.dwh_services - service_encryption_key_ids = { - "bigquery.googleapis.com" = compact([var.service_encryption_keys.bq]) - "storage.googleapis.com" = compact([var.service_encryption_keys.storage]) - } -} - -module "dwh-lnd-bq-0" { - source = "../../../modules/bigquery-dataset" - project_id = module.dwh-lnd-project.project_id - id = "${replace(var.prefix, "-", "_")}_dwh_lnd_bq_0" - location = var.location - encryption_key = var.service_encryption_keys.bq -} - -module "dwh-cur-bq-0" { - source = "../../../modules/bigquery-dataset" - project_id = module.dwh-cur-project.project_id - id = "${replace(var.prefix, "-", "_")}_dwh_cur_bq_0" - location = var.location - encryption_key = var.service_encryption_keys.bq -} - -module "dwh-conf-bq-0" { - source = "../../../modules/bigquery-dataset" - project_id = module.dwh-conf-project.project_id - id = "${replace(var.prefix, "-", "_")}_dwh_conf_bq_0" - location = var.location - encryption_key = var.service_encryption_keys.bq -} - -module "dwh-lnd-cs-0" { - source = "../../../modules/gcs" - project_id = module.dwh-lnd-project.project_id - prefix = var.prefix - name = "dwh-lnd-cs-0" - location = var.location - storage_class = "MULTI_REGIONAL" - encryption_key = var.service_encryption_keys.storage - force_destroy = !var.deletion_protection -} - -module "dwh-cur-cs-0" { - source = "../../../modules/gcs" - project_id = module.dwh-cur-project.project_id - prefix = var.prefix - name = "dwh-cur-cs-0" - location = var.location - storage_class = "MULTI_REGIONAL" - encryption_key = var.service_encryption_keys.storage - force_destroy = !var.deletion_protection -} - -module "dwh-conf-cs-0" { - source = "../../../modules/gcs" - project_id = module.dwh-conf-project.project_id - prefix = var.prefix - name = "dwh-conf-cs-0" - location = var.location - storage_class = "MULTI_REGIONAL" - encryption_key = var.service_encryption_keys.storage - force_destroy = !var.deletion_protection -} diff --git a/blueprints/data-solutions/data-platform-foundations/06-common.tf b/blueprints/data-solutions/data-platform-foundations/06-common.tf deleted file mode 100644 index 6ebf2adf1..000000000 --- a/blueprints/data-solutions/data-platform-foundations/06-common.tf +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description common project. - -locals { - cmn_iam = { - data_analysts = [ - # uncomment if access to all tagged columns is needed - # "roles/datacatalog.categoryFineGrainedReader", - "roles/datacatalog.viewer" - ] - data_engineers = [ - "roles/dlp.estimatesAdmin", - "roles/dlp.reader", - "roles/dlp.user" - ] - data_security = [ - "roles/datacatalog.admin", - "roles/dlp.admin" - ] - sa_load = [ - "roles/datacatalog.viewer", - "roles/dlp.user" - ] - sa_transf_bq = [ - "roles/datacatalog.categoryFineGrainedReader", - "roles/datacatalog.viewer" - ] - sa_transf_df = [ - "roles/datacatalog.categoryFineGrainedReader", - "roles/datacatalog.viewer", - "roles/dlp.user" - ] - } -} - -module "common-project" { - source = "../../../modules/project" - parent = var.project_config.parent - billing_account = var.project_config.billing_account_id - project_reuse = var.project_config.project_create ? null : {} - prefix = local.use_projects ? null : var.prefix - name = ( - local.use_projects - ? var.project_config.project_ids.common - : "${var.project_config.project_ids.common}${local.project_suffix}" - ) - iam = local.use_projects ? {} : local.cmn_iam_auth - iam_bindings_additive = !local.use_projects ? {} : local.cmn_iam_additive - services = concat(var.project_services, [ - "datacatalog.googleapis.com", - "dlp.googleapis.com", - ]) -} - -module "common-datacatalog" { - source = "../../../modules/data-catalog-policy-tag" - project_id = module.common-project.project_id - name = "${var.prefix}-datacatalog-policy-tags" - location = var.location - tags = var.data_catalog_tags -} - -# To create KMS keys in the common project: uncomment this section -# and assign key links accondingly in local.service_encryption_keys variable - -# module "cmn-kms-0" { -# source = "../../../modules/kms" -# project_id = module.common-project.project_id -# keyring = { -# name = "${var.prefix}-kr-global", -# location = "global" -# } -# keys = { -# pubsub = null -# } -# } - -# module "cmn-kms-1" { -# source = "../../../modules/kms" -# project_id = module.common-project.project_id -# keyring = { -# name = "${var.prefix}-kr-mregional", -# location = var.location -# } -# keys = { -# bq = null -# storage = null -# } -# } - -# module "cmn-kms-2" { -# source = "../../../modules/kms" -# project_id = module.cmn-prj.project_id -# keyring = { -# name = "${var.prefix}-kr-regional", -# location = var.region -# } -# keys = { -# composer = null -# dataflow = null -# } -# } diff --git a/blueprints/data-solutions/data-platform-foundations/07-exposure.tf b/blueprints/data-solutions/data-platform-foundations/07-exposure.tf deleted file mode 100644 index 8418080ff..000000000 --- a/blueprints/data-solutions/data-platform-foundations/07-exposure.tf +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description common project. - -module "exp-project" { - source = "../../../modules/project" - parent = var.project_config.parent - billing_account = var.project_config.billing_account_id - project_reuse = var.project_config.project_create ? null : {} - prefix = local.use_projects ? null : var.prefix - name = ( - local.use_projects - ? var.project_config.project_ids.exp - : "${var.project_config.project_ids.exp}${local.project_suffix}" - ) -} diff --git a/blueprints/data-solutions/data-platform-foundations/IAM.md b/blueprints/data-solutions/data-platform-foundations/IAM.md deleted file mode 100644 index ffc680837..000000000 --- a/blueprints/data-solutions/data-platform-foundations/IAM.md +++ /dev/null @@ -1,89 +0,0 @@ -# IAM bindings reference - -Legend: + additive, conditional. - -## Project cmn - -| members | roles | -|---|---| -|gcp-data-analysts
group|[roles/datacatalog.viewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.viewer) | -|gcp-data-engineers
group|[roles/dlp.estimatesAdmin](https://cloud.google.com/iam/docs/understanding-roles#dlp.estimatesAdmin)
[roles/dlp.reader](https://cloud.google.com/iam/docs/understanding-roles#dlp.reader)
[roles/dlp.user](https://cloud.google.com/iam/docs/understanding-roles#dlp.user) | -|gcp-data-security
group|[roles/datacatalog.admin](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.admin)
[roles/dlp.admin](https://cloud.google.com/iam/docs/understanding-roles#dlp.admin) | -|load-df-0
serviceAccount|[roles/datacatalog.viewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.viewer)
[roles/dlp.user](https://cloud.google.com/iam/docs/understanding-roles#dlp.user) | -|trf-bq-0
serviceAccount|[roles/datacatalog.categoryFineGrainedReader](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.categoryFineGrainedReader)
[roles/datacatalog.viewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.viewer) | -|trf-df-0
serviceAccount|[roles/datacatalog.categoryFineGrainedReader](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.categoryFineGrainedReader)
[roles/datacatalog.viewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.viewer)
[roles/dlp.user](https://cloud.google.com/iam/docs/understanding-roles#dlp.user) | - -## Project drp - -| members | roles | -|---|---| -|gcp-data-engineers
group|[roles/bigquery.dataEditor](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataEditor)
[roles/bigquery.user](https://cloud.google.com/iam/docs/understanding-roles#bigquery.user) | -|drp-bq-0
serviceAccount|[roles/bigquery.dataEditor](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataEditor) | -|drp-cs-0
serviceAccount|[roles/storage.objectCreator](https://cloud.google.com/iam/docs/understanding-roles#storage.objectCreator) | -|drp-ps-0
serviceAccount|[roles/pubsub.publisher](https://cloud.google.com/iam/docs/understanding-roles#pubsub.publisher) | -|load-df-0
serviceAccount|[roles/bigquery.user](https://cloud.google.com/iam/docs/understanding-roles#bigquery.user)
[roles/pubsub.subscriber](https://cloud.google.com/iam/docs/understanding-roles#pubsub.subscriber)
[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | -|orc-cmp-0
serviceAccount|[roles/pubsub.subscriber](https://cloud.google.com/iam/docs/understanding-roles#pubsub.subscriber)
[roles/storage.objectViewer](https://cloud.google.com/iam/docs/understanding-roles#storage.objectViewer) | - -## Project dwh-conf - -| members | roles | -|---|---| -|gcp-data-analysts
group|[roles/bigquery.dataViewer](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataViewer)
[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/datacatalog.tagTemplateViewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.tagTemplateViewer)
[roles/datacatalog.viewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.viewer)
[roles/storage.objectViewer](https://cloud.google.com/iam/docs/understanding-roles#storage.objectViewer) | -|gcp-data-engineers
group|[roles/bigquery.dataViewer](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataViewer)
[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/datacatalog.tagTemplateViewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.tagTemplateViewer)
[roles/datacatalog.viewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.viewer)
[roles/storage.objectViewer](https://cloud.google.com/iam/docs/understanding-roles#storage.objectViewer) | -|SERVICE_IDENTITY_service-networking
serviceAccount|[roles/servicenetworking.serviceAgent](https://cloud.google.com/iam/docs/understanding-roles#servicenetworking.serviceAgent) +| -|trf-bq-0
serviceAccount|[roles/bigquery.dataOwner](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataOwner)
[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser) | -|trf-df-0
serviceAccount|[roles/bigquery.dataOwner](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataOwner)
[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | - -## Project dwh-cur - -| members | roles | -|---|---| -|gcp-data-analysts
group|[roles/bigquery.dataViewer](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataViewer)
[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/datacatalog.tagTemplateViewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.tagTemplateViewer)
[roles/datacatalog.viewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.viewer)
[roles/storage.objectViewer](https://cloud.google.com/iam/docs/understanding-roles#storage.objectViewer) | -|gcp-data-engineers
group|[roles/bigquery.dataViewer](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataViewer)
[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/datacatalog.tagTemplateViewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.tagTemplateViewer)
[roles/datacatalog.viewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.viewer)
[roles/storage.objectViewer](https://cloud.google.com/iam/docs/understanding-roles#storage.objectViewer) | -|SERVICE_IDENTITY_service-networking
serviceAccount|[roles/servicenetworking.serviceAgent](https://cloud.google.com/iam/docs/understanding-roles#servicenetworking.serviceAgent) +| -|trf-bq-0
serviceAccount|[roles/bigquery.dataOwner](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataOwner)
[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser) | -|trf-df-0
serviceAccount|[roles/bigquery.dataOwner](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataOwner)
[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | - -## Project dwh-lnd - -| members | roles | -|---|---| -|gcp-data-engineers
group|[roles/bigquery.dataViewer](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataViewer)
[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/datacatalog.tagTemplateViewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.tagTemplateViewer)
[roles/datacatalog.viewer](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.viewer)
[roles/storage.objectViewer](https://cloud.google.com/iam/docs/understanding-roles#storage.objectViewer) | -|SERVICE_IDENTITY_service-networking
serviceAccount|[roles/servicenetworking.serviceAgent](https://cloud.google.com/iam/docs/understanding-roles#servicenetworking.serviceAgent) +| -|load-df-0
serviceAccount|[roles/bigquery.dataOwner](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataOwner)
[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/storage.objectCreator](https://cloud.google.com/iam/docs/understanding-roles#storage.objectCreator) | -|trf-bq-0
serviceAccount|[roles/bigquery.dataViewer](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataViewer)
[roles/datacatalog.categoryAdmin](https://cloud.google.com/iam/docs/understanding-roles#datacatalog.categoryAdmin) | -|trf-df-0
serviceAccount|[roles/bigquery.dataViewer](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataViewer) | - -## Project lod - -| members | roles | -|---|---| -|gcp-data-engineers
group|[roles/dataflow.admin](https://cloud.google.com/iam/docs/understanding-roles#dataflow.admin)
[roles/dataflow.developer](https://cloud.google.com/iam/docs/understanding-roles#dataflow.developer) | -|SERVICE_IDENTITY_dataflow-service-producer-prod
serviceAccount|[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | -|SERVICE_IDENTITY_service-networking
serviceAccount|[roles/servicenetworking.serviceAgent](https://cloud.google.com/iam/docs/understanding-roles#servicenetworking.serviceAgent) +| -|load-df-0
serviceAccount|[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/dataflow.admin](https://cloud.google.com/iam/docs/understanding-roles#dataflow.admin)
[roles/dataflow.worker](https://cloud.google.com/iam/docs/understanding-roles#dataflow.worker)
[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | -|orc-cmp-0
serviceAccount|[roles/dataflow.admin](https://cloud.google.com/iam/docs/understanding-roles#dataflow.admin) | - -## Project orc - -| members | roles | -|---|---| -|gcp-data-engineers
group|[roles/artifactregistry.admin](https://cloud.google.com/iam/docs/understanding-roles#artifactregistry.admin)
[roles/bigquery.dataEditor](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataEditor)
[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/cloudbuild.builds.editor](https://cloud.google.com/iam/docs/understanding-roles#cloudbuild.builds.editor)
[roles/composer.admin](https://cloud.google.com/iam/docs/understanding-roles#composer.admin)
[roles/composer.environmentAndStorageObjectAdmin](https://cloud.google.com/iam/docs/understanding-roles#composer.environmentAndStorageObjectAdmin)
[roles/composer.user](https://cloud.google.com/iam/docs/understanding-roles#composer.user)
[roles/iam.serviceAccountUser](https://cloud.google.com/iam/docs/understanding-roles#iam.serviceAccountUser)
[roles/iap.httpsResourceAccessor](https://cloud.google.com/iam/docs/understanding-roles#iap.httpsResourceAccessor)
[roles/serviceusage.serviceUsageConsumer](https://cloud.google.com/iam/docs/understanding-roles#serviceusage.serviceUsageConsumer)
[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | -|SERVICE_IDENTITY_cloudcomposer-accounts
serviceAccount|[roles/composer.ServiceAgentV2Ext](https://cloud.google.com/iam/docs/understanding-roles#composer.ServiceAgentV2Ext)
[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | -|SERVICE_IDENTITY_gcp-sa-cloudbuild
serviceAccount|[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | -|SERVICE_IDENTITY_service-networking
serviceAccount|[roles/servicenetworking.serviceAgent](https://cloud.google.com/iam/docs/understanding-roles#servicenetworking.serviceAgent) +| -|load-df-0
serviceAccount|[roles/artifactregistry.reader](https://cloud.google.com/iam/docs/understanding-roles#artifactregistry.reader)
[roles/bigquery.dataEditor](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataEditor)
[roles/storage.objectViewer](https://cloud.google.com/iam/docs/understanding-roles#storage.objectViewer) | -|orc-cmp-0
serviceAccount|[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/composer.worker](https://cloud.google.com/iam/docs/understanding-roles#composer.worker)
[roles/iam.serviceAccountUser](https://cloud.google.com/iam/docs/understanding-roles#iam.serviceAccountUser)
[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | -|orc-sa-df-build
serviceAccount|[roles/cloudbuild.serviceAgent](https://cloud.google.com/iam/docs/understanding-roles#cloudbuild.serviceAgent)
[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | -|trf-df-0
serviceAccount|[roles/bigquery.dataEditor](https://cloud.google.com/iam/docs/understanding-roles#bigquery.dataEditor) | - -## Project trf - -| members | roles | -|---|---| -|gcp-data-engineers
group|[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser)
[roles/dataflow.admin](https://cloud.google.com/iam/docs/understanding-roles#dataflow.admin) | -|SERVICE_IDENTITY_dataflow-service-producer-prod
serviceAccount|[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | -|SERVICE_IDENTITY_service-networking
serviceAccount|[roles/servicenetworking.serviceAgent](https://cloud.google.com/iam/docs/understanding-roles#servicenetworking.serviceAgent) +| -|orc-cmp-0
serviceAccount|[roles/dataflow.admin](https://cloud.google.com/iam/docs/understanding-roles#dataflow.admin) | -|trf-bq-0
serviceAccount|[roles/bigquery.jobUser](https://cloud.google.com/iam/docs/understanding-roles#bigquery.jobUser) | -|trf-df-0
serviceAccount|[roles/dataflow.worker](https://cloud.google.com/iam/docs/understanding-roles#dataflow.worker)
[roles/storage.objectAdmin](https://cloud.google.com/iam/docs/understanding-roles#storage.objectAdmin) | diff --git a/blueprints/data-solutions/data-platform-foundations/OWNERS b/blueprints/data-solutions/data-platform-foundations/OWNERS deleted file mode 100644 index 7a8679e69..000000000 --- a/blueprints/data-solutions/data-platform-foundations/OWNERS +++ /dev/null @@ -1 +0,0 @@ -lcaggio diff --git a/blueprints/data-solutions/data-platform-foundations/README.md b/blueprints/data-solutions/data-platform-foundations/README.md deleted file mode 100644 index 9d21e7959..000000000 --- a/blueprints/data-solutions/data-platform-foundations/README.md +++ /dev/null @@ -1,315 +0,0 @@ -# Data Platform - -This module implements an opinionated Data Platform Architecture that creates and setup projects and related resources that compose an end-to-end data environment. - -For a minimal Data Platform, please refer to the [Minimal Data Platform](../data-platform-minimal/) blueprint. - -The code is intentionally simple, as it's intended to provide a generic initial setup and then allow easy customizations to complete the implementation of the intended design. - -The following diagram is a high-level reference of the resources created and managed here: - -![Data Platform architecture overview](./images/overview_diagram.png "Data Platform architecture overview") - -A demo Airflow pipeline is also part of this blueprint: it can be built and run on top of the foundational infrastructure to verify or test the setup quickly. - -## Design overview and choices - -Despite its simplicity, this stage implements the basics of a design that we've seen working well for various customers. - -The approach adapts to different high-level requirements: - -- boundaries for each step -- clearly defined actors -- least privilege principle -- rely on service account impersonation - -The code in this blueprint doesn't address Organization-level configurations (Organization policy, VPC-SC, centralized logs). We expect those elements to be managed by automation stages external to this script like those in [FAST](../../../fast). - -### Project structure - -The Data Platform is designed to rely on several projects, one project per data stage. The stages identified are: - -- drop off -- load -- data warehouse -- orchestration -- transformation -- exposure - -This separation into projects allows adhering to the least-privilege principle by using project-level roles. - -The script will create the following projects: - -- **Drop off** Used to store temporary data. Data is pushed to Cloud Storage, BigQuery, or Cloud PubSub. Resources are configured with a customizable lifecycle policy. -- **Load** Used to load data from the drop off zone to the data warehouse. The load is made with minimal to zero transformation logic (mainly `cast`). Anonymization or tokenization of Personally Identifiable Information (PII) can be implemented here or in the transformation stage, depending on your requirements. The use of [Cloud Dataflow templates](https://cloud.google.com/dataflow/docs/concepts/dataflow-templates) is recommended. When you need to handle workloads from different teams, if strong role separation is needed between them, we suggest to customize the script and have separate `Load` projects. -- **Data Warehouse** Several projects distributed across 3 separate layers, to host progressively processed and refined data: - - **Landing - Raw data** Structured Data, stored in relevant formats: structured data stored in BigQuery, unstructured data stored on Cloud Storage with additional metadata stored in BigQuery (for example pictures stored in Cloud Storage and analysis of the images for Cloud Vision API stored in BigQuery). - - **Curated - Cleansed, aggregated and curated data** - - **Confidential - Curated and unencrypted layer** -- **Orchestration** Used to host Cloud Composer, which orchestrates all tasks that move data across layers. -- **Transformation** Used to move data between Data Warehouse layers. We strongly suggest relying on BigQuery Engine to perform the transformations. If BigQuery doesn't have the features needed to perform your transformations, you can use Cloud Dataflow with [Cloud Dataflow templates](https://cloud.google.com/dataflow/docs/concepts/dataflow-templates). This stage can also optionally anonymize or tokenize PII. When you need to handle workloads from different teams, if strong role separation is needed between them, we suggest to customize the script and have separate `Transformation` projects. -- **Exposure** Used to host resources that share processed data with external systems. Depending on the access pattern, data can be presented via Cloud SQL, BigQuery, or Bigtable. For BigQuery data, we strongly suggest relying on [Authorized views](https://cloud.google.com/bigquery/docs/authorized-views). - -### Roles - -We assign roles on resources at the project level, granting the appropriate roles via groups (humans) and service accounts (services and applications) according to best practices. - -### Service accounts - -Service account creation follows the least privilege principle, performing a single task which requires access to a defined set of resources. The table below shows a high level overview of roles for each service account on each data layer, using `READ` or `WRITE` access patterns for simplicity. For detailed roles please refer to the code. - -|Service Account|Drop off|DWH Landing|DWH Curated|DWH Confidential| -|-|:-:|:-:|:-:|:-:| -|`drop-sa`|`WRITE`|-|-|-| -|`load-sa`|`READ`|`READ`/`WRITE`|-|-| -|`transformation-sa`|-|`READ`/`WRITE`|`READ`/`WRITE`|`READ`/`WRITE`| -|`orchestration-sa`|-|-|-|-| - -A full reference of IAM roles managed by the Data Platform [is available here](./IAM.md). - -Using of service account keys within a data pipeline exposes to several security risks deriving from a credentials leak. This blueprint shows how to leverage impersonation to avoid the need of creating keys. - -### User groups - -User groups provide a stable frame of reference that allows decoupling the final set of permissions from the stage where entities and resources are created, and their IAM bindings defined. - -We use three groups to control access to resources: - -- *Data Engineers* They handle and run the Data Hub, with read access to all resources in order to troubleshoot possible issues with pipelines. This team can also impersonate any service account. -- *Data Analysts*. They perform analysis on datasets, with read access to the Data Warehouse Confidential project, and BigQuery READ/WRITE access to the playground project. -- *Data Security*:. They handle security configurations related to the Data Hub. This team has admin access to the common project to configure Cloud DLP templates or Data Catalog policy tags. - -The table below shows a high level overview of roles for each group on each project, using `READ`, `WRITE` and `ADMIN` access patterns for simplicity. For detailed roles please refer to the code. - -|Group|Drop off|Load|Transformation|DHW Landing|DWH Curated|DWH Confidential|Orchestration|Common| -|-|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| -|Data Engineers|`ADMIN`|`ADMIN`|`ADMIN`|`ADMIN`|`ADMIN`|`ADMIN`|`ADMIN`|`ADMIN`| -|Data Analysts|-|-|-|-|-|`READ`|-|-| -|Data Security|-|-|-|-|-|-|-|-|`ADMIN`| - -You can configure groups via the `groups` variable. - -### Virtual Private Cloud (VPC) design - -As is often the case in real-world configurations, this blueprint accepts as input an existing [Shared-VPC](https://cloud.google.com/vpc/docs/shared-vpc) via the `network_config` variable. Make sure that the GKE API (`container.googleapis.com`) is enabled in the VPC host project. - -If the `network_config` variable is not provided, one VPC will be created in each project that supports network resources (load, transformation and orchestration). - -### IP ranges and subnetting - -To deploy this blueprint with self-managed VPCs you need the following ranges: - -- one /24 for the load project VPC subnet used for Cloud Dataflow workers -- one /24 for the transformation VPC subnet used for Cloud Dataflow workers -- one /24 range for the orchestration VPC subnet used for Composer workers -- one /22 and one /24 ranges for the secondary ranges associated with the orchestration VPC subnet - -If you are using Shared VPC, you need one subnet with one /22 and one /24 secondary range defined for Composer pods and services. - -In both VPC scenarios, you also need these ranges for Composer: - -- one /24 for Cloud SQL -- one /28 for the GKE control plane - -### Resource naming conventions - -Resources follow the naming convention described below. - -- `prefix-layer` for projects -- `prefix-layer-product` for resources -- `prefix-layer[2]-gcp-product[2]-counter` for services and service accounts - -### Encryption - -We suggest a centralized approach to key management, where Organization Security is the only team that can access encryption material, and keyrings and keys are managed in a project external to the Data Platform. - -![Centralized Cloud Key Management high-level diagram](./images/kms_diagram.png "Centralized Cloud Key Management high-level diagram") - -To configure the use of Cloud KMS on resources, you have to specify the key id on the `service_encryption_keys` variable. Key locations should match resource locations. Example: - -```tfvars -service_encryption_keys = { - bq = "KEY_URL_MULTIREGIONAL" - composer = "KEY_URL_REGIONAL" - dataflow = "KEY_URL_REGIONAL" - storage = "KEY_URL_MULTIREGIONAL" - pubsub = "KEY_URL_MULTIREGIONAL" -} -``` - -This step is optional and depends on customer policies and security best practices. - -## Data Anonymization - -We suggest using Cloud Data Loss Prevention to identify/mask/tokenize your confidential data. - -While implementing a Data Loss Prevention strategy is out of scope for this blueprint, we enable the service in two different projects so that [Cloud Data Loss Prevention templates](https://cloud.google.com/dlp/docs/concepts-templates) can be configured in one of two ways: - -- during the ingestion phase, from Dataflow -- during the transformation phase, from [BigQuery](https://cloud.google.com/bigquery/docs/scan-with-dlp) or [Cloud Dataflow](https://cloud.google.com/architecture/running-automated-dataflow-pipeline-de-identify-pii-dataset) - -Cloud Data Loss Prevention resources and templates should be stored in the security project: - -![Centralized Cloud Data Loss Prevention high-level diagram](./images/dlp_diagram.png "Centralized Cloud Data Loss Prevention high-level diagram") - -You can find more details and best practices on using DLP to De-identification and re-identification of PII in large-scale datasets in the [GCP documentation](https://cloud.google.com/architecture/de-identification-re-identification-pii-using-cloud-dlp). - -## Data Catalog - -[Data Catalog](https://cloud.google.com/data-catalog) helps you to document your data entry at scale. Data Catalog relies on [tags](https://cloud.google.com/data-catalog/docs/tags-and-tag-templates#tags) and [tag template](https://cloud.google.com/data-catalog/docs/tags-and-tag-templates#tag-templates) to manage metadata for all data entries in a unified and centralized service. To implement [column-level security](https://cloud.google.com/bigquery/docs/column-level-security-intro) on BigQuery, we suggest to use `Tags` and `Tag templates`. - -The default configuration will implement 3 tags: - -- `3_Confidential`: policy tag for columns that include very sensitive information, such as credit card numbers. -- `2_Private`: policy tag for columns that include sensitive personal identifiable information (PII) information, such as a person's first name. -- `1_Sensitive`: policy tag for columns that include data that cannot be made public, such as the credit limit. - -Anything that is not tagged is available to all users who have access to the data warehouse. - -For the purpose of the blueprint no groups has access to tagged data. You can configure your tags and roles associated by configuring the `data_catalog_tags` variable. We suggest using the "[Best practices for using policy tags in BigQuery](https://cloud.google.com/bigquery/docs/best-practices-policy-tags)" article as a guide to designing your tags structure and access pattern. - -## How to run this script - -To deploy this blueprint on your GCP organization, you will need - -- a folder or organization where new projects will be created -- a billing account that will be associated with the new projects -- user groups defined within the organization (provided as `organization_domain` variable): - - gcp-data-analysts - - gcp-data-engineers - - gcp-data-security - -The Data Platform is meant to be executed by a Service Account (or a regular user) having this minimal set of permission: - -- **Billing account** - - `roles/billing.user` -- **Folder level**: - - `roles/resourcemanager.folderAdmin` - - `roles/resourcemanager.projectCreator` -- **KMS Keys** (If CMEK encryption in use): - - `roles/cloudkms.admin` or a custom role with `cloudkms.cryptoKeys.getIamPolicy`, `cloudkms.cryptoKeys.list`, `cloudkms.cryptoKeys.setIamPolicy` permissions -- **Shared VPC host project** (if configured):\ - - `roles/compute.xpnAdmin` on the host project folder or org - - `roles/resourcemanager.projectIamAdmin` on the host project, either with no conditions or with a condition allowing [delegated role grants](https://medium.com/google-cloud/managing-gcp-service-usage-through-delegated-role-grants-a843610f2226#:~:text=Delegated%20role%20grants%20is%20a,setIamPolicy%20permission%20on%20a%20resource.) for `roles/compute.networkUser`, `roles/composer.sharedVpcAgent`, `roles/container.hostServiceAgentUser` - -## Variable configuration - -There are three sets of variables you will need to fill in: - -```tfvars -prefix = "dat-plat" -project_config = { - parent = "folders/1111111111" - billing_account_id = "1111111-2222222-33333333" -} -organization_domain = "domain.com" -``` - -For more fine details check variables on [`variables.tf`](./variables.tf) and update according to the desired configuration. Remember to create team groups described [below](#groups). - -Once the configuration is complete, run the project factory by running - -```bash -terraform init -terraform apply -``` - -## How to use this blueprint from Terraform - -While this blueprint can be used as a standalone deployment, it can also be called directly as a Terraform module by providing the variables values as show below: - -```hcl -module "data-platform" { - source = "./fabric/blueprints/data-solutions/data-platform-foundations" - organization_domain = "example.com" - project_config = { - billing_account_id = "123456-123456-123456" - parent = "folders/12345678" - } - # test 12-chars long prefix for FAST mt compatibility - prefix = "test-0123456" -} -# tftest modules=43 resources=347 -``` - -## Customizations - -### Create Cloud Key Management keys as part of the Data Platform - -To create Cloud Key Management keys in the Data Platform you can uncomment the Cloud Key Management resources configured in the [`06-common.tf`](./06-common.tf) file and update Cloud Key Management keys pointers on `local.service_encryption_keys.*` to the local resource created. - -### Assign roles at BQ Dataset level - -To handle multiple groups of `data-analysts` accessing the same Data Warehouse layer projects but only to the dataset belonging to a specific group, you may want to assign roles at BigQuery dataset level instead of at project-level. -To do this, you need to remove IAM binging at project-level for the `data-analysts` group and give roles at BigQuery dataset level using the `iam` variable on `bigquery-dataset` modules. - -### Project Configuration - -The solution can be deployed by creating projects on a given parent (organization or folder) or on existing projects. Configure variable `project_config` accordingly. - -When you rely on existing projects, the blueprint is designed to rely on different projects configuring IAM binding with an additive approach. For discovery or experimentation purposes, you may also configure `project_config.project_ids` to point different projects to one project with the granularity you need. For example, deploy resources from the 'load' project with resources in the 'transformation' project. - -Once you have identified the required project granularity for your use case, we suggest adapting the terraform script accordingly and relying on authoritative IAM binding. - -## Demo pipeline - -The application layer is out of scope of this script. As a demo purpuse only, several Cloud Composer DAGs are provided. Demos will import data from the `drop off` area to the `Data Warehouse Confidential` dataset suing different features. - -You can find examples in the `[demo](./demo)` folder. - -## Cleanup - -If you want to destroy the Data Platform deployment, follow these steps. - -**ATTENTION**: The following procedure will permanently delete all of your data in an irreversible manner. - -```bash -# remove GCS buckets and BQ dataset manually. Projects will be destroyed anyway -for x in $(terraform state list | grep google_storage_bucket.bucket); do - terraform state rm "$x"; -done - -for x in $(terraform state list | grep google_bigquery_dataset); do - terraform state rm "$x"; -done - -terraform destroy -``` - -## Variables - -| name | description | type | required | default | -|---|---|:---:|:---:|:---:| -| [organization_domain](variables.tf#L166) | Organization domain. | string | ✓ | | -| [prefix](variables.tf#L171) | Prefix used for resource names. | string | ✓ | | -| [project_config](variables.tf#L180) | Provide 'billing_account_id' value if project creation is needed, uses existing 'project_ids' if null. Parent is in 'folders/nnn' or 'organizations/nnn' format. | object({…}) | ✓ | | -| [composer_config](variables.tf#L17) | Cloud Composer config. | object({…}) | | {…} | -| [data_catalog_tags](variables.tf#L106) | List of Data Catalog Policy tags to be created with optional IAM binging configuration in {tag => {ROLE => [MEMBERS]}} format. | map(object({…})) | | {…} | -| [deletion_protection](variables.tf#L120) | Prevent Terraform from destroying data storage resources (storage buckets, GKE clusters, CloudSQL instances) in this blueprint. When this field is set in Terraform state, a terraform destroy or terraform apply that would delete data storage resources will fail. | bool | | false | -| [groups](variables.tf#L127) | User groups. | map(string) | | {…} | -| [location](variables.tf#L137) | Location used for multi-regional resources. | string | | "eu" | -| [network_config](variables.tf#L143) | Shared VPC network configurations to use. If null networks will be created in projects with preconfigured values. | object({…}) | | null | -| [project_services](variables.tf#L215) | List of core services enabled on all projects. | list(string) | | […] | -| [project_suffix](variables.tf#L226) | Suffix used only for project ids. | string | | null | -| [region](variables.tf#L232) | Region used for regional resources. | string | | "europe-west1" | -| [service_encryption_keys](variables.tf#L238) | Cloud KMS to use to encrypt different services. Key location should match service region. | object({…}) | | {} | - -## Outputs - -| name | description | sensitive | -|---|---|:---:| -| [bigquery-datasets](outputs.tf#L16) | BigQuery datasets. | | -| [demo_commands](outputs.tf#L26) | Demo commands. Relevant only if Composer is deployed. | | -| [df_template](outputs.tf#L49) | Dataflow template image and template details. | | -| [gcs-buckets](outputs.tf#L58) | GCS buckets. | | -| [projects](outputs.tf#L71) | GCP Projects information. | | -| [vpc_network](outputs.tf#L97) | VPC network. | | -| [vpc_subnet](outputs.tf#L106) | VPC subnetworks. | | - -## TODOs - -Features to add in future releases: - -- Add example on how to use Cloud Data Loss Prevention -- Add solution to handle Tables, Views, and Authorized Views lifecycle -- Add solution to handle Metadata lifecycle diff --git a/blueprints/data-solutions/data-platform-foundations/backend.tf.sample b/blueprints/data-solutions/data-platform-foundations/backend.tf.sample deleted file mode 100644 index 1e1c012a4..000000000 --- a/blueprints/data-solutions/data-platform-foundations/backend.tf.sample +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# The `impersonate_service_account` option require the identity launching terraform -# role `roles/iam.serviceAccountTokenCreator` on the Service Account specified. - -terraform { - backend "gcs" { - bucket = "BUCKET_NAME" - prefix = "PREFIX" - impersonate_service_account = "SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" - } -} -provider "google" { - impersonate_service_account = "SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" -} -provider "google-beta" { - impersonate_service_account = "SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" -} \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/README.md b/blueprints/data-solutions/data-platform-foundations/demo/README.md deleted file mode 100644 index 639549fca..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Data ingestion Demo - -In this folder, you can find an example to ingest data on the `data platform` instantiated [here](../). - -The example is not intended to be a production-ready code. - -## Demo use case -The demo imports purchase data generated by a store. - -## Input files -Data are uploaded to the `drop off` GCS bucket. File structure: - - `customers.csv`: Comma separate value with customer information in the following format: Customer ID, Name, Surname, Registration Timestamp - - `purchases.csv`: Comma separate value with customer information in the following format: Item ID, Customer ID, Item, Item price, Purchase Timestamp - -## Data processing pipelines -Different data pipelines are provided to highlight different features and patterns. For the purpose of the example, a single pipeline handle all data lifecycles. When adapting them to your real use case, you may want to evaluate the option to handle each functional step on a separate pipeline or a dedicated tool. For example, you may want to use `Dataform` to handle data schemas lifecycle. - -Below you can find a description of each example: - - Simple import data: [`datapipeline.py`](./datapipeline.py) is a simple pipeline to import provided data from the `drop off` Google Cloud Storage bucket to the Data Hub Confidential layer joining `customers` and `purchases` tables into `customerpurchase` table. - - Import data with Policy Tags: [`datapipeline_dc_tags.py`](./datapipeline.py) imports provided data from `drop off` bucket to the Data Hub Confidential layer protecting sensitive data using Data Catalog policy Tags. - - Delete tables: [`delete_table.py`](./delete_table.py) deletes BigQuery tables created by import pipelines. - -## Running the demo -To run demo examples, please follow the following steps: - -- 01: Copy sample data to the `drop off` Cloud Storage bucket impersonating the `load` service account. -- 02: Copy sample data structure definition in the `orchestration` Cloud Storage bucket impersonating the `orchestration` service account. -- 03: Copy the Cloud Composer DAG to the Cloud Composer Storage bucket impersonating the `orchestration` service account. -- 04: Build the Dataflow Flex template and image via a Cloud Build pipeline -- 05: Open the Cloud Composer Airflow UI and run the imported DAG. -- 06: Run the BigQuery query to see results. - -You can find pre-computed commands in the `demo_commands` output variable of the deployed terraform [data pipeline](../). diff --git a/blueprints/data-solutions/data-platform-foundations/demo/data/customer_purchase.json b/blueprints/data-solutions/data-platform-foundations/demo/data/customer_purchase.json deleted file mode 100644 index d97e228f1..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/data/customer_purchase.json +++ /dev/null @@ -1,50 +0,0 @@ -[ - { - "mode": "REQUIRED", - "name": "id", - "type": "INTEGER", - "description": "ID" - }, - { - "mode": "REQUIRED", - "name": "customer_id", - "type": "INTEGER", - "description": "ID" - }, - { - "mode": "REQUIRED", - "name": "purchase_id", - "type": "INTEGER", - "description": "ID" - }, - { - "mode": "REQUIRED", - "name": "customer_name", - "type": "STRING", - "description": "Name" - }, - { - "mode": "REQUIRED", - "name": "customer_surname", - "type": "STRING", - "description": "Surname" - }, - { - "mode": "REQUIRED", - "name": "purchase_item", - "type": "STRING", - "description": "Item Name" - }, - { - "mode": "REQUIRED", - "name": "price", - "type": "FLOAT", - "description": "Item Price" - }, - { - "mode": "REQUIRED", - "name": "purchase_timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - } -] \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/data/customers.csv b/blueprints/data-solutions/data-platform-foundations/demo/data/customers.csv deleted file mode 100644 index ea6aa7533..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/data/customers.csv +++ /dev/null @@ -1,12 +0,0 @@ -1,Name1,Surname1,1636972001 -2,Name2,Surname2,1636972002 -3,Name3,Surname3,1636972003 -4,Name4,Surname4,1636972004 -5,Name5,Surname5,1636972005 -6,Name6,Surname6,1636972006 -7,Name7,Surname7,1636972007 -8,Name8,Surname8,1636972008 -9,Name9,Surname9,1636972009 -10,Name11,Surname11,1636972010 -11,Name12,Surname12,1636972011 -12,Name13,Surname13,1636972012 \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/data/customers.json b/blueprints/data-solutions/data-platform-foundations/demo/data/customers.json deleted file mode 100644 index c685279d1..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/data/customers.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "mode": "REQUIRED", - "name": "id", - "type": "INTEGER", - "description": "ID" - }, - { - "mode": "REQUIRED", - "name": "name", - "type": "STRING", - "description": "Name" - }, - { - "mode": "REQUIRED", - "name": "surname", - "type": "STRING", - "description": "Surname" - }, - { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - } -] \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/data/customers_schema.json b/blueprints/data-solutions/data-platform-foundations/demo/data/customers_schema.json deleted file mode 100644 index b751a5114..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/data/customers_schema.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "BigQuery Schema": [ - { - "mode": "REQUIRED", - "name": "id", - "type": "INTEGER", - "description": "ID" - }, - { - "mode": "REQUIRED", - "name": "name", - "type": "STRING", - "description": "Name" - }, - { - "mode": "REQUIRED", - "name": "surname", - "type": "STRING", - "description": "Surname" - }, - { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - } - ] -} \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/data/customers_udf.js b/blueprints/data-solutions/data-platform-foundations/demo/data/customers_udf.js deleted file mode 100644 index 11e1cfe4b..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/data/customers_udf.js +++ /dev/null @@ -1,12 +0,0 @@ -function transform(line) { - var values = line.split(','); - - var obj = new Object(); - obj.id = values[0] - obj.name = values[1]; - obj.surname = values[2]; - obj.timestamp = values[3]; - var jsonString = JSON.stringify(obj); - - return jsonString; -} \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/data/purchases.csv b/blueprints/data-solutions/data-platform-foundations/demo/data/purchases.csv deleted file mode 100644 index 0b0de75cd..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/data/purchases.csv +++ /dev/null @@ -1,20 +0,0 @@ -1,1,Car1,5000,1636972012 -1,1,Car1,7000,1636972045 -1,2,Car1,6000,1636972088 -1,2,Car1,8000,16369720099 -1,3,Car1,10000,1636972102 -1,3,Car1,50000,1636972180 -1,4,Car1,13000,1636972260 -1,4,Car1,5000,1636972302 -1,5,Car1,2000,1636972408 -1,1,Car1,77000,1636972501 -1,1,Car1,64000,1636975001 -1,8,Car1,2000,1636976001 -1,9,Car1,4000,1636977001 -1,10,Car1,18000,1636982001 -1,11,Car1,21000,1636992001 -1,11,Car1,33000,1636932001 -1,11,Car1,37000,1636872001 -1,11,Car1,26000,1636772001 -1,12,Car1,22000,1636672001 -1,4,Car1,11000,1636952001 \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/data/purchases.json b/blueprints/data-solutions/data-platform-foundations/demo/data/purchases.json deleted file mode 100644 index 78eb024ce..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/data/purchases.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "mode": "REQUIRED", - "name": "id", - "type": "INTEGER", - "description": "ID" - }, - { - "mode": "REQUIRED", - "name": "customer_id", - "type": "INTEGER", - "description": "ID" - }, - { - "mode": "REQUIRED", - "name": "item", - "type": "STRING", - "description": "Item Name" - }, - { - "mode": "REQUIRED", - "name": "price", - "type": "FLOAT", - "description": "Item Price" - }, - { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - } -] \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/data/purchases_schema.json b/blueprints/data-solutions/data-platform-foundations/demo/data/purchases_schema.json deleted file mode 100644 index 68731743a..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/data/purchases_schema.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "BigQuery Schema": [ - { - "mode": "REQUIRED", - "name": "id", - "type": "INTEGER", - "description": "ID" - }, - { - "mode": "REQUIRED", - "name": "customer_id", - "type": "INTEGER", - "description": "ID" - }, - { - "mode": "REQUIRED", - "name": "item", - "type": "STRING", - "description": "Item Name" - }, - { - "mode": "REQUIRED", - "name": "price", - "type": "FLOAT", - "description": "Item Price" - }, - { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - } - ] -} \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/data/purchases_udf.js b/blueprints/data-solutions/data-platform-foundations/demo/data/purchases_udf.js deleted file mode 100644 index d6ffde53c..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/data/purchases_udf.js +++ /dev/null @@ -1,13 +0,0 @@ -function transform(line) { - var values = line.split(','); - - var obj = new Object(); - obj.id = values[0]; - obj.customer_id = values[1]; - obj.item = values[2]; - obj.price = values[3]; - obj.timestamp = values[4]; - var jsonString = JSON.stringify(obj); - - return jsonString; -} \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/.gitignore b/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/.gitignore deleted file mode 100644 index 68bc17f9f..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/.gitignore +++ /dev/null @@ -1,160 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ diff --git a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/Dockerfile b/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/Dockerfile deleted file mode 100644 index 69c6d2eef..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FROM gcr.io/dataflow-templates-base/python39-template-launcher-base - -ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="/template/requirements.txt" -ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/csv2bq.py" - -COPY ./src/ /template - -RUN apt-get update \ - && apt-get install -y libffi-dev git \ - && rm -rf /var/lib/apt/lists/* \ - && pip install --no-cache-dir --upgrade pip \ - && pip install --no-cache-dir -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE \ - && pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE - -ENV PIP_NO_DEPS=True diff --git a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/README.md b/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/README.md deleted file mode 100644 index b052fab05..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/README.md +++ /dev/null @@ -1,122 +0,0 @@ -## Pipeline summary -This demo serves as a simple example of building and launching a Flex Template Dataflow pipeline. The code mainly focuses on reading a CSV file as input along with a JSON schema file as side input. The pipeline Parses both inputs and writes the data to the relevant BigQuery table while applying the schema passed from input. - -![Dataflow pipeline overview](../../images/df_demo_pipeline.png "Dataflow pipeline overview") - - -## Local development run - -For local development, the pipeline can be launched from the local machine for testing purposes using different runners depending on the scope of the test. - -### Using the Beam DirectRunner -The below example uses the Beam DirectRunner. The use case for this runner is mainly for quick local tests on the development environment with low volume of data. - -``` -CSV_FILE=gs://[TEST-BUCKET]/customers.csv -JSON_SCHEMA=gs://[TEST-BUCKET]/customers_schema.json -OUTPUT_TABLE=[TEST-PROJ].[TEST-DATASET].customers -PIPELINE_STAGIN_PATH="gs://[TEST-STAGING-BUCKET]" - -python src/csv2bq.py \ ---runner="DirectRunner" \ ---csv_file=$CSV_FILE \ ---json_schema=$JSON_SCHEMA \ ---output_table=$OUTPUT_TABLE \ ---temp_location=$PIPELINE_STAGIN_PATH/tmp -``` - -*Note:* All paths mentioned can be local paths or on GCS. For cloud resources referenced (GCS and BigQuery), make sure that the user launching the command is authenticated to GCP via `gcloud auth application-default login` and has the required access privileges to those resources. - -### Using the DataflowRunner with a local CLI launch - -The below example triggers the pipeline on Dataflow from your local development environment. The use case for this is for running local tests on larger volumes of test data and verifying that the pipeline runs well on Dataflow, before compiling it into a template. - -``` -PROJECT_ID=[TEST-PROJECT] -REGION=[REGION] -SUBNET=[SUBNET-NAME] -DEV_SERVICE_ACCOUNT=[DEV-SA] - -PIPELINE_STAGIN_PATH="gs://[TEST-STAGING-BUCKET]" -CSV_FILE=gs://[TEST-BUCKET]/customers.csv -JSON_SCHEMA=gs://[TEST-BUCKET]/customers_schema.json -OUTPUT_TABLE=[TEST-PROJ].[TEST-DATASET].customers - -python src/csv2bq.py \ ---runner="Dataflow" \ ---project=$PROJECT_ID \ ---region=$REGION \ ---csv_file=$CSV_FILE \ ---json_schema=$JSON_SCHEMA \ ---output_table=$OUTPUT_TABLE \ ---temp_location=$PIPELINE_STAGIN_PATH/tmp ---staging_location=$PIPELINE_STAGIN_PATH/stage \ ---subnetwork="regions/$REGION/subnetworks/$SUBNET" \ ---impersonate_service_account=$DEV_SERVICE_ACCOUNT \ ---no_use_public_ips -``` - -In terms of resource access privilege, you can choose to impersonate another service account, which could be defined for development resource access. The authenticated user launching this pipeline will need to have the role `roles/iam.serviceAccountTokenCreator`. If you choose to launch the pipeline without service account impersonation, it will use the default compute service account assigned of the target project. - -## Dataflow Flex Template run - -For production, and as outline in the Data Platform demo, we build and launch the pipeline as a Flex Template, making it available for other cloud services(such as Apache Airflow) and users to trigger launch instances of it on demand. - -### Build launch - -Below is an example for triggering the Dataflow flex template build pipeline defined in `cloudbuild.yaml`. The Terraform output provides an example as well filled with the parameters values based on the generated resources in the data platform. - -``` -GCP_PROJECT="[ORCHESTRATION-PROJECT]" -TEMPLATE_IMAGE="[REGION].pkg.dev/[ORCHESTRATION-PROJECT]/[REPOSITORY]/csv2bq:latest" -TEMPLATE_PATH="gs://[DATAFLOW-TEMPLATE-BUCKEt]/csv2bq.json" -STAGIN_PATH="gs://[ORCHESTRATION-STAGING-BUCKET]/build" -LOG_PATH="gs://[ORCHESTRATION-LOGS-BUCKET]/logs" -REGION="[REGION]" -BUILD_SERVICE_ACCOUNT=orc-sa-df-build@[SERVICE_PROJECT_ID].iam.gserviceaccount.com - -gcloud builds submit \ - --config=cloudbuild.yaml \ - --project=$GCP_PROJECT \ - --region=$REGION \ - --gcs-log-dir=$LOG_PATH \ - --gcs-source-staging-dir=$STAGIN_PATH \ - --substitutions=_TEMPLATE_IMAGE=$TEMPLATE_IMAGE,_TEMPLATE_PATH=$TEMPLATE_PATH,_DOCKER_DIR="." \ - --impersonate-service-account=$BUILD_SERVICE_ACCOUNT -``` - -**Note:** For the scope of the demo, the launch of this build is manual, but in production, this build would be launched via a configured cloud build trigger when new changes are merged into the code branch of the Dataflow template. - -### Dataflow Flex Template run - -After the build step succeeds. You can launch dataflow pipeline from CLI (outline in this example) or the API via Airflow's operator. For the use case of the data platform, the Dataflow pipeline would be launched via the orchestration service account, which is what the Airflow DAG is also using in the scope of this demo. - -**Note:** In the data platform demo, the launch of this Dataflow pipeline is handled by the airflow operator (DataflowStartFlexTemplateOperator). - -``` -#!/bin/bash - -PROJECT_ID=[LOAD-PROJECT] -REGION=[REGION] -ORCH_SERVICE_ACCOUNT=orchestrator@[SERVICE_PROJECT_ID].iam.gserviceaccount.com -SUBNET=[SUBNET-NAME] - -PIPELINE_STAGIN_PATH="gs://[LOAD-STAGING-BUCKET]/build" -CSV_FILE=gs://[DROP-ZONE-BUCKET]/customers.csv -JSON_SCHEMA=gs://[ORCHESTRATION-BUCKET]/customers_schema.json -OUTPUT_TABLE=[DESTINATION-PROJ].[DESTINATION-DATASET].customers -TEMPLATE_PATH=gs://[ORCHESTRATION-DF-GCS]/csv2bq.json - - -gcloud dataflow flex-template run "csv2bq-`date +%Y%m%d-%H%M%S`" \ - --template-file-gcs-location $TEMPLATE_PATH \ - --parameters temp_location="$PIPELINE_STAGIN_PATH/tmp" \ - --parameters staging_location="$PIPELINE_STAGIN_PATH/stage" \ - --parameters csv_file=$CSV_FILE \ - --parameters json_schema=$JSON_SCHEMA\ - --parameters output_table=$OUTPUT_TABLE \ - --region $REGION \ - --project $PROJECT_ID \ - --subnetwork="regions/$REGION/subnetworks/$SUBNET" \ - --service-account-email=$ORCH_SERVICE_ACCOUNT -``` diff --git a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/cloudbuild.yaml b/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/cloudbuild.yaml deleted file mode 100644 index 11354c2ed..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/cloudbuild.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -steps: -- name: gcr.io/cloud-builders/gcloud - id: "Build docker image" - args: ['builds', 'submit', '--tag', '$_TEMPLATE_IMAGE', '.'] - dir: '$_DOCKER_DIR' - waitFor: ['-'] -- name: gcr.io/cloud-builders/gcloud - id: "Build template" - args: ['dataflow', - 'flex-template', - 'build', - '$_TEMPLATE_PATH', - '--image=$_TEMPLATE_IMAGE', - '--sdk-language=PYTHON' - ] - waitFor: ['Build docker image'] diff --git a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/src/csv2bq.py b/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/src/csv2bq.py deleted file mode 100644 index c162f9241..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/src/csv2bq.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import apache_beam as beam -from apache_beam.io import ReadFromText, Read, WriteToBigQuery, \ - BigQueryDisposition -from apache_beam.options.pipeline_options import PipelineOptions, SetupOptions -from apache_beam.io.filesystems import FileSystems -import json -import argparse - - -class ParseRow(beam.DoFn): - """ - Splits a given csv row by a separator, validates fields and returns a dict - structure compatible with the BigQuery transform - """ - - def process(self, element: str, table_fields: list, delimiter: str): - split_row = element.split(delimiter) - parsed_row = {} - - for i, field in enumerate(table_fields['BigQuery Schema']): - parsed_row[field['name']] = split_row[i] - - yield parsed_row - - -def run(argv=None, save_main_session=True): - parser = argparse.ArgumentParser() - parser.add_argument('--csv_file', type=str, required=True, - help='Path to the CSV file') - parser.add_argument('--json_schema', type=str, required=True, - help='Path to the JSON schema') - parser.add_argument('--output_table', type=str, required=True, - help='BigQuery path for the output table') - - args, pipeline_args = parser.parse_known_args(argv) - pipeline_options = PipelineOptions(pipeline_args) - pipeline_options.view_as(SetupOptions).save_main_session = save_main_session - - with beam.Pipeline(options=pipeline_options) as p: - - def get_table_schema(table_path, table_schema): - return {'fields': table_schema['BigQuery Schema']} - - csv_input = p | 'Read CSV' >> ReadFromText(args.csv_file) - schema_input = p | 'Load Schema' >> beam.Create( - json.loads(FileSystems.open(args.json_schema).read())) - - table_fields = beam.pvalue.AsDict(schema_input) - parsed = csv_input | 'Parse and validate rows' >> beam.ParDo( - ParseRow(), table_fields, ',') - - parsed | 'Write to BigQuery' >> WriteToBigQuery( - args.output_table, schema=get_table_schema, - create_disposition=BigQueryDisposition.CREATE_IF_NEEDED, - write_disposition=BigQueryDisposition.WRITE_TRUNCATE, - schema_side_inputs=(table_fields,)) - - -if __name__ == "__main__": - run() diff --git a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/src/requirements.txt b/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/src/requirements.txt deleted file mode 100644 index 21c569a0d..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/dataflow-csv2bq/src/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -apache-beam==2.44.0 diff --git a/blueprints/data-solutions/data-platform-foundations/demo/datapipeline.py b/blueprints/data-solutions/data-platform-foundations/demo/datapipeline.py deleted file mode 100644 index 124982536..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/datapipeline.py +++ /dev/null @@ -1,213 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -------------------------------------------------------------------------------- -# Load The Dependencies -# -------------------------------------------------------------------------------- - -import datetime - -from airflow import models -from airflow.models.variable import Variable -from airflow.providers.google.cloud.operators.dataflow import \ - DataflowTemplatedJobStartOperator -from airflow.operators import empty -from airflow.providers.google.cloud.operators.bigquery import \ - BigQueryInsertJobOperator - -# -------------------------------------------------------------------------------- -# Set variables - Needed for the DEMO -# -------------------------------------------------------------------------------- -BQ_LOCATION = Variable.get("BQ_LOCATION") -DATA_CAT_TAGS = Variable.get("DATA_CAT_TAGS", deserialize_json=True) -DWH_LAND_PRJ = Variable.get("DWH_LAND_PRJ") -DWH_LAND_BQ_DATASET = Variable.get("DWH_LAND_BQ_DATASET") -DWH_LAND_GCS = Variable.get("DWH_LAND_GCS") -DWH_CURATED_PRJ = Variable.get("DWH_CURATED_PRJ") -DWH_CURATED_BQ_DATASET = Variable.get("DWH_CURATED_BQ_DATASET") -DWH_CURATED_GCS = Variable.get("DWH_CURATED_GCS") -DWH_CONFIDENTIAL_PRJ = Variable.get("DWH_CONFIDENTIAL_PRJ") -DWH_CONFIDENTIAL_BQ_DATASET = Variable.get("DWH_CONFIDENTIAL_BQ_DATASET") -DWH_CONFIDENTIAL_GCS = Variable.get("DWH_CONFIDENTIAL_GCS") -GCP_REGION = Variable.get("GCP_REGION") -DRP_PRJ = Variable.get("DRP_PRJ") -DRP_BQ = Variable.get("DRP_BQ") -DRP_GCS = Variable.get("DRP_GCS") -DRP_PS = Variable.get("DRP_PS") -LOD_PRJ = Variable.get("LOD_PRJ") -LOD_GCS_STAGING = Variable.get("LOD_GCS_STAGING") -LOD_NET_VPC = Variable.get("LOD_NET_VPC") -LOD_NET_SUBNET = Variable.get("LOD_NET_SUBNET") -LOD_SA_DF = Variable.get("LOD_SA_DF") -ORC_PRJ = Variable.get("ORC_PRJ") -ORC_GCS = Variable.get("ORC_GCS") -TRF_PRJ = Variable.get("TRF_PRJ") -TRF_GCS_STAGING = Variable.get("TRF_GCS_STAGING") -TRF_NET_VPC = Variable.get("TRF_NET_VPC") -TRF_NET_SUBNET = Variable.get("TRF_NET_SUBNET") -TRF_SA_DF = Variable.get("TRF_SA_DF") -TRF_SA_BQ = Variable.get("TRF_SA_BQ") -DF_KMS_KEY = Variable.get("DF_KMS_KEY", "") -DF_REGION = Variable.get("GCP_REGION") -DF_ZONE = Variable.get("GCP_REGION") + "-b" - -# -------------------------------------------------------------------------------- -# Set default arguments -# -------------------------------------------------------------------------------- - -# If you are running Airflow in more than one time zone -# see https://airflow.apache.org/docs/apache-airflow/stable/timezone.html -# for best practices -yesterday = datetime.datetime.now() - datetime.timedelta(days=1) - -default_args = { - 'owner': 'airflow', - 'start_date': yesterday, - 'depends_on_past': False, - 'email': [''], - 'email_on_failure': False, - 'email_on_retry': False, - 'retries': 1, - 'retry_delay': datetime.timedelta(minutes=5), - 'dataflow_default_options': { - 'location': DF_REGION, - 'zone': DF_ZONE, - 'stagingLocation': LOD_GCS_STAGING, - 'tempLocation': LOD_GCS_STAGING + "/tmp", - 'serviceAccountEmail': LOD_SA_DF, - 'subnetwork': LOD_NET_SUBNET, - 'ipConfiguration': "WORKER_IP_PRIVATE", - 'kmsKeyName': DF_KMS_KEY - }, -} - -# -------------------------------------------------------------------------------- -# Main DAG -# -------------------------------------------------------------------------------- - -with models.DAG('data_pipeline_dag', default_args=default_args, - schedule_interval=None) as dag: - start = empty.EmptyOperator(task_id='start', trigger_rule='all_success') - - end = empty.EmptyOperator(task_id='end', trigger_rule='all_success') - - # Bigquery Tables automatically created for demo porpuse. - # Consider a dedicated pipeline or tool for a real life scenario. - customers_import = DataflowTemplatedJobStartOperator( - task_id="dataflow_customers_import", - template="gs://dataflow-templates/latest/GCS_Text_to_BigQuery", - project_id=LOD_PRJ, - location=DF_REGION, - parameters={ - "javascriptTextTransformFunctionName": - "transform", - "JSONPath": - ORC_GCS + "/customers_schema.json", - "javascriptTextTransformGcsPath": - ORC_GCS + "/customers_udf.js", - "inputFilePattern": - DRP_GCS + "/customers.csv", - "outputTable": - DWH_LAND_PRJ + ":" + DWH_LAND_BQ_DATASET + ".customers", - "bigQueryLoadingTemporaryDirectory": - LOD_GCS_STAGING + "/tmp/bq/", - }, - ) - - purchases_import = DataflowTemplatedJobStartOperator( - task_id="dataflow_purchases_import", - template="gs://dataflow-templates/latest/GCS_Text_to_BigQuery", - project_id=LOD_PRJ, - location=DF_REGION, - parameters={ - "javascriptTextTransformFunctionName": - "transform", - "JSONPath": - ORC_GCS + "/purchases_schema.json", - "javascriptTextTransformGcsPath": - ORC_GCS + "/purchases_udf.js", - "inputFilePattern": - DRP_GCS + "/purchases.csv", - "outputTable": - DWH_LAND_PRJ + ":" + DWH_LAND_BQ_DATASET + ".purchases", - "bigQueryLoadingTemporaryDirectory": - LOD_GCS_STAGING + "/tmp/bq/", - }, - ) - - join_customer_purchase = BigQueryInsertJobOperator( - task_id='bq_join_customer_purchase', gcp_conn_id='bigquery_default', - project_id=TRF_PRJ, location=BQ_LOCATION, configuration={ - 'jobType': 'QUERY', - 'query': { - 'query': - """SELECT - c.id as customer_id, - p.id as purchase_id, - p.item as item, - p.price as price, - p.timestamp as timestamp - FROM `{dwh_0_prj}.{dwh_0_dataset}.customers` c - JOIN `{dwh_0_prj}.{dwh_0_dataset}.purchases` p ON c.id = p.customer_id - """.format( - dwh_0_prj=DWH_LAND_PRJ, - dwh_0_dataset=DWH_LAND_BQ_DATASET, - ), - 'destinationTable': { - 'projectId': DWH_CURATED_PRJ, - 'datasetId': DWH_CURATED_BQ_DATASET, - 'tableId': 'customer_purchase' - }, - 'writeDisposition': - 'WRITE_TRUNCATE', - "useLegacySql": - False - } - }, impersonation_chain=[TRF_SA_BQ]) - - confidential_customer_purchase = BigQueryInsertJobOperator( - task_id='bq_confidential_customer_purchase', - gcp_conn_id='bigquery_default', project_id=TRF_PRJ, location=BQ_LOCATION, - configuration={ - 'jobType': 'QUERY', - 'query': { - 'query': - """SELECT - c.id as customer_id, - p.id as purchase_id, - c.name as name, - c.surname as surname, - p.item as item, - p.price as price, - p.timestamp as timestamp - FROM `{dwh_0_prj}.{dwh_0_dataset}.customers` c - JOIN `{dwh_0_prj}.{dwh_0_dataset}.purchases` p ON c.id = p.customer_id - """.format( - dwh_0_prj=DWH_LAND_PRJ, - dwh_0_dataset=DWH_LAND_BQ_DATASET, - ), - 'destinationTable': { - 'projectId': DWH_CONFIDENTIAL_PRJ, - 'datasetId': DWH_CONFIDENTIAL_BQ_DATASET, - 'tableId': 'customer_purchase' - }, - 'writeDisposition': - 'WRITE_TRUNCATE', - "useLegacySql": - False - } - }, impersonation_chain=[TRF_SA_BQ]) - - start >> [customers_import, purchases_import - ] >> join_customer_purchase >> confidential_customer_purchase >> end diff --git a/blueprints/data-solutions/data-platform-foundations/demo/datapipeline_dc_tags.py b/blueprints/data-solutions/data-platform-foundations/demo/datapipeline_dc_tags.py deleted file mode 100644 index 55d57a093..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/datapipeline_dc_tags.py +++ /dev/null @@ -1,419 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -------------------------------------------------------------------------------- -# Load The Dependencies -# -------------------------------------------------------------------------------- - -import datetime - -from airflow import models -from airflow.models.variable import Variable -from airflow.providers.google.cloud.operators.dataflow import \ - DataflowTemplatedJobStartOperator -from airflow.operators import empty -from airflow.providers.google.cloud.operators.bigquery import \ - BigQueryInsertJobOperator, BigQueryUpsertTableOperator, \ - BigQueryUpdateTableSchemaOperator -from airflow.utils.task_group import TaskGroup - -# -------------------------------------------------------------------------------- -# Set variables - Needed for the DEMO -# -------------------------------------------------------------------------------- -BQ_LOCATION = Variable.get("BQ_LOCATION") -DATA_CAT_TAGS = Variable.get("DATA_CAT_TAGS", deserialize_json=True) -DWH_LAND_PRJ = Variable.get("DWH_LAND_PRJ") -DWH_LAND_BQ_DATASET = Variable.get("DWH_LAND_BQ_DATASET") -DWH_LAND_GCS = Variable.get("DWH_LAND_GCS") -DWH_CURATED_PRJ = Variable.get("DWH_CURATED_PRJ") -DWH_CURATED_BQ_DATASET = Variable.get("DWH_CURATED_BQ_DATASET") -DWH_CURATED_GCS = Variable.get("DWH_CURATED_GCS") -DWH_CONFIDENTIAL_PRJ = Variable.get("DWH_CONFIDENTIAL_PRJ") -DWH_CONFIDENTIAL_BQ_DATASET = Variable.get("DWH_CONFIDENTIAL_BQ_DATASET") -DWH_CONFIDENTIAL_GCS = Variable.get("DWH_CONFIDENTIAL_GCS") -GCP_REGION = Variable.get("GCP_REGION") -DRP_PRJ = Variable.get("DRP_PRJ") -DRP_BQ = Variable.get("DRP_BQ") -DRP_GCS = Variable.get("DRP_GCS") -DRP_PS = Variable.get("DRP_PS") -LOD_PRJ = Variable.get("LOD_PRJ") -LOD_GCS_STAGING = Variable.get("LOD_GCS_STAGING") -LOD_NET_VPC = Variable.get("LOD_NET_VPC") -LOD_NET_SUBNET = Variable.get("LOD_NET_SUBNET") -LOD_SA_DF = Variable.get("LOD_SA_DF") -ORC_PRJ = Variable.get("ORC_PRJ") -ORC_GCS = Variable.get("ORC_GCS") -TRF_PRJ = Variable.get("TRF_PRJ") -TRF_GCS_STAGING = Variable.get("TRF_GCS_STAGING") -TRF_NET_VPC = Variable.get("TRF_NET_VPC") -TRF_NET_SUBNET = Variable.get("TRF_NET_SUBNET") -TRF_SA_DF = Variable.get("TRF_SA_DF") -TRF_SA_BQ = Variable.get("TRF_SA_BQ") -DF_KMS_KEY = Variable.get("DF_KMS_KEY", "") -DF_REGION = Variable.get("GCP_REGION") -DF_ZONE = Variable.get("GCP_REGION") + "-b" - -# -------------------------------------------------------------------------------- -# Set default arguments -# -------------------------------------------------------------------------------- - -# If you are running Airflow in more than one time zone -# see https://airflow.apache.org/docs/apache-airflow/stable/timezone.html -# for best practices -yesterday = datetime.datetime.now() - datetime.timedelta(days=1) - -default_args = { - 'owner': 'airflow', - 'start_date': yesterday, - 'depends_on_past': False, - 'email': [''], - 'email_on_failure': False, - 'email_on_retry': False, - 'retries': 1, - 'retry_delay': datetime.timedelta(minutes=5), - 'dataflow_default_options': { - 'location': DF_REGION, - 'zone': DF_ZONE, - 'stagingLocation': LOD_GCS_STAGING, - 'tempLocation': LOD_GCS_STAGING + "/tmp", - 'serviceAccountEmail': LOD_SA_DF, - 'subnetwork': LOD_NET_SUBNET, - 'ipConfiguration': "WORKER_IP_PRIVATE", - 'kmsKeyName': DF_KMS_KEY - }, -} - -# -------------------------------------------------------------------------------- -# Main DAG -# -------------------------------------------------------------------------------- - -with models.DAG('data_pipeline_dc_tags_dag', default_args=default_args, - schedule_interval=None) as dag: - start = empty.EmptyOperator(task_id='start', trigger_rule='all_success') - - end = empty.EmptyOperator(task_id='end', trigger_rule='all_success') - - # Bigquery Tables created here for demo porpuse. - # Consider a dedicated pipeline or tool for a real life scenario. - with TaskGroup('upsert_table') as upsert_table: - upsert_table_customers = BigQueryUpsertTableOperator( - task_id="upsert_table_customers", - project_id=DWH_LAND_PRJ, - dataset_id=DWH_LAND_BQ_DATASET, - impersonation_chain=[LOD_SA_DF], - table_resource={ - "tableReference": { - "tableId": "customers" - }, - }, - ) - - upsert_table_purchases = BigQueryUpsertTableOperator( - task_id="upsert_table_purchases", - project_id=DWH_LAND_PRJ, - dataset_id=DWH_LAND_BQ_DATASET, - impersonation_chain=[LOD_SA_DF], - table_resource={"tableReference": { - "tableId": "purchases" - }}, - ) - - upsert_table_customer_purchase_curated = BigQueryUpsertTableOperator( - task_id="upsert_table_customer_purchase_curated", - project_id=DWH_CURATED_PRJ, - dataset_id=DWH_CURATED_BQ_DATASET, - impersonation_chain=[TRF_SA_BQ], - table_resource={"tableReference": { - "tableId": "customer_purchase" - }}, - ) - - upsert_table_customer_purchase_confidential = BigQueryUpsertTableOperator( - task_id="upsert_table_customer_purchase_confidential", - project_id=DWH_CONFIDENTIAL_PRJ, - dataset_id=DWH_CONFIDENTIAL_BQ_DATASET, - impersonation_chain=[TRF_SA_BQ], - table_resource={"tableReference": { - "tableId": "customer_purchase" - }}, - ) - - # Bigquery Tables schema defined here for demo porpuse. - # Consider a dedicated pipeline or tool for a real life scenario. - with TaskGroup('update_schema_table') as update_schema_table: - update_table_schema_customers = BigQueryUpdateTableSchemaOperator( - task_id="update_table_schema_customers", project_id=DWH_LAND_PRJ, - dataset_id=DWH_LAND_BQ_DATASET, table_id="customers", - impersonation_chain=[LOD_SA_DF], include_policy_tags=True, - schema_fields_updates=[{ - "mode": "REQUIRED", - "name": "id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "name", - "type": "STRING", - "description": "Name", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "surname", - "type": "STRING", - "description": "Surname", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - }]) - - update_table_schema_customers = BigQueryUpdateTableSchemaOperator( - task_id="update_table_schema_purchases", project_id=DWH_LAND_PRJ, - dataset_id=DWH_LAND_BQ_DATASET, table_id="purchases", - impersonation_chain=[LOD_SA_DF], include_policy_tags=True, - schema_fields_updates=[{ - "mode": "REQUIRED", - "name": "id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "customer_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "item", - "type": "STRING", - "description": "Item Name" - }, { - "mode": "REQUIRED", - "name": "price", - "type": "FLOAT", - "description": "Item Price" - }, { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - }]) - - update_table_schema_customer_purchase_curated = BigQueryUpdateTableSchemaOperator( - task_id="update_table_schema_customer_purchase_curated", - project_id=DWH_CURATED_PRJ, dataset_id=DWH_CURATED_BQ_DATASET, - table_id="customer_purchase", impersonation_chain=[TRF_SA_BQ], - include_policy_tags=True, schema_fields_updates=[{ - "mode": "REQUIRED", - "name": "customer_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "purchase_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "name", - "type": "STRING", - "description": "Name", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "surname", - "type": "STRING", - "description": "Surname", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "item", - "type": "STRING", - "description": "Item Name" - }, { - "mode": "REQUIRED", - "name": "price", - "type": "FLOAT", - "description": "Item Price" - }, { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - }]) - - update_table_schema_customer_purchase_confidential = BigQueryUpdateTableSchemaOperator( - task_id="update_table_schema_customer_purchase_confidential", - project_id=DWH_CONFIDENTIAL_PRJ, dataset_id=DWH_CONFIDENTIAL_BQ_DATASET, - table_id="customer_purchase", impersonation_chain=[TRF_SA_BQ], - include_policy_tags=True, schema_fields_updates=[{ - "mode": "REQUIRED", - "name": "customer_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "purchase_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "name", - "type": "STRING", - "description": "Name", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "surname", - "type": "STRING", - "description": "Surname", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "item", - "type": "STRING", - "description": "Item Name" - }, { - "mode": "REQUIRED", - "name": "price", - "type": "FLOAT", - "description": "Item Price" - }, { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - }]) - - customers_import = DataflowTemplatedJobStartOperator( - task_id="dataflow_customers_import", - template="gs://dataflow-templates/latest/GCS_Text_to_BigQuery", - project_id=LOD_PRJ, - location=DF_REGION, - parameters={ - "javascriptTextTransformFunctionName": - "transform", - "JSONPath": - ORC_GCS + "/customers_schema.json", - "javascriptTextTransformGcsPath": - ORC_GCS + "/customers_udf.js", - "inputFilePattern": - DRP_GCS + "/customers.csv", - "outputTable": - DWH_LAND_PRJ + ":" + DWH_LAND_BQ_DATASET + ".customers", - "bigQueryLoadingTemporaryDirectory": - LOD_GCS_STAGING + "/tmp/bq/", - }, - ) - - purchases_import = DataflowTemplatedJobStartOperator( - task_id="dataflow_purchases_import", - template="gs://dataflow-templates/latest/GCS_Text_to_BigQuery", - project_id=LOD_PRJ, - location=DF_REGION, - parameters={ - "javascriptTextTransformFunctionName": - "transform", - "JSONPath": - ORC_GCS + "/purchases_schema.json", - "javascriptTextTransformGcsPath": - ORC_GCS + "/purchases_udf.js", - "inputFilePattern": - DRP_GCS + "/purchases.csv", - "outputTable": - DWH_LAND_PRJ + ":" + DWH_LAND_BQ_DATASET + ".purchases", - "bigQueryLoadingTemporaryDirectory": - LOD_GCS_STAGING + "/tmp/bq/", - }, - ) - - join_customer_purchase = BigQueryInsertJobOperator( - task_id='bq_join_customer_purchase', gcp_conn_id='bigquery_default', - project_id=TRF_PRJ, location=BQ_LOCATION, configuration={ - 'jobType': 'QUERY', - 'query': { - 'query': - """SELECT - c.id as customer_id, - p.id as purchase_id, - c.name as name, - c.surname as surname, - p.item as item, - p.price as price, - p.timestamp as timestamp - FROM `{dwh_0_prj}.{dwh_0_dataset}.customers` c - JOIN `{dwh_0_prj}.{dwh_0_dataset}.purchases` p ON c.id = p.customer_id - """.format( - dwh_0_prj=DWH_LAND_PRJ, - dwh_0_dataset=DWH_LAND_BQ_DATASET, - ), - 'destinationTable': { - 'projectId': DWH_CURATED_PRJ, - 'datasetId': DWH_CURATED_BQ_DATASET, - 'tableId': 'customer_purchase' - }, - 'writeDisposition': - 'WRITE_APPEND', - "useLegacySql": - False - } - }, impersonation_chain=[TRF_SA_BQ]) - - confidential_customer_purchase = BigQueryInsertJobOperator( - task_id='bq_confidential_customer_purchase', - gcp_conn_id='bigquery_default', project_id=TRF_PRJ, location=BQ_LOCATION, - configuration={ - 'jobType': 'QUERY', - 'query': { - 'query': - """SELECT - customer_id, - purchase_id, - name, - surname, - item, - price, - timestamp - FROM `{dwh_cur_prj}.{dwh_cur_dataset}.customer_purchase` - """.format( - dwh_cur_prj=DWH_CURATED_PRJ, - dwh_cur_dataset=DWH_CURATED_BQ_DATASET, - ), - 'destinationTable': { - 'projectId': DWH_CONFIDENTIAL_PRJ, - 'datasetId': DWH_CONFIDENTIAL_BQ_DATASET, - 'tableId': 'customer_purchase' - }, - 'writeDisposition': - 'WRITE_APPEND', - "useLegacySql": - False - } - }, impersonation_chain=[TRF_SA_BQ]) - start >> upsert_table >> update_schema_table >> [ - customers_import, purchases_import - ] >> join_customer_purchase >> confidential_customer_purchase >> end diff --git a/blueprints/data-solutions/data-platform-foundations/demo/datapipeline_dc_tags_flex.py b/blueprints/data-solutions/data-platform-foundations/demo/datapipeline_dc_tags_flex.py deleted file mode 100644 index 57a28c12e..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/datapipeline_dc_tags_flex.py +++ /dev/null @@ -1,432 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -------------------------------------------------------------------------------- -# Load The Dependencies -# -------------------------------------------------------------------------------- - -import datetime -import time - -from airflow import models -from airflow.models.variable import Variable -from airflow.operators import empty -from airflow.providers.google.cloud.operators.dataflow import \ - DataflowStartFlexTemplateOperator -from airflow.providers.google.cloud.operators.bigquery import \ - BigQueryInsertJobOperator, BigQueryUpsertTableOperator, \ - BigQueryUpdateTableSchemaOperator -from airflow.utils.task_group import TaskGroup - -# -------------------------------------------------------------------------------- -# Set variables - Needed for the DEMO -# -------------------------------------------------------------------------------- -BQ_LOCATION = Variable.get("BQ_LOCATION") -DATA_CAT_TAGS = Variable.get("DATA_CAT_TAGS", deserialize_json=True) -DWH_LAND_PRJ = Variable.get("DWH_LAND_PRJ") -DWH_LAND_BQ_DATASET = Variable.get("DWH_LAND_BQ_DATASET") -DWH_LAND_GCS = Variable.get("DWH_LAND_GCS") -DWH_CURATED_PRJ = Variable.get("DWH_CURATED_PRJ") -DWH_CURATED_BQ_DATASET = Variable.get("DWH_CURATED_BQ_DATASET") -DWH_CURATED_GCS = Variable.get("DWH_CURATED_GCS") -DWH_CONFIDENTIAL_PRJ = Variable.get("DWH_CONFIDENTIAL_PRJ") -DWH_CONFIDENTIAL_BQ_DATASET = Variable.get("DWH_CONFIDENTIAL_BQ_DATASET") -DWH_CONFIDENTIAL_GCS = Variable.get("DWH_CONFIDENTIAL_GCS") -GCP_REGION = Variable.get("GCP_REGION") -DRP_PRJ = Variable.get("DRP_PRJ") -DRP_BQ = Variable.get("DRP_BQ") -DRP_GCS = Variable.get("DRP_GCS") -DRP_PS = Variable.get("DRP_PS") -LOD_PRJ = Variable.get("LOD_PRJ") -LOD_GCS_STAGING = Variable.get("LOD_GCS_STAGING") -LOD_NET_VPC = Variable.get("LOD_NET_VPC") -LOD_NET_SUBNET = Variable.get("LOD_NET_SUBNET") -LOD_SA_DF = Variable.get("LOD_SA_DF") -ORC_PRJ = Variable.get("ORC_PRJ") -ORC_GCS = Variable.get("ORC_GCS") -ORC_GCS_TMP_DF = Variable.get("ORC_GCS_TMP_DF") -TRF_PRJ = Variable.get("TRF_PRJ") -TRF_GCS_STAGING = Variable.get("TRF_GCS_STAGING") -TRF_NET_VPC = Variable.get("TRF_NET_VPC") -TRF_NET_SUBNET = Variable.get("TRF_NET_SUBNET") -TRF_SA_DF = Variable.get("TRF_SA_DF") -TRF_SA_BQ = Variable.get("TRF_SA_BQ") -DF_KMS_KEY = Variable.get("DF_KMS_KEY", "") -DF_REGION = Variable.get("GCP_REGION") -DF_ZONE = Variable.get("GCP_REGION") + "-b" - -# -------------------------------------------------------------------------------- -# Set default arguments -# -------------------------------------------------------------------------------- - -# If you are running Airflow in more than one time zone -# see https://airflow.apache.org/docs/apache-airflow/stable/timezone.html -# for best practices -yesterday = datetime.datetime.now() - datetime.timedelta(days=1) - -default_args = { - 'owner': 'airflow', - 'start_date': yesterday, - 'depends_on_past': False, - 'email': [''], - 'email_on_failure': False, - 'email_on_retry': False, - 'retries': 1, - 'retry_delay': datetime.timedelta(minutes=5), -} - -dataflow_environment = { - 'serviceAccountEmail': LOD_SA_DF, - 'workerZone': DF_ZONE, - 'stagingLocation': f'{LOD_GCS_STAGING}/staging', - 'tempLocation': f'{LOD_GCS_STAGING}/tmp', - 'subnetwork': LOD_NET_SUBNET, - 'kmsKeyName': DF_KMS_KEY, - 'ipConfiguration': 'WORKER_IP_PRIVATE' -} - -# -------------------------------------------------------------------------------- -# Main DAG -# -------------------------------------------------------------------------------- - -with models.DAG('data_pipeline_dc_tags_dag_flex', default_args=default_args, - schedule_interval=None) as dag: - start = empty.EmptyOperator(task_id='start', trigger_rule='all_success') - - end = empty.EmptyOperator(task_id='end', trigger_rule='all_success') - - # Bigquery Tables created here for demo porpuse. - # Consider a dedicated pipeline or tool for a real life scenario. - with TaskGroup('upsert_table') as upsert_table: - upsert_table_customers = BigQueryUpsertTableOperator( - task_id="upsert_table_customers", - project_id=DWH_LAND_PRJ, - dataset_id=DWH_LAND_BQ_DATASET, - impersonation_chain=[TRF_SA_DF], - table_resource={ - "tableReference": { - "tableId": "customers" - }, - }, - ) - - upsert_table_purchases = BigQueryUpsertTableOperator( - task_id="upsert_table_purchases", - project_id=DWH_LAND_PRJ, - dataset_id=DWH_LAND_BQ_DATASET, - impersonation_chain=[TRF_SA_BQ], - table_resource={"tableReference": { - "tableId": "purchases" - }}, - ) - - upsert_table_customer_purchase_curated = BigQueryUpsertTableOperator( - task_id="upsert_table_customer_purchase_curated", - project_id=DWH_CURATED_PRJ, - dataset_id=DWH_CURATED_BQ_DATASET, - impersonation_chain=[TRF_SA_BQ], - table_resource={"tableReference": { - "tableId": "customer_purchase" - }}, - ) - - upsert_table_customer_purchase_confidential = BigQueryUpsertTableOperator( - task_id="upsert_table_customer_purchase_confidential", - project_id=DWH_CONFIDENTIAL_PRJ, - dataset_id=DWH_CONFIDENTIAL_BQ_DATASET, - impersonation_chain=[TRF_SA_BQ], - table_resource={"tableReference": { - "tableId": "customer_purchase" - }}, - ) - - # Bigquery Tables schema defined here for demo porpuse. - # Consider a dedicated pipeline or tool for a real life scenario. - with TaskGroup('update_schema_table') as update_schema_table: - update_table_schema_customers = BigQueryUpdateTableSchemaOperator( - task_id="update_table_schema_customers", project_id=DWH_LAND_PRJ, - dataset_id=DWH_LAND_BQ_DATASET, table_id="customers", - impersonation_chain=[TRF_SA_BQ], include_policy_tags=True, - schema_fields_updates=[{ - "mode": "REQUIRED", - "name": "id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "name", - "type": "STRING", - "description": "Name", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "surname", - "type": "STRING", - "description": "Surname", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - }]) - - update_table_schema_purchases = BigQueryUpdateTableSchemaOperator( - task_id="update_table_schema_purchases", project_id=DWH_LAND_PRJ, - dataset_id=DWH_LAND_BQ_DATASET, table_id="purchases", - impersonation_chain=[TRF_SA_BQ], include_policy_tags=True, - schema_fields_updates=[{ - "mode": "REQUIRED", - "name": "id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "customer_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "item", - "type": "STRING", - "description": "Item Name" - }, { - "mode": "REQUIRED", - "name": "price", - "type": "FLOAT", - "description": "Item Price" - }, { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - }]) - - update_table_schema_customer_purchase_curated = BigQueryUpdateTableSchemaOperator( - task_id="update_table_schema_customer_purchase_curated", - project_id=DWH_CURATED_PRJ, dataset_id=DWH_CURATED_BQ_DATASET, - table_id="customer_purchase", impersonation_chain=[TRF_SA_BQ], - include_policy_tags=True, schema_fields_updates=[{ - "mode": "REQUIRED", - "name": "customer_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "purchase_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "name", - "type": "STRING", - "description": "Name", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "surname", - "type": "STRING", - "description": "Surname", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "item", - "type": "STRING", - "description": "Item Name" - }, { - "mode": "REQUIRED", - "name": "price", - "type": "FLOAT", - "description": "Item Price" - }, { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - }]) - - update_table_schema_customer_purchase_confidential = BigQueryUpdateTableSchemaOperator( - task_id="update_table_schema_customer_purchase_confidential", - project_id=DWH_CONFIDENTIAL_PRJ, dataset_id=DWH_CONFIDENTIAL_BQ_DATASET, - table_id="customer_purchase", impersonation_chain=[TRF_SA_BQ], - include_policy_tags=True, schema_fields_updates=[{ - "mode": "REQUIRED", - "name": "customer_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "purchase_id", - "type": "INTEGER", - "description": "ID" - }, { - "mode": "REQUIRED", - "name": "name", - "type": "STRING", - "description": "Name", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "surname", - "type": "STRING", - "description": "Surname", - "policyTags": { - "names": [DATA_CAT_TAGS.get('2_Private', None)] - } - }, { - "mode": "REQUIRED", - "name": "item", - "type": "STRING", - "description": "Item Name" - }, { - "mode": "REQUIRED", - "name": "price", - "type": "FLOAT", - "description": "Item Price" - }, { - "mode": "REQUIRED", - "name": "timestamp", - "type": "TIMESTAMP", - "description": "Timestamp" - }]) - - customers_import = DataflowStartFlexTemplateOperator( - task_id='dataflow_customers_import', project_id=LOD_PRJ, - location=DF_REGION, body={ - 'launchParameter': { - 'jobName': f'dataflow-customers-import-{round(time.time())}', - 'containerSpecGcsPath': f'{ORC_GCS_TMP_DF}/csv2bq.json', - 'environment': { - 'serviceAccountEmail': LOD_SA_DF, - 'workerZone': DF_ZONE, - 'stagingLocation': f'{LOD_GCS_STAGING}/staging', - 'tempLocation': f'{LOD_GCS_STAGING}/tmp', - 'subnetwork': LOD_NET_SUBNET, - 'kmsKeyName': DF_KMS_KEY, - 'ipConfiguration': 'WORKER_IP_PRIVATE' - }, - 'parameters': { - 'csv_file': - f'{DRP_GCS}/customers.csv', - 'json_schema': - f'{ORC_GCS}/customers_schema.json', - 'output_table': - f'{DWH_LAND_PRJ}:{DWH_LAND_BQ_DATASET}.customers', - } - } - }) - - purchases_import = DataflowStartFlexTemplateOperator( - task_id='dataflow_purchases_import', project_id=LOD_PRJ, - location=DF_REGION, body={ - 'launchParameter': { - 'jobName': f'dataflow-purchases-import-{round(time.time())}', - 'containerSpecGcsPath': f'{ORC_GCS_TMP_DF}/csv2bq.json', - 'environment': { - 'serviceAccountEmail': LOD_SA_DF, - 'workerZone': DF_ZONE, - 'stagingLocation': f'{LOD_GCS_STAGING}/staging', - 'tempLocation': f'{LOD_GCS_STAGING}/tmp', - 'subnetwork': LOD_NET_SUBNET, - 'kmsKeyName': DF_KMS_KEY, - 'ipConfiguration': 'WORKER_IP_PRIVATE' - }, - 'parameters': { - 'csv_file': - f'{DRP_GCS}/purchases.csv', - 'json_schema': - f'{ORC_GCS}/purchases_schema.json', - 'output_table': - f'{DWH_LAND_PRJ}:{DWH_LAND_BQ_DATASET}.purchases', - } - } - }) - - join_customer_purchase = BigQueryInsertJobOperator( - task_id='bq_join_customer_purchase', gcp_conn_id='bigquery_default', - project_id=TRF_PRJ, location=BQ_LOCATION, configuration={ - 'jobType': 'QUERY', - 'query': { - 'query': - """SELECT - c.id as customer_id, - p.id as purchase_id, - c.name as name, - c.surname as surname, - p.item as item, - p.price as price, - p.timestamp as timestamp - FROM `{dwh_0_prj}.{dwh_0_dataset}.customers` c - JOIN `{dwh_0_prj}.{dwh_0_dataset}.purchases` p ON c.id = p.customer_id - """.format( - dwh_0_prj=DWH_LAND_PRJ, - dwh_0_dataset=DWH_LAND_BQ_DATASET, - ), - 'destinationTable': { - 'projectId': DWH_CURATED_PRJ, - 'datasetId': DWH_CURATED_BQ_DATASET, - 'tableId': 'customer_purchase' - }, - 'writeDisposition': - 'WRITE_APPEND', - "useLegacySql": - False - } - }, impersonation_chain=[TRF_SA_BQ]) - - confidential_customer_purchase = BigQueryInsertJobOperator( - task_id='bq_confidential_customer_purchase', - gcp_conn_id='bigquery_default', project_id=TRF_PRJ, location=BQ_LOCATION, - configuration={ - 'jobType': 'QUERY', - 'query': { - 'query': - """SELECT - customer_id, - purchase_id, - name, - surname, - item, - price, - timestamp - FROM `{dwh_cur_prj}.{dwh_cur_dataset}.customer_purchase` - """.format( - dwh_cur_prj=DWH_CURATED_PRJ, - dwh_cur_dataset=DWH_CURATED_BQ_DATASET, - ), - 'destinationTable': { - 'projectId': DWH_CONFIDENTIAL_PRJ, - 'datasetId': DWH_CONFIDENTIAL_BQ_DATASET, - 'tableId': 'customer_purchase' - }, - 'writeDisposition': - 'WRITE_APPEND', - "useLegacySql": - False - } - }, impersonation_chain=[TRF_SA_BQ]) - -start >> upsert_table >> update_schema_table >> [ - customers_import, purchases_import -] >> join_customer_purchase >> confidential_customer_purchase >> end diff --git a/blueprints/data-solutions/data-platform-foundations/demo/datapipeline_flex.py b/blueprints/data-solutions/data-platform-foundations/demo/datapipeline_flex.py deleted file mode 100644 index e00af82ac..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/datapipeline_flex.py +++ /dev/null @@ -1,209 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -------------------------------------------------------------------------------- -# Load The Dependencies -# -------------------------------------------------------------------------------- - -import datetime -import time - -from airflow import models -from airflow.models.variable import Variable -from airflow.providers.google.cloud.operators.dataflow import \ - DataflowStartFlexTemplateOperator -from airflow.operators import empty -from airflow.providers.google.cloud.operators.bigquery import \ - BigQueryInsertJobOperator - -# -------------------------------------------------------------------------------- -# Set variables - Needed for the DEMO -# -------------------------------------------------------------------------------- -BQ_LOCATION = Variable.get("BQ_LOCATION") -DATA_CAT_TAGS = Variable.get("DATA_CAT_TAGS", deserialize_json=True) -DWH_LAND_PRJ = Variable.get("DWH_LAND_PRJ") -DWH_LAND_BQ_DATASET = Variable.get("DWH_LAND_BQ_DATASET") -DWH_LAND_GCS = Variable.get("DWH_LAND_GCS") -DWH_CURATED_PRJ = Variable.get("DWH_CURATED_PRJ") -DWH_CURATED_BQ_DATASET = Variable.get("DWH_CURATED_BQ_DATASET") -DWH_CURATED_GCS = Variable.get("DWH_CURATED_GCS") -DWH_CONFIDENTIAL_PRJ = Variable.get("DWH_CONFIDENTIAL_PRJ") -DWH_CONFIDENTIAL_BQ_DATASET = Variable.get("DWH_CONFIDENTIAL_BQ_DATASET") -DWH_CONFIDENTIAL_GCS = Variable.get("DWH_CONFIDENTIAL_GCS") -GCP_REGION = Variable.get("GCP_REGION") -DRP_PRJ = Variable.get("DRP_PRJ") -DRP_BQ = Variable.get("DRP_BQ") -DRP_GCS = Variable.get("DRP_GCS") -DRP_PS = Variable.get("DRP_PS") -LOD_PRJ = Variable.get("LOD_PRJ") -LOD_GCS_STAGING = Variable.get("LOD_GCS_STAGING") -LOD_NET_VPC = Variable.get("LOD_NET_VPC") -LOD_NET_SUBNET = Variable.get("LOD_NET_SUBNET") -LOD_SA_DF = Variable.get("LOD_SA_DF") -ORC_PRJ = Variable.get("ORC_PRJ") -ORC_GCS = Variable.get("ORC_GCS") -ORC_GCS_TMP_DF = Variable.get("ORC_GCS_TMP_DF") -TRF_PRJ = Variable.get("TRF_PRJ") -TRF_GCS_STAGING = Variable.get("TRF_GCS_STAGING") -TRF_NET_VPC = Variable.get("TRF_NET_VPC") -TRF_NET_SUBNET = Variable.get("TRF_NET_SUBNET") -TRF_SA_DF = Variable.get("TRF_SA_DF") -TRF_SA_BQ = Variable.get("TRF_SA_BQ") -DF_KMS_KEY = Variable.get("DF_KMS_KEY", "") -DF_REGION = Variable.get("GCP_REGION") -DF_ZONE = Variable.get("GCP_REGION") + "-b" - -# -------------------------------------------------------------------------------- -# Set default arguments -# -------------------------------------------------------------------------------- - -# If you are running Airflow in more than one time zone -# see https://airflow.apache.org/docs/apache-airflow/stable/timezone.html -# for best practices -yesterday = datetime.datetime.now() - datetime.timedelta(days=1) - -default_args = { - 'owner': 'airflow', - 'start_date': yesterday, - 'depends_on_past': False, - 'email': [''], - 'email_on_failure': False, - 'email_on_retry': False, - 'retries': 1, - 'retry_delay': datetime.timedelta(minutes=5), -} - -dataflow_environment = { - 'serviceAccountEmail': LOD_SA_DF, - 'workerZone': DF_ZONE, - 'stagingLocation': f'{LOD_GCS_STAGING}/staging', - 'tempLocation': f'{LOD_GCS_STAGING}/tmp', - 'subnetwork': LOD_NET_SUBNET, - 'kmsKeyName': DF_KMS_KEY, - 'ipConfiguration': 'WORKER_IP_PRIVATE' -} - -# -------------------------------------------------------------------------------- -# Main DAG -# -------------------------------------------------------------------------------- - -with models.DAG('data_pipeline_dag_flex', default_args=default_args, - schedule_interval=None) as dag: - start = empty.EmptyOperator(task_id='start', trigger_rule='all_success') - - end = empty.EmptyOperator(task_id='end', trigger_rule='all_success') - - # Bigquery Tables automatically created for demo purposes. - # Consider a dedicated pipeline or tool for a real life scenario. - customers_import = DataflowStartFlexTemplateOperator( - task_id='dataflow_customers_import', project_id=LOD_PRJ, - location=DF_REGION, body={ - 'launchParameter': { - 'jobName': f'dataflow-customers-import-{round(time.time())}', - 'containerSpecGcsPath': f'{ORC_GCS_TMP_DF}/csv2bq.json', - 'environment': dataflow_environment, - 'parameters': { - 'csv_file': - f'{DRP_GCS}/customers.csv', - 'json_schema': - f'{ORC_GCS}/customers_schema.json', - 'output_table': - f'{DWH_LAND_PRJ}:{DWH_LAND_BQ_DATASET}.customers', - } - } - }) - - purchases_import = DataflowStartFlexTemplateOperator( - task_id='dataflow_purchases_import', project_id=LOD_PRJ, - location=DF_REGION, body={ - 'launchParameter': { - 'jobName': f'dataflow-purchases-import-{round(time.time())}', - 'containerSpecGcsPath': f'{ORC_GCS_TMP_DF}/csv2bq.json', - 'environment': dataflow_environment, - 'parameters': { - 'csv_file': - f'{DRP_GCS}/purchases.csv', - 'json_schema': - f'{ORC_GCS}/purchases_schema.json', - 'output_table': - f'{DWH_LAND_PRJ}:{DWH_LAND_BQ_DATASET}.purchases', - } - } - }) - - join_customer_purchase = BigQueryInsertJobOperator( - task_id='bq_join_customer_purchase', gcp_conn_id='bigquery_default', - project_id=TRF_PRJ, location=BQ_LOCATION, configuration={ - 'jobType': 'QUERY', - 'query': { - 'query': - """SELECT - c.id as customer_id, - p.id as purchase_id, - p.item as item, - p.price as price, - p.timestamp as timestamp - FROM `{dwh_0_prj}.{dwh_0_dataset}.customers` c - JOIN `{dwh_0_prj}.{dwh_0_dataset}.purchases` p ON c.id = p.customer_id - """.format( - dwh_0_prj=DWH_LAND_PRJ, - dwh_0_dataset=DWH_LAND_BQ_DATASET, - ), - 'destinationTable': { - 'projectId': DWH_CURATED_PRJ, - 'datasetId': DWH_CURATED_BQ_DATASET, - 'tableId': 'customer_purchase' - }, - 'writeDisposition': - 'WRITE_TRUNCATE', - "useLegacySql": - False - } - }, impersonation_chain=[TRF_SA_BQ]) - - confidential_customer_purchase = BigQueryInsertJobOperator( - task_id='bq_confidential_customer_purchase', - gcp_conn_id='bigquery_default', project_id=TRF_PRJ, location=BQ_LOCATION, - configuration={ - 'jobType': 'QUERY', - 'query': { - 'query': - """SELECT - c.id as customer_id, - p.id as purchase_id, - c.name as name, - c.surname as surname, - p.item as item, - p.price as price, - p.timestamp as timestamp - FROM `{dwh_0_prj}.{dwh_0_dataset}.customers` c - JOIN `{dwh_0_prj}.{dwh_0_dataset}.purchases` p ON c.id = p.customer_id - """.format( - dwh_0_prj=DWH_LAND_PRJ, - dwh_0_dataset=DWH_LAND_BQ_DATASET, - ), - 'destinationTable': { - 'projectId': DWH_CONFIDENTIAL_PRJ, - 'datasetId': DWH_CONFIDENTIAL_BQ_DATASET, - 'tableId': 'customer_purchase' - }, - 'writeDisposition': - 'WRITE_TRUNCATE', - "useLegacySql": - False - } - }, impersonation_chain=[TRF_SA_BQ]) - - start >> [customers_import, purchases_import - ] >> join_customer_purchase >> confidential_customer_purchase >> end diff --git a/blueprints/data-solutions/data-platform-foundations/demo/delete_table.py b/blueprints/data-solutions/data-platform-foundations/demo/delete_table.py deleted file mode 100644 index cc841e38e..000000000 --- a/blueprints/data-solutions/data-platform-foundations/demo/delete_table.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -------------------------------------------------------------------------------- -# Load The Dependencies -# -------------------------------------------------------------------------------- - -import csv -import datetime -import io -import json -import logging -import os - -from airflow import models -from airflow.models.variable import Variable -from airflow.operators import empty -from airflow.providers.google.cloud.operators.bigquery import \ - BigQueryDeleteTableOperator -from airflow.utils.task_group import TaskGroup - -# -------------------------------------------------------------------------------- -# Set variables - Needed for the DEMO -# -------------------------------------------------------------------------------- -BQ_LOCATION = Variable.get("BQ_LOCATION") -DATA_CAT_TAGS = Variable.get("DATA_CAT_TAGS", deserialize_json=True) -DWH_LAND_PRJ = Variable.get("DWH_LAND_PRJ") -DWH_LAND_BQ_DATASET = Variable.get("DWH_LAND_BQ_DATASET") -DWH_LAND_GCS = Variable.get("DWH_LAND_GCS") -DWH_CURATED_PRJ = Variable.get("DWH_CURATED_PRJ") -DWH_CURATED_BQ_DATASET = Variable.get("DWH_CURATED_BQ_DATASET") -DWH_CURATED_GCS = Variable.get("DWH_CURATED_GCS") -DWH_CONFIDENTIAL_PRJ = Variable.get("DWH_CONFIDENTIAL_PRJ") -DWH_CONFIDENTIAL_BQ_DATASET = Variable.get("DWH_CONFIDENTIAL_BQ_DATASET") -DWH_CONFIDENTIAL_GCS = Variable.get("DWH_CONFIDENTIAL_GCS") -GCP_REGION = Variable.get("GCP_REGION") -DRP_PRJ = Variable.get("DRP_PRJ") -DRP_BQ = Variable.get("DRP_BQ") -DRP_GCS = Variable.get("DRP_GCS") -DRP_PS = Variable.get("DRP_PS") -LOD_PRJ = Variable.get("LOD_PRJ") -LOD_GCS_STAGING = Variable.get("LOD_GCS_STAGING") -LOD_NET_VPC = Variable.get("LOD_NET_VPC") -LOD_NET_SUBNET = Variable.get("LOD_NET_SUBNET") -LOD_SA_DF = Variable.get("LOD_SA_DF") -ORC_PRJ = Variable.get("ORC_PRJ") -ORC_GCS = Variable.get("ORC_GCS") -TRF_PRJ = Variable.get("TRF_PRJ") -TRF_GCS_STAGING = Variable.get("TRF_GCS_STAGING") -TRF_NET_VPC = Variable.get("TRF_NET_VPC") -TRF_NET_SUBNET = Variable.get("TRF_NET_SUBNET") -TRF_SA_DF = Variable.get("TRF_SA_DF") -TRF_SA_BQ = Variable.get("TRF_SA_BQ") -DF_KMS_KEY = Variable.get("DF_KMS_KEY", "") -DF_REGION = Variable.get("GCP_REGION") -DF_ZONE = Variable.get("GCP_REGION") + "-b" - -# -------------------------------------------------------------------------------- -# Set default arguments -# -------------------------------------------------------------------------------- - -# If you are running Airflow in more than one time zone -# see https://airflow.apache.org/docs/apache-airflow/stable/timezone.html -# for best practices -yesterday = datetime.datetime.now() - datetime.timedelta(days=1) - -default_args = { - 'owner': 'airflow', - 'start_date': yesterday, - 'depends_on_past': False, - 'email': [''], - 'email_on_failure': False, - 'email_on_retry': False, - 'retries': 1, - 'retry_delay': datetime.timedelta(minutes=5), - 'dataflow_default_options': { - 'location': DF_REGION, - 'zone': DF_ZONE, - 'stagingLocation': LOD_GCS_STAGING, - 'tempLocation': LOD_GCS_STAGING + "/tmp", - 'serviceAccountEmail': LOD_SA_DF, - 'subnetwork': LOD_NET_SUBNET, - 'ipConfiguration': "WORKER_IP_PRIVATE", - 'kmsKeyName': DF_KMS_KEY - }, -} - -# -------------------------------------------------------------------------------- -# Main DAG -# -------------------------------------------------------------------------------- - -with models.DAG('delete_tables_dag', default_args=default_args, - schedule_interval=None) as dag: - start = empty.EmptyOperator(task_id='start', trigger_rule='all_success') - - end = empty.EmptyOperator(task_id='end', trigger_rule='all_success') - - # Bigquery Tables deleted here for demo porpuse. - # Consider a dedicated pipeline or tool for a real life scenario. - with TaskGroup('delete_table') as delete_table: - delete_table_customers = BigQueryDeleteTableOperator( - task_id="delete_table_customers", deletion_dataset_table=DWH_LAND_PRJ + - "." + DWH_LAND_BQ_DATASET + ".customers", - impersonation_chain=[LOD_SA_DF]) - - delete_table_purchases = BigQueryDeleteTableOperator( - task_id="delete_table_purchases", deletion_dataset_table=DWH_LAND_PRJ + - "." + DWH_LAND_BQ_DATASET + ".purchases", - impersonation_chain=[LOD_SA_DF]) - - delete_table_customer_purchase_curated = BigQueryDeleteTableOperator( - task_id="delete_table_customer_purchase_curated", - deletion_dataset_table=DWH_CURATED_PRJ + "." + DWH_CURATED_BQ_DATASET + - ".customer_purchase", impersonation_chain=[TRF_SA_DF]) - - delete_table_customer_purchase_confidential = BigQueryDeleteTableOperator( - task_id="delete_table_customer_purchase_confidential", - deletion_dataset_table=DWH_CONFIDENTIAL_PRJ + "." + - DWH_CONFIDENTIAL_BQ_DATASET + ".customer_purchase", - impersonation_chain=[TRF_SA_DF]) - - start >> delete_table >> end diff --git a/blueprints/data-solutions/data-platform-foundations/images/df_demo_pipeline.png b/blueprints/data-solutions/data-platform-foundations/images/df_demo_pipeline.png deleted file mode 100644 index 541532b41d18c74fe6ef6724858be07ed5667b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58976 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

}lX$$UfO8lX4}z{O;dL30t&5@_5~ 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 diff --git a/blueprints/data-solutions/data-platform-foundations/images/dlp_diagram.png b/blueprints/data-solutions/data-platform-foundations/images/dlp_diagram.png deleted file mode 100644 index 65467b2bed4fa2e4b73cbd95363a0228eadb52b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28056 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 M27iL^`j2D(1rQ;eQ~&?~ diff --git a/blueprints/data-solutions/data-platform-foundations/images/overview_diagram.png b/blueprints/data-solutions/data-platform-foundations/images/overview_diagram.png deleted file mode 100644 index 073ec870cca67453fdbcb1e939b1bc2573eed8ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147940 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 diff --git a/blueprints/data-solutions/data-platform-foundations/locals-01-dropoff.tf b/blueprints/data-solutions/data-platform-foundations/locals-01-dropoff.tf deleted file mode 100644 index 02b533d5f..000000000 --- a/blueprints/data-solutions/data-platform-foundations/locals-01-dropoff.tf +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright 2023 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -locals { - _drp_iam = flatten([ - for principal, roles in local.drp_iam : [ - for role in roles : { - key = "${principal}-${role}" - principal = principal - role = role - } - ] - ]) - drp_iam_additive = { - for binding in local._drp_iam : binding.key => { - role = binding.role - member = local.iam_principals[binding.principal] - } - } - drp_iam_auth = { - for binding in local._drp_iam : - binding.role => local.iam_principals[binding.principal]... - } -} diff --git a/blueprints/data-solutions/data-platform-foundations/locals-02-load.tf b/blueprints/data-solutions/data-platform-foundations/locals-02-load.tf deleted file mode 100644 index 743883393..000000000 --- a/blueprints/data-solutions/data-platform-foundations/locals-02-load.tf +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright 2023 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -locals { - _load_iam = flatten([ - for principal, roles in local.load_iam : [ - for role in roles : { - key = "${principal}-${role}" - principal = principal - role = role - } - ] - ]) - load_iam_additive = { - for binding in local._load_iam : binding.key => { - role = binding.role - member = local.iam_principals[binding.principal] - } - } - load_iam_auth = { - for binding in local._load_iam : - binding.role => local.iam_principals[binding.principal]... - } - load_subnet = ( - local.use_shared_vpc - ? var.network_config.subnet_self_links.orchestration - : values(module.load-vpc[0].subnet_self_links)[0] - ) - load_vpc = ( - local.use_shared_vpc - ? var.network_config.network_self_link - : module.load-vpc[0].self_link - ) -} diff --git a/blueprints/data-solutions/data-platform-foundations/locals-03-orchestration.tf b/blueprints/data-solutions/data-platform-foundations/locals-03-orchestration.tf deleted file mode 100644 index 11777c821..000000000 --- a/blueprints/data-solutions/data-platform-foundations/locals-03-orchestration.tf +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2023 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -locals { - _orch_iam = flatten([ - for principal, roles in local.orch_iam : [ - for role in roles : { - key = "${principal}-${role}" - principal = principal - role = role - } - ] - ]) - orch_iam_additive = { - for binding in local._orch_iam : binding.key => { - role = binding.role - member = local.iam_principals[binding.principal] - } - } - orch_iam_auth = { - for binding in local._orch_iam : - binding.role => local.iam_principals[binding.principal]... - } - orch_subnet = ( - local.use_shared_vpc - ? var.network_config.subnet_self_links.orchestration - : values(module.orch-vpc[0].subnet_self_links)[0] - ) - orch_vpc = ( - local.use_shared_vpc - ? var.network_config.network_self_link - : module.orch-vpc[0].self_link - ) - # TODO: use new artifact registry module output - orch_docker_path = format("%s-docker.pkg.dev/%s/%s", - var.region, module.orch-project.project_id, module.orch-artifact-reg.name) -} diff --git a/blueprints/data-solutions/data-platform-foundations/locals-04-transformation.tf b/blueprints/data-solutions/data-platform-foundations/locals-04-transformation.tf deleted file mode 100644 index e6c92d8ef..000000000 --- a/blueprints/data-solutions/data-platform-foundations/locals-04-transformation.tf +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright 2023 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -locals { - _trf_iam = flatten([ - for principal, roles in local.trf_iam : [ - for role in roles : { - key = "${principal}-${role}" - principal = principal - role = role - } - ] - ]) - trf_iam_additive = { - for binding in local._trf_iam : binding.key => { - role = binding.role - member = local.iam_principals[binding.principal] - } - } - trf_iam_auth = { - for binding in local._trf_iam : - binding.role => local.iam_principals[binding.principal]... - } - transf_subnet = ( - local.use_shared_vpc - ? var.network_config.subnet_self_links.orchestration - : values(module.transf-vpc[0].subnet_self_links)[0] - ) - transf_vpc = ( - local.use_shared_vpc - ? var.network_config.network_self_link - : module.transf-vpc[0].self_link - ) -} diff --git a/blueprints/data-solutions/data-platform-foundations/locals-05-datawarehouse.tf b/blueprints/data-solutions/data-platform-foundations/locals-05-datawarehouse.tf deleted file mode 100644 index 47c91b1ac..000000000 --- a/blueprints/data-solutions/data-platform-foundations/locals-05-datawarehouse.tf +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright 2023 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -locals { - _dwh_iam = flatten([ - for principal, roles in local.dwh_iam : [ - for role in roles : { - key = "${principal}-${role}" - principal = principal - role = role - } - ] - ]) - _lnd_iam = flatten([ - for principal, roles in local.lnd_iam : [ - for role in roles : { - key = "${principal}-${role}" - principal = principal - role = role - } - ] - ]) - dwh_iam_additive = { - for binding in local._dwh_iam : binding.key => { - role = binding.role - member = local.iam_principals[binding.principal] - } - } - dwh_iam_auth = { - for binding in local._dwh_iam : - binding.role => local.iam_principals[binding.principal]... - } - dwh_services = concat(var.project_services, [ - "bigquery.googleapis.com", - "bigqueryreservation.googleapis.com", - "bigquerystorage.googleapis.com", - "cloudkms.googleapis.com", - "compute.googleapis.com", - "dataflow.googleapis.com", - "datalineage.googleapis.com", - "pubsub.googleapis.com", - "servicenetworking.googleapis.com", - "storage.googleapis.com", - "storage-component.googleapis.com" - ]) - lnd_iam_additive = { - for binding in local._lnd_iam : binding.key => { - role = binding.role - member = local.iam_principals[binding.principal] - } - } - lnd_iam_auth = { - for binding in local._lnd_iam : - binding.role => local.iam_principals[binding.principal]... - } -} diff --git a/blueprints/data-solutions/data-platform-foundations/main.tf b/blueprints/data-solutions/data-platform-foundations/main.tf deleted file mode 100644 index d3004ee4b..000000000 --- a/blueprints/data-solutions/data-platform-foundations/main.tf +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description Core locals. - -locals { - # we cannot reference service accounts directly as they are dynamic - _shared_vpc_bindings = { - "roles/compute.networkUser" = [ - "load-robot-df", "load-sa-df-worker", - "orch-cloudservices", "orch-robot-df", "orch-robot-gke", - "transf-robot-df", "transf-sa-df-worker", - ] - "roles/composer.sharedVpcAgent" = [ - "orch-robot-cs" - ] - "roles/container.hostServiceAgentUser" = [ - "orch-robot-df", "orch-robot-gke" - ] - } - groups = { - for k, v in var.groups : k => "${v}@${var.organization_domain}" - } - groups_iam = { - for k, v in local.groups : k => "group:${v}" - } - iam_principals = { - data_analysts = "group:${local.groups.data-analysts}" - data_engineers = "group:${local.groups.data-engineers}" - data_security = "group:${local.groups.data-security}" - robots_cloudbuild = module.orch-project.service_agents.cloudbuild.iam_email - robots_composer = module.orch-project.service_agents.composer.iam_email - robots_dataflow_load = module.load-project.service_agents.dataflow.iam_email - robots_dataflow_trf = module.transf-project.service_agents.dataflow.iam_email - sa_df_build = module.orch-sa-df-build.iam_email - sa_drop_bq = module.drop-sa-bq-0.iam_email - sa_drop_cs = module.drop-sa-cs-0.iam_email - sa_drop_ps = module.drop-sa-ps-0.iam_email - sa_load = module.load-sa-df-0.iam_email - sa_orch = module.orch-sa-cmp-0.iam_email - sa_transf_bq = module.transf-sa-bq-0.iam_email, - sa_transf_df = module.transf-sa-df-0.iam_email, - } - project_suffix = var.project_suffix == null ? "" : "-${var.project_suffix}" - shared_vpc_project = try(var.network_config.host_project, null) - # this is needed so that for_each only uses static values - shared_vpc_role_members = { - load-robot-df = module.load-project.service_agents.dataflow.iam_email - load-sa-df-worker = module.load-sa-df-0.iam_email - orch-cloudservices = module.orch-project.service_agents.cloudservices.iam_email - orch-robot-cs = module.orch-project.service_agents.composer.iam_email - orch-robot-df = module.orch-project.service_agents.dataflow.iam_email - orch-robot-gke = module.orch-project.service_agents.container-engine.iam_email - transf-robot-df = module.transf-project.service_agents.dataflow.iam_email - transf-sa-df-worker = module.transf-sa-df-0.iam_email - } - # reassemble in a format suitable for for_each - shared_vpc_bindings_map = { - for binding in flatten([ - for role, members in local._shared_vpc_bindings : [ - for member in members : { role = role, member = member } - ] - ]) : "${binding.role}-${binding.member}" => binding - } - use_projects = !var.project_config.project_create - use_shared_vpc = var.network_config != null -} - -resource "google_project_iam_member" "shared_vpc" { - for_each = local.use_shared_vpc ? local.shared_vpc_bindings_map : {} - project = var.network_config.host_project - role = each.value.role - member = lookup(local.shared_vpc_role_members, each.value.member) -} diff --git a/blueprints/data-solutions/data-platform-foundations/outputs.tf b/blueprints/data-solutions/data-platform-foundations/outputs.tf deleted file mode 100644 index ad0f9c4cd..000000000 --- a/blueprints/data-solutions/data-platform-foundations/outputs.tf +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# tfdoc:file:description Output variables. -output "bigquery-datasets" { - description = "BigQuery datasets." - value = { - drop-bq-0 = module.drop-bq-0.dataset_id, - dwh-landing-bq-0 = module.dwh-lnd-bq-0.dataset_id, - dwh-curated-bq-0 = module.dwh-cur-bq-0.dataset_id, - dwh-confidential-bq-0 = module.dwh-conf-bq-0.dataset_id, - } -} - -output "demo_commands" { - description = "Demo commands. Relevant only if Composer is deployed." - value = { - 01 = "gsutil -i ${module.drop-sa-cs-0.email} cp demo/data/*.csv gs://${module.drop-cs-0.name}" - 02 = try("gsutil -i ${module.orch-sa-cmp-0.email} cp demo/data/*.j* gs://${module.orch-cs-0.name}", "Composer not deployed.") - 03 = try("gsutil -i ${module.orch-sa-cmp-0.email} cp demo/*.py ${google_composer_environment.orch-cmp-0[0].config[0].dag_gcs_prefix}/", "Composer not deployed") - 04 = < diff --git a/fast/stages/1-resman/data/stage-2/networking.yaml b/fast/stages/1-resman/data/stage-2/networking.yaml index 24b472de1..08c9216ea 100644 --- a/fast/stages/1-resman/data/stage-2/networking.yaml +++ b/fast/stages/1-resman/data/stage-2/networking.yaml @@ -50,8 +50,53 @@ folder_config: 'roles/compute.networkUser', 'roles/composer.sharedVpcAgent', 'roles/container.hostServiceAgentUser', 'roles/vpcaccess.user' ]) - # iam_bindings_additive for stage 3 are added here when needed - # refer to each stage 3 documentation for snippets and examples + # example conditional grants for stage 3s + iam_bindings_additive: {} + # Data Platform (dev) + # dp_dev_net_admin: + # role: service_project_network_admin + # member: data-platform-dev-rw + # condition: + # title: Data platform dev service project admin. + # expression: | + # resource.matchTag('${organization.id}/${tag_names.environment}', 'development') + # dp_dev_net_viewer: + # role: roles/compute.networkViewer + # member: data-platform-dev-ro + # condition: + # title: Data platform dev network viewer. + # expression: | + # resource.matchTag('${organization.id}/${tag_names.environment}', 'development') + # GCVE (dev) + # gcve_dev_net_admin: + # role: gcve_network_admin + # member: gcve-dev-rw + # condition: + # title: GCVE dev network admin. + # expression: | + # resource.matchTag('${organization.id}/${tag_names.environment}', 'development') + # gcve_dev_net_viewer: + # role: gcve_network_viewer + # member: gcve-dev-ro + # condition: + # title: GCVE dev network viewer. + # expression: | + # resource.matchTag('${organization.id}/${tag_names.environment}', 'development') + # GKE (dev) + # gke_dns_admin: + # role: roles/dns.admin + # member: gke-dev-ro + # condition: + # title: GKE dev DNS admin. + # expression: | + # resource.matchTag('${organization.id}/${tag_names.environment}', 'development') + # gke_dns_reader: + # role: roles/dns.reader + # member: gke-dev-ro + # condition: + # title: GKE dev DNS reader. + # expression: | + # resource.matchTag('${organization.id}/${tag_names.environment}', 'development') organization_config: iam_bindings_additive: sa_net_rw_fw_policy_admin: @@ -69,5 +114,15 @@ organization_config: sa_net_ro_ngfw_enterprise_viewer: member: ro role: ngfw_enterprise_viewer -# stage_3_config for IAM delegation are added here when needed -# refer to each stage 3 documentation for snippets and examples +# example configuration for stage 3s needing environment-level conditional grants +# stage3_config: +# iam_admin_delegated: +# - environment: dev +# principal: gcve-dev-rw +# - environment: dev +# principal: data-platform-dev-rw +# iam_viewer: +# - environment: dev +# principal: gcve-dev-ro +# - environment: dev +# principal: data-platform-dev-ro diff --git a/fast/stages/1-resman/data/stage-2/security.yaml b/fast/stages/1-resman/data/stage-2/security.yaml index b0c42fc2c..1c7531989 100644 --- a/fast/stages/1-resman/data/stage-2/security.yaml +++ b/fast/stages/1-resman/data/stage-2/security.yaml @@ -35,7 +35,6 @@ folder_config: - project_iam_viewer gcp-security-admins: - roles/editor - # project factory delegated IAM grant iam_bindings: project_factory: @@ -53,3 +52,13 @@ organization_config: sa_sec_cloudasset: member: rw role: roles/cloudasset.viewer +# example configuration for stage 3s needing environment-level conditional grants +# stage3_config: + # iam_admin_delegated: + # - environment: dev + # principal: data-platform-dev-rw + # iam_viewer: + # - environment: dev + # principal: data-platform-dev-ro + # - environment: dev + # principal: data-platform-dev-rw diff --git a/fast/stages/1-resman/data/stage-3/data-platform-dev.yaml b/fast/stages/1-resman/data/stage-3/data-platform-dev.yaml new file mode 100644 index 000000000..246f381ee --- /dev/null +++ b/fast/stages/1-resman/data/stage-3/data-platform-dev.yaml @@ -0,0 +1,21 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# yaml-language-server: $schema=../../schemas/fast-stage3.schema.json + +short_name: dp +environment: dev +folder_config: + name: Development + parent_id: data-platform diff --git a/fast/stages/1-resman/data/top-level-folders/data-platform.yaml b/fast/stages/1-resman/data/top-level-folders/data-platform.yaml new file mode 100644 index 000000000..850273d3e --- /dev/null +++ b/fast/stages/1-resman/data/top-level-folders/data-platform.yaml @@ -0,0 +1,17 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# yaml-language-server: $schema=../../schemas/top-level-folder.schema.json + +name: Data Platform diff --git a/fast/stages/1-resman/outputs.tf b/fast/stages/1-resman/outputs.tf index ca55dc9be..27f3abdd7 100644 --- a/fast/stages/1-resman/outputs.tf +++ b/fast/stages/1-resman/outputs.tf @@ -91,6 +91,11 @@ output "service_accounts" { value = local.service_accounts } +output "tag_values" { + description = "Tag values." + value = local.tfvars.tag_values +} + # ready to use variable values for subsequent stages output "tfvars" { description = "Terraform variable files for the following stages." diff --git a/fast/stages/2-networking-a-simple/README.md b/fast/stages/2-networking-a-simple/README.md index 55a57fbd7..25e48401c 100644 --- a/fast/stages/2-networking-a-simple/README.md +++ b/fast/stages/2-networking-a-simple/README.md @@ -513,7 +513,7 @@ DNS configurations are centralised in the `dns-*.tf` files. Spokes delegate DNS | [regions](variables.tf#L106) | Region definitions. | object({…}) | | {…} | | | [security_profile_groups](variables-fast.tf#L86) | Security profile group ids used for policy rule substitutions. | map(string) | | {} | 2-networking-ngfw | | [spoke_configs](variables.tf#L118) | Spoke connectivity configurations. | object({…}) | | {…} | | -| [stage_config](variables-fast.tf#L94) | FAST stage configuration. | object({…}) | | {} | 1-resman | +| [stage_configs](variables-fast.tf#L94) | FAST stage configuration. | object({…}) | | {} | 1-resman | | [tag_values](variables-fast.tf#L108) | Root-level tag values. | map(string) | | {} | 1-resman | | [vpc_configs](variables.tf#L187) | Optional VPC network configurations. | object({…}) | | {} | | | [vpn_onprem_primary_config](variables.tf#L240) | VPN gateway configuration for onprem interconnection in the primary region. | object({…}) | | null | | diff --git a/fast/stages/2-networking-a-simple/main.tf b/fast/stages/2-networking-a-simple/main.tf index d3666731b..2e2d75e64 100644 --- a/fast/stages/2-networking-a-simple/main.tf +++ b/fast/stages/2-networking-a-simple/main.tf @@ -31,10 +31,10 @@ locals { "roles/vpcaccess.user", ])) iam_admin_delegated = try( - var.stage_config["networking"].iam_admin_delegated, {} + var.stage_configs["networking"].iam_admin_delegated, {} ) iam_viewer = try( - var.stage_config["networking"].iam_viewer, {} + var.stage_configs["networking"].iam_viewer, {} ) # combine all regions from variables and subnets regions = distinct(concat( diff --git a/fast/stages/2-networking-a-simple/variables-fast.tf b/fast/stages/2-networking-a-simple/variables-fast.tf index 56c29440b..aeb17e92e 100644 --- a/fast/stages/2-networking-a-simple/variables-fast.tf +++ b/fast/stages/2-networking-a-simple/variables-fast.tf @@ -91,7 +91,7 @@ variable "security_profile_groups" { default = {} } -variable "stage_config" { +variable "stage_configs" { # tfdoc:variable:source 1-resman description = "FAST stage configuration." type = object({ diff --git a/fast/stages/2-networking-b-nva/README.md b/fast/stages/2-networking-b-nva/README.md index b085e9249..d75bcfece 100644 --- a/fast/stages/2-networking-b-nva/README.md +++ b/fast/stages/2-networking-b-nva/README.md @@ -575,7 +575,7 @@ DNS configurations are centralised in the `dns-*.tf` files. Spokes delegate DNS | [psa_ranges](variables.tf#L114) | IP ranges used for Private Service Access (e.g. CloudSQL). Ranges is in name => range format. | object({…}) | | {} | | | [regions](variables.tf#L134) | Region definitions. | object({…}) | | {…} | | | [security_profile_groups](variables-fast.tf#L86) | Security profile group ids used for policy rule substitutions. | map(string) | | {} | 2-networking-ngfw | -| [stage_config](variables-fast.tf#L94) | FAST stage configuration. | object({…}) | | {} | 1-resman | +| [stage_configs](variables-fast.tf#L94) | FAST stage configuration. | object({…}) | | {} | 1-resman | | [tag_values](variables-fast.tf#L108) | Root-level tag values. | map(string) | | {} | 1-resman | | [vpc_configs](variables.tf#L146) | Optional VPC network configurations. | object({…}) | | {} | | | [vpn_onprem_primary_config](variables.tf#L229) | VPN gateway configuration for onprem interconnection in the primary region. | object({…}) | | null | | diff --git a/fast/stages/2-networking-b-nva/main.tf b/fast/stages/2-networking-b-nva/main.tf index 447bb3b1a..c500bbc1d 100644 --- a/fast/stages/2-networking-b-nva/main.tf +++ b/fast/stages/2-networking-b-nva/main.tf @@ -30,10 +30,10 @@ locals { "roles/vpcaccess.user", ])) iam_admin_delegated = try( - var.stage_config["networking"].iam_admin_delegated, {} + var.stage_configs["networking"].iam_admin_delegated, {} ) iam_viewer = try( - var.stage_config["networking"].iam_viewer, {} + var.stage_configs["networking"].iam_viewer, {} ) # select the NVA ILB as next hop for spoke VPC routing depending on net mode nva_load_balancers = (var.network_mode == "ncc_ra") ? null : { diff --git a/fast/stages/2-networking-b-nva/variables-fast.tf b/fast/stages/2-networking-b-nva/variables-fast.tf index 56c29440b..aeb17e92e 100644 --- a/fast/stages/2-networking-b-nva/variables-fast.tf +++ b/fast/stages/2-networking-b-nva/variables-fast.tf @@ -91,7 +91,7 @@ variable "security_profile_groups" { default = {} } -variable "stage_config" { +variable "stage_configs" { # tfdoc:variable:source 1-resman description = "FAST stage configuration." type = object({ diff --git a/fast/stages/2-networking-c-separate-envs/README.md b/fast/stages/2-networking-c-separate-envs/README.md index 2bd8365c4..b4450a51a 100644 --- a/fast/stages/2-networking-c-separate-envs/README.md +++ b/fast/stages/2-networking-c-separate-envs/README.md @@ -371,7 +371,7 @@ Regions are defined via the `regions` variable which sets up a mapping between t | [psa_ranges](variables.tf#L87) | IP ranges used for Private Service Access (e.g. CloudSQL). | object({…}) | | {} | | | [regions](variables.tf#L107) | Region definitions. | object({…}) | | {…} | | | [security_profile_groups](variables-fast.tf#L86) | Security profile group ids used for policy rule substitutions. | map(string) | | {} | 2-networking-ngfw | -| [stage_config](variables-fast.tf#L94) | FAST stage configuration. | object({…}) | | {} | 1-resman | +| [stage_configs](variables-fast.tf#L94) | FAST stage configuration. | object({…}) | | {} | 1-resman | | [tag_values](variables-fast.tf#L108) | Root-level tag values. | map(string) | | {} | 1-resman | | [vpc_configs](variables.tf#L117) | Optional VPC network configurations. | object({…}) | | {} | | | [vpn_onprem_dev_primary_config](variables.tf#L155) | VPN gateway configuration for onprem interconnection from dev in the primary region. | object({…}) | | null | | diff --git a/fast/stages/2-networking-c-separate-envs/main.tf b/fast/stages/2-networking-c-separate-envs/main.tf index 5422cfaa4..8861a798f 100644 --- a/fast/stages/2-networking-c-separate-envs/main.tf +++ b/fast/stages/2-networking-c-separate-envs/main.tf @@ -31,10 +31,10 @@ locals { "roles/vpcaccess.user", ])) iam_admin_delegated = try( - var.stage_config["networking"].iam_admin_delegated, {} + var.stage_configs["networking"].iam_admin_delegated, {} ) iam_viewer = try( - var.stage_config["networking"].iam_viewer, {} + var.stage_configs["networking"].iam_viewer, {} ) # combine all regions from variables and subnets regions = distinct(concat( diff --git a/fast/stages/2-networking-c-separate-envs/variables-fast.tf b/fast/stages/2-networking-c-separate-envs/variables-fast.tf index 56c29440b..aeb17e92e 100644 --- a/fast/stages/2-networking-c-separate-envs/variables-fast.tf +++ b/fast/stages/2-networking-c-separate-envs/variables-fast.tf @@ -91,7 +91,7 @@ variable "security_profile_groups" { default = {} } -variable "stage_config" { +variable "stage_configs" { # tfdoc:variable:source 1-resman description = "FAST stage configuration." type = object({ diff --git a/fast/stages/2-security/README.md b/fast/stages/2-security/README.md index d158cd162..b6b589356 100644 --- a/fast/stages/2-security/README.md +++ b/fast/stages/2-security/README.md @@ -285,16 +285,15 @@ tls_inspection = { |---|---|:---:|:---:|:---:|:---:| | [automation](variables-fast.tf#L17) | Automation resources created by the bootstrap stage. | object({…}) | ✓ | | 0-bootstrap | | [billing_account](variables-fast.tf#L25) | Billing account id. If billing account is not part of the same org set `is_org_level` to false. | object({…}) | ✓ | | 0-bootstrap | -| [environments](variables-fast.tf#L47) | Environment names. | map(object({…})) | ✓ | | 0-globals | -| [folder_ids](variables-fast.tf#L65) | Folder name => id mappings, the 'security' folder name must exist. | object({…}) | ✓ | | 1-resman | -| [prefix](variables-fast.tf#L75) | Prefix used for resources that need unique names. Use a maximum of 9 chars for organizations, and 11 chars for tenants. | string | ✓ | | 0-bootstrap | +| [environments](variables-fast.tf#L38) | Environment names. | map(object({…})) | ✓ | | 0-globals | +| [folder_ids](variables-fast.tf#L56) | Folder name => id mappings, the 'security' folder name must exist. | object({…}) | ✓ | | 1-resman | +| [prefix](variables-fast.tf#L66) | Prefix used for resources that need unique names. Use a maximum of 9 chars for organizations, and 11 chars for tenants. | string | ✓ | | 0-bootstrap | | [certificate_authorities](variables.tf#L17) | Certificate Authority Service pool and CAs. If environments is null identical pools and CAs are created in all environments. | map(object({…})) | | {} | | -| [custom_roles](variables-fast.tf#L38) | Custom roles defined at the org level, in key => id format. | object({…}) | | null | 0-bootstrap | | [essential_contacts](variables.tf#L98) | Email used for essential contacts, unset if null. | string | | null | | | [kms_keys](variables.tf#L104) | KMS keys to create, keyed by name. | map(object({…})) | | {} | | | [outputs_location](variables.tf#L142) | Path where providers, tfvars files, and lists for the following stages are written. Leave empty to disable. | string | | null | | -| [stage_configs](variables-fast.tf#L85) | FAST stage configuration. | object({…}) | | {} | 1-resman | -| [tag_values](variables-fast.tf#L99) | Root-level tag values. | map(string) | | {} | 1-resman | +| [stage_configs](variables-fast.tf#L76) | FAST stage configuration. | object({…}) | | {} | 1-resman | +| [tag_values](variables-fast.tf#L90) | Root-level tag values. | map(string) | | {} | 1-resman | ## Outputs diff --git a/fast/stages/2-security/main.tf b/fast/stages/2-security/main.tf index 139e2992e..bbb653925 100644 --- a/fast/stages/2-security/main.tf +++ b/fast/stages/2-security/main.tf @@ -63,18 +63,18 @@ module "project" { } # optionally delegate a fixed set of IAM roles to selected principals iam = { - (var.custom_roles.project_iam_viewer) = try( + "roles/iam.securityReviewer" = try( local.iam_viewer[each.key], [] ) } iam_bindings = ( lookup(local.iam_admin_delegated, each.key, null) == null ? {} : { sa_delegated_grants = { - role = "roles/resourcemanager.projectIamAdmin" + role = "roles/cloudkms.admin" members = try(local.iam_admin_delegated[each.key], []) condition = { title = "${each.key}_stage3_sa_delegated_grants" - description = "${var.environments[each.key].name} project delegated grants." + description = "${var.environments[each.key].name} KMS delegated grants." expression = format( "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly([%s])", local.iam_delegated diff --git a/fast/stages/2-security/variables-fast.tf b/fast/stages/2-security/variables-fast.tf index 406c449ab..0930cbfec 100644 --- a/fast/stages/2-security/variables-fast.tf +++ b/fast/stages/2-security/variables-fast.tf @@ -35,15 +35,6 @@ variable "billing_account" { } } -variable "custom_roles" { - # tfdoc:variable:source 0-bootstrap - description = "Custom roles defined at the org level, in key => id format." - type = object({ - project_iam_viewer = string - }) - default = null -} - variable "environments" { # tfdoc:variable:source 0-globals description = "Environment names." diff --git a/fast/stages/3-data-platform-dev/.fast-stage.env b/fast/stages/3-data-platform-dev/.fast-stage.env new file mode 100644 index 000000000..c9f86b414 --- /dev/null +++ b/fast/stages/3-data-platform-dev/.fast-stage.env @@ -0,0 +1,5 @@ +FAST_STAGE_DESCRIPTION="Data Platform (dev)" +FAST_STAGE_LEVEL=3 +FAST_STAGE_NAME=data-platform-dev +FAST_STAGE_DEPS="0-globals 0-bootstrap 1-resman" +FAST_STAGE_OPTIONAL="2-networking 2-security" diff --git a/fast/stages/3-data-platform-dev/README.md b/fast/stages/3-data-platform-dev/README.md new file mode 100644 index 000000000..23ea0952b --- /dev/null +++ b/fast/stages/3-data-platform-dev/README.md @@ -0,0 +1,261 @@ +# Data Platform + +This stage allows creation and management of a Data Platform, which enables the implementation of a reliable, robust, and scalable environment to support the onboarding of new data products (or data workloads) over time. + +The code provided here sets up the foundational design and centralizes sharing patterns for data, leaving the specifics of data handling, computation, and processing to the individual data products. + +This solution implements the [Data Mesh principles on Google Cloud Platform](https://cloud.google.com/architecture/data-mesh) and relies on the higher level FAST stages for the resource hierarchy, networking, and security. It's also possible to run this stage in isolation by providing it the required prerequisites. + + +- [Project Structure](#project-structure) + - [Central Shared Services](#central-shared-services) + - [Data Domains](#data-domains) + - [Data Products](#data-products) +- [Teams and personas](#teams-and-personas) +- [Configuration](#configuration) + - [FAST prerequisites](#fast-prerequisites) + - [Stage Variables](#stage-variables) + - [Data Domain and Product Data Files](#data-domain-and-product-data-files) + - [Context replacements](#context-replacements) +- [Files](#files) +- [Variables](#variables) +- [Outputs](#outputs) + + +## Project Structure + +The stage manages three separate high level components: + +- a central project, where aspect types, policy tags, and resource manager tags are defined +- one or more data domains, each composed of a folder, a project hosting resources shared at the product level (Composer), and a folder hosting data products +- one or more data products per domain, each composed of a project, and optional exposed resources + +The platform high level approach is represented in the following diagram: + +

+ High level diagram. +

+ +### Central Shared Services + +Central teams manage the data mesh by providing cross-domain oversight, services, and governance. They reduce the operational burden for data domains in producing and consuming data products, and facilitate the cross-domain relationships that are required for the data mesh to operate. + +A central project is created to host resources managed by the central team, which provide core and platform-wide capabilities such as Secure Tags, [Dataplex Catalog aspects)[https://cloud.google.com/dataplex/docs/enrich-entries-metadata], and [Policy tags](https://cloud.google.com/bigquery/docs/best-practices-policy-tags). + +### Data Domains + +Data Domains are usually aligned with business or functional units within an enterprise. Common examples of business domains might be the mortgage department in a bank, or the customer, distribution, finance, or HR departments of an enterprise. + +Data Domain creation is centrally managed by this stage, with a dedicated folder sub-hierarchy and project for each logical domain. This provides a clear organizational boundary and allows for IAM and resource separation, which usually maps to an actual line of business. + +A dedicated Data Domain project is created as the primary container for all services and resources specific to each domain. A shared Cloud Composer environment is also created to orchestrate domain-specific workflows, and provided by default with access to the domain's Data Products via impersonation. + +### Data Products + +One or more Data Products can be mapped to each Data Domain. A dedicated project is created for each product in its domain's hierarchy, enforcing modularity, scalability, flexibility and clear ownership boundaries. + +The per-product BigQuery and Cloud Storage exposure layers can then be deployed in each project, by binding the centrally managed secure tags connected to platform-level IAM bindings. + +## Teams and personas + +Clear operational role profiles must be defined for a data mesh to operate well, with each profile mapping to a team archetype or function. These profiles implement the core user journeys for each data mesh actor. This stage comes with three predefined profiles, which are meant as a starting example open to customizations. + +> TODO: add folder/project roles + +The three main functions identified here are: + +- **Central data team** + Defines and enforces the data platform structure and data governance policies among data producers, ensuring high data quality and data trustworthiness for consumers. This team is often referred to as the Data Governance team. +- **Data domain teams** + Aligned with specific business domains, these teams are responsible for creating and maintaining data products over their lifecycle. This includes defining the data product's purpose, scope, and boundaries, developing and maintaining a product roadmap, implementing data security measures, ensuring compliance, and monitoring usage and performance. +- **Data Product teams** + Aligned with a specific data products, these teams are responsible for developing, operating and maintaing the data product. + +## Configuration + +### FAST prerequisites + +This stage needs specific permissions granted to its automation service accounts on networking and security resources. + +Network permissions are needed to associate data domain or product projects to Shared VPC hosts and grant network permissions to data platform managed service accounts. They are mandatory when deploying Composer. + +Security permissions are only needed when using CMEK encryption, to grant the relevant IAM roles to data platform service agents on the encryption keys used. + +The networking and security configuration need to be defined in the resource management stage via specific YAML code blocks: two are needed for networking, and one for security. + +The first networking code block grants the relevant roles on the Networking folder to the Data Platform service accounts, with a condition on the environment tag. + +```yaml +# make sure this block exists in the data/stage-2/networking.yaml file + iam_bindings_additive: + # Data Platform (dev) + dp_dev_net_admin: + role: service_project_network_admin + member: data-platform-dev-rw + condition: + title: Data platform dev service project admin. + expression: | + resource.matchTag('${organization.id}/${tag_names.environment}', 'development') + dp_dev_net_viewer: + role: roles/compute.networkViewer + member: data-platform-dev-ro + condition: + title: Data platform dev network viewer. + expression: | + resource.matchTag('${organization.id}/${tag_names.environment}', 'development') +``` + +The second networking code block signals the networking stage that the Data Platform service accounts need delegated IAM grants on the dev network project, in order to be able to assign specific roles on it. + +```yaml +# make sure this block exists in the data/stage-2/networking.yaml file +stage3_config: + iam_admin_delegated: + - environment: dev + principal: data-platform-dev-rw + iam_viewer: + - environment: dev + principal: data-platform-dev-ro +``` + +For security, a block similar to the one above is needed. + +```yaml +# make sure this block exists in the data/stage-2/security.yaml file +stage3_config: + iam_admin_delegated: + - environment: dev + principal: data-platform-dev-rw + iam_viewer: + - environment: dev + principal: data-platform-dev-ro +``` + +Once the two above configurations are in place, apply the resource management, networking and security stages in succession. Be sure to refresh the tfvars files in the network and security stages if needed (e.g. by re-running `fast-links.sh`). + +### Stage Variables + +The default data files provided as an example makes a few assumptions that needs to be matched by corresponding variables configured for the stage: + +- the `location` variable needs to be explicitly configured, as it's used as a default location for buckets, datasets, and Composer; locations can be individually overridden but a default needs to be in place +- the domain `deploy_config.composer.node_config.subnetwork` attribute neeeds to match the location defined above; Composer network and subnetwork use interpolation from FAST networking outputs, explicit IDs can be used instead if needed +- IAM roles for the domain and product refer to generic `dp-product-a-0` and `data-consumer-bi` groups, these need to be defined via the `factories_config.context.iam_principals` variable, or changed to explicit IAM principals (e.g. `group:foo@example.com`) + +### Data Domain and Product Data Files + +The formats for both types of data files are controlled via [schemas](./schemas/), which can generally be used directly in development environments to provide error checking and autocompletion. + +### Context replacements + +This stage is designed so that factory files are as much as possible organization and resource agnostic, so that they can be portable across installations (e.g. for different environments, or partner/customer organizations). + +This is mostly achieved via context replacements in factory files, where IAM principals and a few other attributes can use short names from the `factories_config.context` variable or from internally managed resources, which are then expanded to full principals at runtime. + +For example, configuring the `factories_config.context` variable: + +```hcl +factories_config = { + context = { + iam_principals = { + data-consumer-bi = "group:data-consumer-bi@example.com" + } + } +} +``` + +Allows using the group short name in templates: + +```yaml +folder_config: + iam_by_principals: + data-consumer-bi: + - roles/datacatalog.viewer + - roles/dataplex.catalogViewer + - roles/datalineage.viewer +``` + +Or within a data domain definition, service accounts can be referenced in project-level IAM via their short name: + +```yaml +service_accounts: + rw: + description: Automation (rw). +project_config: + iam: + roles/owner: + - rw +``` + +The following table lists the available substitutions. + +| resource | attributes | context expansions | +| --------------- | ----------------------- | -------------------------------------------------------------------------------------- | +| central project | IAM principals | `var.factories_config.context.iam_principals` | +| central project | tag IAM principals | `var.factories_config.context.iam_principals` | +| domain folder | IAM principals | `var.factories_config.context.iam_principals` | +| domain project | shared VPC host project | FAST VPC hosts | +| domain project | IAM principals | `var.factories_config.context.iam_principals` | +| domain sa | IAM principals | `var.factories_config.context.iam_principals`
domain service accounts | +| product project | shared VPC host project | FAST VPC hosts | +| product project | IAM principals | `var.factories_config.context.iam_principals`
product service accounts | +| product project | IAM conditions | `var.factories_config.context.iam_tag_values`
FAST tag values
exposure tag value | +| product sa | IAM principals | `var.factories_config.context.iam_principals` | +| composer | shared VPC network | FAST VPCs | +| composer | shared VPC subnetwork | FAST subnets | +| composer | encryption key | `var.factories_config.context.encryption_keys`
FAST KMS keys | +| exposed bucket | encryption key | `var.factories_config.context.encryption_keys`
FAST KMS keys | +| exposed dataset | encryption key | `var.factories_config.context.encryption_keys`
FAST KMS keys | + + + +## Files + +| name | description | modules | resources | +|---|---|---|---| +| [data-domains-automation.tf](./data-domains-automation.tf) | Data product automation resources. | gcs · iam-service-account | | +| [data-domains-composer.tf](./data-domains-composer.tf) | None | iam-service-account | google_composer_environment | +| [data-domains.tf](./data-domains.tf) | None | folder · iam-service-account · project | | +| [data-products-automation.tf](./data-products-automation.tf) | Data product automation resources. | gcs · iam-service-account | | +| [data-products-exposure.tf](./data-products-exposure.tf) | Data product exposure layer resources. | bigquery-dataset · gcs | | +| [data-products.tf](./data-products.tf) | Data product project, service account and exposed resources. | iam-service-account · project | | +| [factory.tf](./factory.tf) | None | | | +| [main.tf](./main.tf) | Locals and project-level resources. | data-catalog-policy-tag · dataplex-aspect-types · project | | +| [outputs.tf](./outputs.tf) | Stage outputs. | | google_storage_bucket_object · local_file | +| [variables-fast.tf](./variables-fast.tf) | None | | | +| [variables.tf](./variables.tf) | Module variables. | | | + +## Variables + +| name | description | type | required | default | producer | +|---|---|:---:|:---:|:---:|:---:| +| [automation](variables-fast.tf#L17) | Automation resources created by the bootstrap stage. | object({…}) | ✓ | | 0-bootstrap | +| [billing_account](variables-fast.tf#L25) | Billing account id. If billing account is not part of the same org set `is_org_level` to false. | object({…}) | ✓ | | 0-bootstrap | +| [environments](variables-fast.tf#L33) | Environment names. | object({…}) | ✓ | | 1-resman | +| [prefix](variables-fast.tf#L68) | Prefix used for resources that need unique names. Use a maximum of 9 chars for organizations, and 11 chars for tenants. | string | ✓ | | 0-bootstrap | +| [aspect_types](variables.tf#L17) | Aspect templates. Merged with those defined via the factory. | map(object({…})) | | {} | | +| [central_project_config](variables.tf#L48) | Configuration for the top-level central project. | object({…}) | | {} | | +| [encryption_keys](variables.tf#L84) | Default encryption keys for services, in service => { region => key id } format. Overridable on a per-object basis. | object({…}) | | {} | | +| [exposure_config](variables.tf#L95) | Data exposure configuration. | object({…}) | | {} | | +| [factories_config](variables.tf#L113) | Configuration for the resource factories. | object({…}) | | {} | | +| [folder_ids](variables-fast.tf#L44) | Folder name => id mappings. | map(string) | | {} | 1-resman | +| [host_project_ids](variables-fast.tf#L52) | Shared VPC host project name => id mappings. | map(string) | | {} | 2-networking | +| [kms_keys](variables-fast.tf#L60) | KMS key ids. | map(string) | | {} | 2-security | +| [location](variables.tf#L128) | Default location used when no location is specified. | string | | "europe-west1" | | +| [outputs_location](variables.tf#L135) | Enable writing provider, tfvars and CI/CD workflow files to local filesystem. Leave null to disable. | string | | null | | +| [regions](variables-fast.tf#L78) | Region mappings. | map(string) | | {} | 2-networking | +| [secure_tags](variables.tf#L141) | Resource manager tags created in the central project. | map(object({…})) | | {} | | +| [stage_config](variables.tf#L162) | Stage configuration used to find environment and resource ids, and to generate names. | object({…}) | | {…} | | +| [subnet_self_links](variables-fast.tf#L86) | Subnet VPC name => { name => self link } mappings. | map(map(string)) | | {} | 2-networking | +| [tag_values](variables-fast.tf#L94) | FAST-managed resource manager tag values. | map(string) | | {} | 1-resman | +| [vpc_self_links](variables-fast.tf#L102) | Shared VPC name => self link mappings. | map(string) | | {} | 2-networking | + +## Outputs + +| name | description | sensitive | consumers | +|---|---|:---:|---| +| [aspect_types](outputs.tf#L191) | Aspect types defined in central project. | | | +| [central_project](outputs.tf#L196) | Central project attributes. | | | +| [data_domains](outputs.tf#L201) | Data domain attributes. | | | +| [policy_tags](outputs.tf#L206) | Policy tags defined in central project. | | | +| [secure_tags](outputs.tf#L211) | Secure tags defined in central project. | | | + diff --git a/fast/stages/3-data-platform-dev/data-domains-automation.tf b/fast/stages/3-data-platform-dev/data-domains-automation.tf new file mode 100644 index 000000000..841363a66 --- /dev/null +++ b/fast/stages/3-data-platform-dev/data-domains-automation.tf @@ -0,0 +1,63 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +# tfdoc:file:description Data product automation resources. + +module "dd-automation-bucket" { + source = "../../../modules/gcs" + for_each = { + for k, v in local.data_domains : + k => v if v.automation != null + } + project_id = module.dd-projects[each.key].project_id + prefix = local.prefix + name = "${each.value.short_name}-state" + location = try( + each.value.automation.location, + var.location + ) + iam = { + "roles/storage.admin" = [ + module.dd-automation-sa["${each.key}/rw"].iam_email + ] + "roles/storage.objectViewer" = concat( + [ + module.dd-automation-sa["${each.key}/ro"].iam_email + ], + [ + for m in each.value.automation.impersonation_principals : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + ) + } +} + +module "dd-automation-sa" { + source = "../../../modules/iam-service-account" + for_each = { for v in local.dd_automation_sa : v.key => v } + project_id = module.dd-projects[each.value.dd].project_id + prefix = each.value.prefix + name = each.value.name + description = each.value.description + iam = { + "roles/iam.serviceAccountTokenCreator" = [ + for m in each.value.impersonation_principals : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + } +} diff --git a/fast/stages/3-data-platform-dev/data-domains-composer.tf b/fast/stages/3-data-platform-dev/data-domains-composer.tf new file mode 100644 index 000000000..5d4d2df40 --- /dev/null +++ b/fast/stages/3-data-platform-dev/data-domains-composer.tf @@ -0,0 +1,123 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +locals { + dd_composer = { + for k, v in local.data_domains : k => merge( + { region = var.location, short_name = v.short_name }, + try(v.deploy_config.composer, {}) + ) + if( + try(v.deploy_config.composer.node_config.network, null) != null && + try(v.deploy_config.composer.node_config.subnetwork, null) != null + ) + } + dd_composer_keys = { + for k, v in local.dd_composer : k => try( + v.encryption_key, + var.encryption_keys.composer[v.region], + null + ) + } +} + +module "dd-composer-sa" { + source = "../../../modules/iam-service-account" + for_each = local.dd_composer + project_id = module.dd-projects[each.key].project_id + prefix = local.prefix + name = "${each.value.short_name}-cmp-sa" + description = "Composer Service Account." +} + +resource "google_composer_environment" "default" { + for_each = local.dd_composer + project = module.dd-projects-iam[each.key].project_id + name = "${var.prefix}-${each.key}" + region = each.value.region + config { + enable_private_builds_only = try(each.value.private_builds, true) + enable_private_environment = try(each.value.private_environment, true) + environment_size = try( + each.value.environment_size, + "ENVIRONMENT_SIZE_SMALL" + ) + dynamic "encryption_config" { + for_each = local.dd_composer_keys[each.key] == null ? [] : [""] + content { + kms_key_name = lookup( + local.kms_keys, + local.dd_composer_keys[each.key], + local.dd_composer_keys[each.key] + ) + } + } + # TODO: implement the same context fail mode used in the project factory + node_config { + service_account = try( + each.value.node_config.service_account, + module.dd-composer-sa[each.key].email + ) + network = try( + var.vpc_self_links[each.value.node_config.network], + each.value.node_config.network, + "-" + ) + subnetwork = try( + var.subnet_self_links[each.value.node_config.network][each.value.node_config.subnetwork], + each.value.node_config.subnetwork, + "-" + ) + } + software_config { + image_version = "composer-3-airflow-2" + cloud_data_lineage_integration { + enabled = true + } + } + workloads_config { + dag_processor { + cpu = try(each.value.workloads_config.dag_processor.cpu, 0.5) + memory_gb = try(each.value.workloads_config.dag_processor.memory_gb, 2) + storage_gb = try(each.value.workloads_config.dag_processor.storage_gb, 1) + count = try(each.value.workloads_config.dag_processor.count, 1) + } + scheduler { + cpu = try(each.value.workloads_config.scheduler.cpu, 0.5) + memory_gb = try(each.value.workloads_config.scheduler.memory_gb, 2) + storage_gb = try(each.value.workloads_config.scheduler.storage_gb, 1) + count = try(each.value.workloads_config.scheduler.count, 1) + } + triggerer { + cpu = try(each.value.workloads_config.triggerer.cpu, 0.5) + memory_gb = try(each.value.workloads_config.triggerer.memory_gb, 2) + count = try(each.value.workloads_config.triggerer.count, 1) + } + web_server { + cpu = try(each.value.workloads_config.web_server.cpu, 0.5) + memory_gb = try(each.value.workloads_config.web_server.memory_gb, 2) + storage_gb = try(each.value.workloads_config.web_server.storage_gb, 1) + } + worker { + cpu = try(each.value.workloads_config.worker.cpu, 0.5) + memory_gb = try(each.value.workloads_config.worker.memory_gb, 2) + storage_gb = try(each.value.workloads_config.worker.storage_gb, 1) + min_count = try(each.value.workloads_config.worker.min_count, 1) + max_count = try(each.value.workloads_config.worker.max_count, 1) + } + } + } +} diff --git a/fast/stages/3-data-platform-dev/data-domains.tf b/fast/stages/3-data-platform-dev/data-domains.tf new file mode 100644 index 000000000..64837b061 --- /dev/null +++ b/fast/stages/3-data-platform-dev/data-domains.tf @@ -0,0 +1,246 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +locals { + dd_services = { + for k, v in local.data_domains : k => distinct(concat( + v.project_config.services, + lookup(local.dd_composer, k, null) == null ? [] : [ + "composer.googleapis.com", + "storage.googleapis.com" + ] + )) + } +} + +module "dd-folders" { + source = "../../../modules/folder" + for_each = local.data_domains + parent = var.folder_ids[var.stage_config.name] + name = each.value.name + iam = { + for k, v in each.value.folder_config.iam : k => [ + for m in v : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + } + iam_bindings = { + for k, v in each.value.folder_config.iam_bindings : k => merge(v, { + members = [ + for m in v.members : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + condition = try(v.condition, null) == null ? null : { + title = v.condition.title + description = try(v.condition.description, null) + expression = templatestring(v.condition.expression, { + tag_values = local.tag_values + }) + } + }) + } + iam_bindings_additive = { + for k, v in each.value.folder_config.iam_bindings_additive : k => merge(v, { + member = lookup( + var.factories_config.context.iam_principals, v.member, v.member + ) + condition = try(v.condition, null) == null ? null : { + title = v.condition.title + description = try(v.condition.description, null) + expression = templatestring(v.condition.expression, { + tag_values = local.tag_values + }) + } + }) + } + iam_by_principals = { + for k, v in each.value.folder_config.iam_by_principals : + lookup(var.factories_config.context.iam_principals, k, k) => v + } +} + +module "dd-dp-folders" { + source = "../../../modules/folder" + for_each = local.data_domains + parent = module.dd-folders[each.key].id + name = "Data Products" + iam = try(each.value.deploy_config.composer, null) == null ? {} : { + "roles/iam.serviceAccountTokenCreator" = [ + module.dd-composer-sa[each.key].iam_email + ] + } +} + +module "dd-projects" { + source = "../../../modules/project" + for_each = local.data_domains + billing_account = var.billing_account.id + name = "${each.value.short_name}-shared-0" + parent = module.dd-folders[each.key].id + prefix = local.prefix + labels = { + data_domain = each.key + } + services = local.dd_services[each.key] + service_encryption_key_ids = ( + lookup(local.dd_composer, each.key, null) == null ? {} : { + "composer.googleapis.com" = compact([ + try(local.dd_composer_keys[each.key], null) == null + ? null + : lookup( + local.kms_keys, + local.dd_composer_keys[each.key], + local.dd_composer_keys[each.key] + ) + ]) + } + ) +} + +module "dd-projects-iam" { + source = "../../../modules/project" + for_each = local.data_domains + name = module.dd-projects[each.key].project_id + project_reuse = { + use_data_source = false + project_attributes = { + name = module.dd-projects[each.key].name + number = module.dd-projects[each.key].number + services_enabled = local.dd_services[each.key] + } + } + iam = { + for k, v in each.value.project_config.iam : k => [ + for m in v : try( + var.factories_config.context.iam_principals[m], + module.dd-automation-sa["${each.key}/${m}"].iam_email, + module.dd-service-accounts["${each.key}/${m}"].iam_email, + m + ) + ] + } + iam_bindings = { + for k, v in each.value.project_config.iam_bindings : k => merge(v, { + members = [ + for m in v.members : try( + var.factories_config.context.iam_principals[m], + module.dd-automation-sa["${each.key}/${m}"].iam_email, + module.dd-service-accounts["${each.key}/${m}"].iam_email, + m + ) + ] + condition = try(v.condition, null) == null ? null : { + title = v.condition.title + description = try(v.condition.description, null) + expression = templatestring(v.condition.expression, { + tag_values = local.tag_values + }) + } + }) + } + iam_bindings_additive = merge( + { + for k, v in each.value.project_config.iam_bindings_additive : k => merge(v, { + member = try( + var.factories_config.context.iam_principals[v.member], + module.dd-automation-sa["${each.key}/${v.member}"].iam_email, + module.dd-service-accounts["${each.key}/${v.member}"].iam_email, + v.member + ) + condition = try(v.condition, null) == null ? null : { + title = v.condition.title + description = try(v.condition.description, null) + expression = templatestring(v.condition.expression, { + tag_values = local.tag_values + }) + } + }) + }, + try(each.value.deploy_config.composer, null) == null ? {} : { + composer_worker = { + member = module.dd-composer-sa[each.key].iam_email + role = "roles/composer.worker" + } + } + ) + iam_by_principals = { + for k, v in each.value.project_config.iam_by_principals : + lookup(var.factories_config.context.iam_by_principals, k, k) => v + } + shared_vpc_service_config = ( + each.value.project_config.shared_vpc_service_config == null + ? null + : { + host_project = lookup( + var.host_project_ids, + each.value.project_config.shared_vpc_service_config.host_project, + each.value.project_config.shared_vpc_service_config.host_project + ) + network_users = [ + for m in try(each.value.project_config.shared_vpc_service_config.network_users, []) : + try( + var.factories_config.context.iam_principals[m], + module.dd-automation-sa["${each.key}/${m}"].iam_email, + module.dd-service-accounts["${each.key}/${m}"].iam_email, + m + ) + ] + service_agent_iam = try( + each.value.project_config.shared_vpc_service_config.service_agent_iam, + {} + ) + service_iam_grants = try( + each.value.project_config.shared_vpc_service_config.service_iam_grants, + [] + ) + } + ) +} + +module "dd-service-accounts" { + source = "../../../modules/iam-service-account" + for_each = { for v in local.dd_service_accounts : v.key => v } + project_id = module.dd-projects[each.value.dd].project_id + prefix = local.prefix + name = each.value.name + description = each.value.description + iam = { + for k, v in each.value.iam : k => [ + for m in v : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + } + iam_bindings = { + for k, v in each.value.iam_bindings : k => merge(v, { + members = [ + for m in v.members : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + }) + } + iam_bindings_additive = { + for k, v in each.value.iam_bindings_additive : k => merge(v, { + member = lookup( + var.factories_config.context.iam_principals, v.member, v.member + ) + }) + } + iam_storage_roles = each.value.iam_storage_roles +} diff --git a/fast/stages/3-data-platform-dev/data-products-automation.tf b/fast/stages/3-data-platform-dev/data-products-automation.tf new file mode 100644 index 000000000..884f626d9 --- /dev/null +++ b/fast/stages/3-data-platform-dev/data-products-automation.tf @@ -0,0 +1,63 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +# tfdoc:file:description Data product automation resources. + +module "dp-automation-bucket" { + source = "../../../modules/gcs" + for_each = { + for k, v in local.data_products : + k => v if v.automation != null + } + project_id = module.dd-projects[each.value.dd].project_id + prefix = local.prefix + name = "${each.value.short_name}-state" + location = try( + each.value.automation.location, + var.location + ) + iam = { + "roles/storage.admin" = [ + module.dp-automation-sa["${each.key}/rw"].iam_email + ] + "roles/storage.objectViewer" = concat( + [ + module.dp-automation-sa["${each.key}/ro"].iam_email + ], + [ + for m in each.value.automation.impersonation_principals : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + ) + } +} + +module "dp-automation-sa" { + source = "../../../modules/iam-service-account" + for_each = { for v in local.dp_automation_sa : v.key => v } + project_id = module.dp-projects[each.value.dp].project_id + prefix = each.value.prefix + name = each.value.name + description = each.value.description + iam = { + "roles/iam.serviceAccountTokenCreator" = [ + for m in each.value.impersonation_principals : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + } +} diff --git a/fast/stages/3-data-platform-dev/data-products-exposure.tf b/fast/stages/3-data-platform-dev/data-products-exposure.tf new file mode 100644 index 000000000..f5c2e0956 --- /dev/null +++ b/fast/stages/3-data-platform-dev/data-products-exposure.tf @@ -0,0 +1,86 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +# tfdoc:file:description Data product exposure layer resources. + +module "dp-buckets" { + source = "../../../modules/gcs" + for_each = { + for v in local.dp_buckets : "${v.dp}/${v.key}" => v + } + project_id = module.dp-projects[each.value.dp].project_id + prefix = local.prefix + name = "${each.value.dps}-${each.value.short_name}-0" + location = each.value.location + encryption_key = ( + local.dp_bucket_keys[each.key] == null + ? null + : lookup( + local.kms_keys, + local.dp_bucket_keys[each.key], + local.dp_bucket_keys[each.key] + ) + ) + iam = { + for k, v in each.value.iam : k => [ + for m in v : try( + var.factories_config.context.iam_principals[m], + module.dp-automation-sa["${each.key}/${m}"].iam_email, + module.dp-service-accounts["${each.key}/${m}"].iam_email, + m + ) + ] + } + tag_bindings = { + exposure = ( + module.central-project.tag_values[var.exposure_config.tag_name].id + ) + } +} + +module "dp-datasets" { + source = "../../../modules/bigquery-dataset" + for_each = { + for v in local.dp_datasets : "${v.dp}/${v.key}" => v + } + project_id = module.dp-projects[each.value.dp].project_id + id = "${local.prefix_bq}_${each.value.dps}_${each.value.short_name}_0" + location = each.value.location + encryption_key = ( + local.dp_dataset_keys[each.key] == null + ? null + : lookup( + local.kms_keys, + local.dp_dataset_keys[each.key], + local.dp_dataset_keys[each.key] + ) + ) + iam = { + for k, v in each.value.iam : k => [ + for m in v : try( + var.factories_config.context.iam_principals[m], + module.dp-automation-sa["${each.key}/${m}"].iam_email, + module.dp-service-accounts["${each.key}/${m}"].iam_email, + m + ) + ] + } + tag_bindings = { + exposure = ( + module.central-project.tag_values[var.exposure_config.tag_name].id + ) + } +} diff --git a/fast/stages/3-data-platform-dev/data-products.tf b/fast/stages/3-data-platform-dev/data-products.tf new file mode 100644 index 000000000..5095f4a8a --- /dev/null +++ b/fast/stages/3-data-platform-dev/data-products.tf @@ -0,0 +1,172 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +# tfdoc:file:description Data product project, service account and exposed resources. + +module "dp-projects" { + source = "../../../modules/project" + for_each = local.data_products + billing_account = var.billing_account.id + name = "${each.value.dds}-${each.value.short_name}-0" + parent = module.dd-dp-folders[each.value.dd].id + prefix = local.prefix + labels = { + data_domain = each.value.dd + data_product = replace(each.key, "/", "_") + } + services = each.value.services + service_encryption_key_ids = { + "bigquery.googleapis.com" = distinct([ + for k, v in local.dp_dataset_keys : + lookup(local.kms_keys, v, v) + if startswith(k, each.key) && v != null + ]) + "storage.googleapis.com" = distinct([ + for k, v in local.dp_bucket_keys : + lookup(local.kms_keys, v, v) + if startswith(k, each.key) && v != null + ]) + } +} + +module "dp-projects-iam" { + source = "../../../modules/project" + for_each = local.data_products + name = module.dp-projects[each.key].project_id + project_reuse = { + use_data_source = false + project_attributes = { + name = module.dp-projects[each.key].name + number = module.dp-projects[each.key].number + services_enabled = each.value.services + } + } + iam = { + for k, v in each.value.iam : k => [ + for m in v : try( + var.factories_config.context.iam_principals[m], + module.dp-automation-sa["${each.key}/${m}"].iam_email, + module.dp-service-accounts["${each.key}/${m}"].iam_email, + m + ) + ] + } + iam_bindings = { + for k, v in each.value.iam_bindings : k => merge(v, { + members = [ + for m in v.members : try( + var.factories_config.context.iam_principals[m], + module.dp-automation-sa["${each.key}/${m}"].iam_email, + module.dp-service-accounts["${each.key}/${m}"].iam_email, + m + ) + ] + condition = try(v.condition, null) == null ? null : { + title = v.condition.title + description = try(v.condition.description, null) + expression = templatestring(v.condition.expression, { + tag_values = local.tag_values + }) + } + }) + } + iam_bindings_additive = { + for k, v in each.value.iam_bindings_additive : k => merge(v, { + member = try( + var.factories_config.context.iam_principals[v.member], + module.dp-automation-sa["${each.key}/${v.member}"].iam_email, + module.dp-service-accounts["${each.key}/${v.member}"].iam_email, + v.member + ) + condition = try(v.condition, null) == null ? null : { + title = v.condition.title + description = try(v.condition.description, null) + expression = templatestring(v.condition.expression, { + tag_values = local.tag_values + }) + } + }) + } + iam_by_principals = { + for k, v in each.value.iam_by_principals : try( + var.factories_config.context.iam_principals[k], + module.dp-automation-sa["${each.key}/${k}"].iam_email, + module.dp-service-accounts["${each.key}/${k}"].iam_email, + k + ) => v + } + shared_vpc_service_config = ( + each.value.shared_vpc_service_config == null + ? null + : { + host_project = lookup( + var.host_project_ids, + each.value.shared_vpc_service_config.host_project, + each.value.shared_vpc_service_config.host_project + ) + network_users = [ + for m in try(each.value.shared_vpc_service_config.network_users, []) : + try( + var.factories_config.context.iam_principals[m], + module.dp-automation-sa["${each.key}/${m}"].iam_email, + module.dp-service-accounts["${each.key}/${m}"].iam_email, + m + ) + ] + service_agent_iam = try( + each.value.shared_vpc_service_config.service_agent_iam, + {} + ) + service_iam_grants = try( + each.value.shared_vpc_service_config.service_iam_grants, + [] + ) + } + ) +} + +module "dp-service-accounts" { + source = "../../../modules/iam-service-account" + for_each = { for v in local.dp_service_accounts : v.key => v } + project_id = module.dp-projects[each.value.dp].project_id + prefix = each.value.prefix + name = each.value.name + description = each.value.description + iam = { + for k, v in each.value.iam : k => [ + for m in v : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + } + iam_bindings = { + for k, v in each.value.iam_bindings : k => merge(v, { + members = [ + for m in v.members : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + }) + } + iam_bindings_additive = { + for k, v in each.value.iam_bindings_additive : k => merge(v, { + member = lookup( + var.factories_config.context.iam_principals, v.member, v.member + ) + }) + } + iam_storage_roles = each.value.iam_storage_roles +} diff --git a/fast/stages/3-data-platform-dev/data/aspect-types/test-0.yaml b/fast/stages/3-data-platform-dev/data/aspect-types/test-0.yaml new file mode 100644 index 000000000..d81db5678 --- /dev/null +++ b/fast/stages/3-data-platform-dev/data/aspect-types/test-0.yaml @@ -0,0 +1,46 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# yaml-language-server: $schema=../../schemas/aspect-type.schema.json + +display_name: "Basic template" +metadata_template: | + { + "name": "tf-basic-template", + "type": "record", + "recordFields": [ + { + "name": "source", + "type": "string", + "annotations": { + "displayName": "Source", + "description": "Specifies the source of data." + }, + "index": 1, + "constraints": { + "required": true + } + }, + { + "name": "owner", + "type": "string", + "annotations": { + "displayName": "Owner", + "description": "Specifies the data owner." + }, + "index": 2, + "constraints": {} + } + ] + } diff --git a/fast/stages/3-data-platform-dev/data/data-domains/domain-0/_config.yaml b/fast/stages/3-data-platform-dev/data/data-domains/domain-0/_config.yaml new file mode 100644 index 000000000..1dad385b7 --- /dev/null +++ b/fast/stages/3-data-platform-dev/data/data-domains/domain-0/_config.yaml @@ -0,0 +1,68 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# yaml-language-server: $schema=../../../schemas/data-domain.schema.json + +name: Domain 0 +short_name: d0 + +automation: + impersonation_principals: + - dp-product-a-0 + +deploy_config: + composer: + # region defaults to var.location + # encryption_key: composer-dev-europe-west8 + node_config: + network: dev-spoke-0 + subnetwork: europe-west8/dev-dataplatform + +project_config: + iam: + roles/owner: + - rw + roles/viewer: + - ro + roles/composer.environmentAndStorageObjectAdmin: + - dp-product-a-0 + roles/monitoring.viewer: + - dp-product-a-0 + services: + - composer.googleapis.com + - datacatalog.googleapis.com + - dataplex.googleapis.com + - datalineage.googleapis.com + shared_vpc_service_config: + host_project: dev-spoke-0 + service_agent_iam: + roles/composer.sharedVpcAgent: + - composer + +folder_config: + iam_bindings: + bigquery_metadata_viewer: + members: + - data-consumer-bi + role: roles/dataplex.catalogViewer #roles/bigquery.metadataViewer + condition: + title: exposure + description: Expose via secure tag. + expression: resource.matchTag('exposure', 'allow') + iam_by_principals: + data-consumer-bi: + - roles/datalineage.viewer + dp-product-a-0: + - "roles/logging.viewer" + - "roles/monitoring.viewer" diff --git a/fast/stages/3-data-platform-dev/data/data-domains/domain-0/product-0.yaml b/fast/stages/3-data-platform-dev/data/data-domains/domain-0/product-0.yaml new file mode 100644 index 000000000..efbcfef45 --- /dev/null +++ b/fast/stages/3-data-platform-dev/data/data-domains/domain-0/product-0.yaml @@ -0,0 +1,78 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# yaml-language-server: $schema=../../../schemas/data-product.schema.json + +short_name: p0 +services: + - bigquery.googleapis.com + - cloudaicompanion.googleapis.com + - cloudresourcemanager.googleapis.com + - composer.googleapis.com + - datacatalog.googleapis.com + - dataplex.googleapis.com + - datalineage.googleapis.com + - storage.googleapis.com +automation: + impersonation_principals: + - dp-product-a-0 +exposure_layer: + bigquery: + datasets: + exposure: {} + iam: + "roles/bigquery.dataViewer": + - data-consumer-bi + storage: + buckets: + exposed-ew8: {} + iam: + "roles/storage.objectViewer": + - data-consumer-bi +iam_by_principals: + rw: + - roles/editor + ro: + - roles/viewer + dp-product-a-0: + - "roles/dataplex.catalogEditor" + - "roles/bigquery.dataOwner" + - "roles/bigquery.jobUser" + - "roles/datalineage.viewer" + - "roles/dataplex.dataScanCreator" + - "roles/logging.viewer" + - "roles/monitoring.viewer" + - "roles/serviceusage.serviceUsageViewer" + - "roles/storage.bucketViewer" + - "roles/storage.objectAdmin" + processing: + - "roles/bigquery.dataEditor" + - "roles/bigquery.jobUser" + - "roles/dataflow.admin" + - "roles/dataproc.editor" + - "roles/dataproc.worker" + - "roles/iam.serviceAccountUser" + - "roles/storage.bucketViewer" + - "roles/storage.objectAdmin" +# iam_bindings_additive: +# test-tag: +# member: rw +# role: roles/storage.objectViewer +# condition: +# title: Storage viewer on exposed resources. +# expression: | +# resource.matchTag('${tag_values["exposure/allow"]}') +service_accounts: + processing: + description: Processing service account. diff --git a/fast/stages/3-data-platform-dev/diagram.png b/fast/stages/3-data-platform-dev/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..c01a73853f3c8a4edc72a03149167e66cba5d5b9 GIT binary patch literal 152881 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 XG27eY5yi1z{eKl ziSZfa>AkjF*Kvx?830gs0T$wRjrDy7)1G!baaP*?FGVhOP70`1GH0Du0*qpvzQMKL zyEkG@nI@hjvByLMFA90nk$3>VroC(Nz1L3lh_*sL7X5ZCI(aoN+OjK1s<9s6x7SX8 z(*72r#q8PzV{T-rEU{3oT|`@Ulqgv89pH)Ka4l2pf2qVidbrWv?u=Iab2e{O!H-~e z6zYUsgJ!xS`|$Pm+#Nci1R_(}C)BecC6XzwV9oLMO{dlQKDt|0CFf}O#)*4BXc_IR zcZ64)+$oS9jnG5a)B#J>souvc60KG{=%gvL&DkM9FamTL6ZJyv>j&=*-zSe`d6I9`pIY^kKRm}BB>zZdGv@D3Dtx@81 z$i-z^q47&3j;gW=)Yux+FpYcP_btv~mwq!qsd3j;?Wr5#6bJ!wE9(9#NzR_JJtiNR z`Ur2tdXF8m*=l~=@Awqj5ejpu-s87)7*K1k6yA=SN{=i`mG}BWlH#ME(CB z7vMSu}o~{NaxBmJGE=OQCZ-W{-P(_S{@C??Zn~_Z#Fn zGlj!N4K~!dx8^-u0)!)Zq`^9Qt|39o_DAuKUv-+s%VnJ`>frw%>8=6`yCLg=J_2}yATAU_GM>rBkoUTyF9irEU=mzoSQUrYT)y^4y|v-1lbD!jrLR#@WMuxMO%w4-Fingz zl`u_$ngni6ZxtUnwU$!}$>nIo?Oz@*jaJ0emcW03J-H&SRoYhCzOFZ8v!`O`(@*Id3Hz!I%Jwh zo_grBlAk(ca5&z-jEFe&KD3}oYs+eKtWJX|qK9(kSXS3_Sy|_3GrB9vY!rzpFE4ea@ot?- zi@)v{IDpxE2rQ`5gw?Q$osvjzQ2t|5(7=R(g-Aa}p+45)a!c*3!6I=ES zB-p=|{1ePj{G=2XlR><=%gcLhDO^&!rGx?oIzI{uy-y5Ve!kI4D_P~R;BtA9{N|`D zhWXn(oaiE!lXnuKlk?sp-+3)!t+YA|xKs^{I;^%&WU%cjhDRL2~}sKtDdQB`J_(5|2aW7d@i21?wus zAQS%cYbY3lfyOF+^KkbnyfndkqQmj2Pa&`T!kroMT7Am+7JZkMcNh0j7|6RNPXoU7 z*?(J-wMl=Yo)lTo9FT^`hDH|^?u@C5RX&3&-eEcsFjY`@qZy8*_?m{|3Hl=T?ngzT ze-iZR0Buql?DfpTg^!ZJ3L6#U#RfOlN+>BnXYY}7jEbdzp0UYDucN0sa**W2&Ao;d zHBJccC2eJ}aPI4lR&3?3yBAyVCqAgAoUa9nfM&2|+UG^e&kqirxHzMY5i-sPjDCP3 zll5K<@XpaA{)diiJhdoD8P!et(jM31G1r&4C>W0zPAe}G$2~!-AzlxLye^T4%!t3g@}jzK--XzF+Up4LhRbm0NGNxP502h8#;o zIy-NZvA%*`vNgNZ>}_&B5y2zbT8s7wvlnrnPCPPVB8mBwKQ?Xo<=G_A%tZhlAheG6 z;f1u^9eM&pCB=#V^k{#up-@Y@Nd*?)B>sd)Oq>^fs zLcWs@+FK_2FPbLFRR=0N_(Y~UMXMa&<7pMn)vVQ^u!54j%2q)u6-I%17Agoft+je; z&aWIlC__Ww#S6p(Lq_w?c9#}VlG^kB4Q_@wDo&eD<77I+%M=7wjC!5(UfzwbN;$YQ z%XgHr;B%B)C|Rqb0k;FPg7^-T!e2G%B&}K!x3;KJ+2z$RiC<=n)tU%Rd&uE>Xf(@{ zIELzW0{Kj0VxJK@7)f4V8nK%g64c5#%l@(2ATRO?o5or(@A+v*1uN|R#k`Y>w}XO& zRwPl0*7~3TL#oF}ua_{tyFbwW_^t5nGq|f?12vDVWZG8tG;8ei!aP0LcbZX3#pC=U zZ5uq9`0p9KVD2bCZErBBea*KE^@0U25T$+3dU?xC8r}FtcotXYc498oD&0RSMT5>N z)zXOcyt>bw2K!L*n?q?=GHvT*9xO%oRJ&$NK(>flNJc`9@h#j_hZB{31={nj89^Np zqSefZss}{@ZbswW=fnrI!8fENaSUQFF8j%bPhzRf;+5+bJ_4>#_HeD6mvIrDKCCo9 z+N8SGwWB`%N!o~|u1hN{$hj-rQX?1N5o^WnJ(3q8M{!hwKK6P;oxld3uM$6DtZ$SK zO@9vfWGFb^f!M_t!}X}n`0-{fq0gL4iK~X1?>yboO8Z%W<~15VtH_PPxW?X(=H+X+ zj#=itRnPC1VfxV~!0AOcQHaj1_}xgWMREY$Gf90E+*bxVmWI%@Mq)vO@~cJT?U zo_4uls}7P&$9A$3K?e?H%L8xUKs>{rb+fyNZHJ%v3y#0$97jq+D?Fa^hv$h^K}QKl z26_-w2Qa=6f(*#nDsQ+jj4b%Y9{4cKAEbK9X&lbUD#VbwsfM#FSD|AF2Zc?7W-0kZ zAx!KDwU)2zOR>cX>^OGq8bI1%+rwZ8J`B=CGECS`*k>ydHQgv1^!R7I3Yg(e$#!kN zVX><3@3GiT(i3^tC6Y0G-7>p5{|%HZ^Q&ziC3R+r{lSpFFJpz`QV1Ug=OQ$ZG`+@r zP7;(l%BgCFeO#KBWq2iVv>w+);5QEzy%2EwnmhE>mIDM*aNqI#))ep>SF<)K}uib+xAu43wRg&?o-wKm%jAAA#0O;W}W%GAs??YWopW! z$tb7eztr!)dHx5qd&xZE?@*3&+&TAf`4rF)|l;Lz&|_VK||QX_6kwSVnxGaSdlK$v#J}EL?{q z=)VSle+%L-B?J5(js~RZu}vm$ZzMgZ4UGTkho@YW)aoq{@qhl}+255vNU}d}6(D}MmU7rBtJ z+x3DqjCT$3Te`1*1be1IVtuv%wVa zOD#W>UABxzjgLa2Be@)#<0$P%a3*#b`x!mS4pQn|UsC8xeoG`9hvs?5I8;OU6M9Vr zmOtV@c@L20{9ivsh~60ppjPN#06FD89*&@9@2c$^;D6QL^B%EN3_u>-|??#k{Q;Y2z12+8c51!p4~ znT)pBn;TZmVq#)$p3X^V-sx0siTR}jkTi$LZzw=w?i|a57MzG ztxKp^$0{PaPo$+aEaPfauu1^gKd|%Y>^Y@8Fcps8g0oTXB8&?n= z=$;y7Qmc;rZ@Cf2!0;2)^-tFUy$gQulRCoz+0`sj(wquFI2Ks+PnS#5UN&WAVITxZ z1~i)*{DxYgflfd=@aer?(tt)H*40X+P3gG~Jr01WH#%vEY7yY>bC+}f8@)h%0IDN# zwln?@Q;6hcLkOgJZvt=*?^#KKr&^pmDt`pu)`aK0X(X_3)Bw{FX+3DayV;>rmIT-5 zsEJo61x>>kaYm<*eR01v{lHO<{41!&nlHrCST(;jdXP_?nhk&?7Ec#G`MjmKRL#L`8Wfg9 zavw~;@aizljXU__;Nw!>BF?n#zHUu1R)RSKju7oHNh?}){onsZyIO#ipCQrxOL6~Q zQ#7Kyx`u5v#{QF4Ql`#Nz0{BaU~Y1qRi}?PXG*2>w9mQG_8jd>;@9_khw6qMOITZ7 zY$xD!9PLTEks7T5pS$kmu8EWs!RB0#{_!E2#Mo#?=~!gtcYn>XIgW>&1aCCjy-{}3wW)>2h|!}iwiY| zsE3F{$5L|A2IAwmb;q92vZ0?v#WNN37apxnd36*u79a+^u<=zcT9gRAs@B;WlRM;d zjA93j;y#~}jbl8{xfpxT1LU0IQ7xI|{hM9DIIS92RMqpKX4S0kXTKI$Z=^_S#z+Yi zzQn5JCT~Uk?gDPikl5e=C(*s{{96>ON9Evd3jIaWeXW>k6^lVS;Eq;2YX|&Cmefk+ z*%*C?q4?G$O>NcKX!j?>8V%wn$DXz9_-L6befyG+&#rQz=mrO~6LaU}>8fq@T=g(# z-!itCQz1w4)^vYbYJssHJ4-9)i$pdeqK?mRdQB)_2Bx?x*|lt%pZ`r4a0iLL`QY zncrHt@wXp72ImwfLR%UEPI2;Ez)|`$z=ZM1c+Wx4)Sh%DrUld|z_wq5uRytvtS@=+ z^fA~Er)$O5J29jMX0VScYg@9R+^^9iqok=i&Cpa`vjN^Q1E~4_OeUl`0r6)V0n}TW zMmb=e5`D)-xR0Y6R;Z~;D-3uI6_;EACVooEy3y!MiM+t?z(tu*S^-};2E?4=HsE__ zFX6pH^awUxS+WX3fh5fAF6j|c&e7fLFUb zbuVw@vx;*R_ngf6-|ePfzBa98!&K#23`mLnR()`ifBf_9kI2c6n!~eBI-Zu0V$xfm zNl6!5^k$ba2p^ap2UF>yd)ax!Wmf0B=j;;x*HAC-EYp+Y736K1Ca|RZav=x`JbX?Z zUqq8_$4(Vn&yOoAr*?BFH%ijp0c*(>@58xTYz_O2S}amGuk~LJjqWN)51Wt2}mr?t!T} zz|*J+6tBm}xny_S?V(rMXo)2Z_~E?)v)s3&qq>$5F5bF6l3ygn)|e^uCn1;v_Fl6w z?5U0U7Y=O&5xEcs3Kk)8Tfy?EAow3W&5*J)oNqchju+23b$*HayCb(-z7{}=qr zpB&kO-~5M5zCieSpTFRqe@qC8PEas-X)-?EE2`lr3EaY_)gvy@Jce%2vylc$dx58M z6`J(M$$!hRZ;EHB_8rmVLy0HggXeab~90p09iaQoIi45HqCU#~wKe9umx4d3?T0a$ejgTQwv0m9&M^jN_qdT_J|*SWMpBoRgdI#`9}c0P_D- zRlX7J+sC-2I6xCGPOFX1!2jm68R*s;WSF+q&^dE#n1ZZ3 zqqS!_t_x9N)A7$L(MLpbNCa?DZUd1C|4^qO30&`|XxgP4_syV$RRMIEqc|TjO$&?; zqONX_Hwp=G*(_&d<9qt~0zs8m0dFy+>yq}pW!H!}55KCat3`QL8+AX~ktM$s7{))S zb>J|7FrsT~Q0?EC6;}nM6;cV%7g%I64N2)vG+v8zyU~`=pw!db@p)h+G9tn!uKK2j zXt=D65TycEMGq=dmPp=J!g%pXEb^4!_RfmPFTR7SQt3Iv#Ae*PY$Y_S%^Pz$Fc?r2 z9m_tDZh@zYd3Z8sA^o^Y{)eL^#n(Y9?LA!yy5>_rg2s{j8vqBP(C>qk$K;zT>*aL3 zBdasSFIjJ@6|BqiTiG77;)Q577(~N4X1`$(qhq}n6&Fk`pSJHJ3tHxz{&vcQaGoEc zvXL~U_xDNo7E5-P=n!d+KV5O}LDVTW$&j&-BX5Z2gA^+t|0=BoHzfB$3=5yDR#Sdf z_(XcEE%{U4Pf9iPiRQ#fR8hS|k|j6&vGuxNtbXL|{>`<8Melq6L1Xq!lvrQk_55be zNJsy1x_6@!5lP-wN5Q&}if->eNQQ8AAJm*pPTBlJ4Y^pSLM3Ev2Yp#(?Iy0+H7xnB z5)U(7Q`z$Aj_tYHE_M+K4s5e_ovg9Ng!ki#_y?U^$}=h-M6iwhhJrc!l8(M@p2U`A z@sJ8%6zMkX2(x)d%N^jq<7!?9gv0y$iw`uC57$uk86er|J0d0jq^ZR)07RP-5x&|p zlW%Wq?^I)Hy#Z=2x$oe$Wh+^7`)v=;n3RhNTjYo(0reyR)CEg&)t@E6)c@p=0!RRm zd$m?P3~?4ix*$b?2$+a}@{Phs5I;b?j$KZH z+$-kCB?W|@3D#BbC*JY$vRi2YEFLtbROlb5Vyb~`jr!{xq?GJ;^F8RtV}XfS-st0& z>!7ySbcNSqkaVUyz@uxmgJrPv(3hrrs(mcL&AMBF3z(lE8o>w0+8bsY+HO-7#)d^T z{|P}HvooD6hrLLaBLv!&JnL%iuZ>Z5#>1EO*CGjy-(@u>8$uNdh+3+nI~T@<+Gzd* z59w=y2UiKm*39Ydyxdv50#8s|Xql(Kq@{`#l0JtLaqj|+z61ul{9+rMH07NLEgQ35*->_suo(=oum8zb? z+^_<(!^jglxJ}6tQhZHo=zt0U6-ev|fR+Uy7?SDlOw{FSE{T}SHz;$r5w)CHS{oXq zDzYunc#Or!8}>})8*86E8TALOi1LDi5CY_J^~V~H#@20_k7&A-lJzGKx@^+KLKbwd zay?nk_H&Zk?w;?NmM62h1m_pbUqh>Gxf6B!0ToE;-gUjm2X|fS`4s>xqOI=v#aK9P zC4xdO&)c%Oqbv@L`v)p;_Bxq+*>Ww%7XWnXk~tIg2fksd(_PA%g=p$E79-+8>FFHJ z;U4QP01enRx_MOK%aZY2`J7~kB3sb{gu7$A5sTS$xvDn7lomz%v~mfCZovaLyDKz$ z!CZHAtKRM|vgt^-VoZFS@Ad5g2V(g}-9-snrL@7NkRBU(1FGH{l5!fL@EhJG5XroMj?bI6q754 zi~ZzL6PQcLFC>*?gA^bvgRGtWP5@_yfk|6OiX@DugL1l9wezrE*Vc00TDNZCL|>E0 zwce9SLUeQPdcja~HR|kjasL}CVh*_PEeqk|%dQha=)DZm$W$*W)S0vzoWg#s4CJ^R{J!oHDc+g8P&3nFKfI@Ia3)ohrV|tV zt^7j{`Fy8ttoAB@SmY{#Pzi1IJa7tT-97!21LQ&ie^?Nv!k9%RJNHYeUhobh{3L z8WA4z>@|-gy;^6k?OhAaTTBtkcmx#xDJ(rwH6XBZu?hBg$ zFU9b3E8RRwK4uEDyf0vtPe4B*NV~*5A7p@_D1PeBaDDvru^O5vuR2%%H5W_#XKC3= z^jK-9vgj%qR{HsC$A*#8<_f{>vyKhIoV5XhtKyQ2#Ob`$0z2+BDBwS62YiB1@>3VN zsR851RzALn8w{?JsC1kcxU5H^IU^wo@WX9*>Ca9n`WfEO;W66mBr)etBUsx!)2N{n zYW6vC73~Y9!XW>A&j26jR!~;;tk@?|kys0_ALI`z;e31+Ku+K4^d8@@-6)IS<3LKz z7tUk5oZqm~w7r%jlD$vNqZ^+p8s7MhO1zn4s8zi}6|CKQDG7jm1t3TrS=P*~vi0+@ z|De%;2MDC(v?FNr(_gFl4&mt_mrs+azF+!EFN00-HIuS~&Pc76$8NVtyWI4IQQ`fcT#T>X}G^7(@au@JZ_hSzht z7Jsuzf(fX^B+o;n<;?GBuQBFZX?KqQ^wXf5y#x~rH@Toa4gE}4`_Hj-;2TJfY8&A; zRUr`IEAT_jPcuc^{TTZB3Fb~xJN^ZT$k!iSP9xMoE{!|Pj0~=h&B6Qf7mGfDOiOn* zujsIU#RDwxCG}41euM{uB$1@r4bU=P(l(WQ}f*}?h1QXl@ltuHntS73P zSo|Ub)x0xAsp?P$@HGi%z`IQ|uPB`_e~BdAAS19Sl+r-P3ULpWD`9E#ggP~HVoMTc8%?^fTv*Q&ZgsCfTyS)50)Ci>u5=a6cToQnn@r#Ev zE8tB45&DG(^e>mbxT3bW#E;-FhfMJS;TtOSLJSw?ctP+2Wc6|Yj~HHRjf&UxjLQ(J$V;;N#W{O9gy zAxvAokJ%E=@^vGWbNQhMWaM+n}Klv6B!;Kt0oj~IVK2~%Wy((y9je`M!8$bcH z+@eYD2jbsa?tm~Ugb1#5)Cx&A&V>#$#6hB#S6?bt9A?~KC<+hKN|Gf>kI05NuNW$m z4FfRDSP+H5G;JKXQVRt;G(K$nf1e^LkR{{R?K9CgCEN1B&}cl<`}<+K_bkj~4)P19 zIuT*(ma1$zN^WgmPR}`(-o!+V7R>eqX3B_6kRQ;P1G8b0Lo7}%trnt1vr5SQzXWWX zAqer+bT#A8OL`vx4p4#^!1f{K;Htm*9wiF$yPCJ+RRvFl4KTi^!<)e_M{`?tF`|<- z@vGlONtdtcbiI;a?7BvI()5KD_k-ql3-q{XS^hjbaC-`J}rmmbQJeMh=S3C+%Lf>y;Q4-J@{N|vNFh&!LW6ec_QP7$6VRCW< zeZCd{rla!T%>CPd^5XVD6go@QJti)AmBN);@C2mZzYD$ee3osRtJxnePT8~TIt8@@ z%-qVUMS0@Kr$ohM+%f$g-l@13P?aZ(J|0Fkw0jk-*)3%g)YII2xO)e-d&glPeUe^n zlGz_457~|t`~Kdks9v$qmQUYqVYy>qxL0?aURH|A^1&buAS#8UoH~uyH96heYB6(W z+rRmQOG^b&c#s#Km@pD4DbAV7;};KomZpYULCVz_5_7N#nvpc7v-N**opD(v<6wjL?sp|6?jVXp7!5QrqFR(Y)!EvajQ zwkFU)OE%DXyr1RQ&c_<6=ti$3ORI#_%q{#uMw1xt#^>|^k`EH&ft0$G(0l*3+&(_{ zAOLp#=&-lR^jN(8m8`BLhsUGYBDjx~nC!ar4I)sm{=zDLJj1rCxR6%b>QN$3Lz`v9 zrZi*GqWsY?93*HUw{(`oyVc!RFG6p2dK+?{hYoisY!+(Pn;Z4L+nNHQPd0GieHoK& z`F&>ma{KmIAC0^F^vAi`1^P6@l6Sqw5Ya~40E;Vn*yt#-5o;k*1JbI+(J||j5@AXf2T70c&<-vt*pF~D`N~sawYf+wv zMhh~Dmtb8yO}yY*!5cyOHd4`$mLVZO&!5~ z#{~$84jXS6pk@{%S(K%5@x_oW7wxQO?8jOqlybMSD8(JB?6{}q2$=seumQk8%!i=< zeuIVQiea9V4SMmLYmaLCy<59Sjf;8X6q3~4!O&k(tHuw%)YRk&?=@7ZKq1r=mxAG$ z({vtVW|~ellT1M<5CvC5jF21jen5(a*wwUGv&_t^+4bu6F<8`cgZD(zw8Q z&COwC?9tEvjf+4^P?Zg>?fp+*FWw5#PsTNf8mKx}7qKd7$-SEiVd`MTC0%_L;&!D? zhL7`jsjT@iLw`5~iY**-(#euWIQFcM+uL*frX#z+m2q&yWB?U_`DsHtO@|d6@1!z&Ntg zEalXrUtbTTpC-{)wYNhYR{iOX1!}CV&f<-=OlB3Os?<_{aF33Me%Q-Fcwn)(>Wli~ zKyuGnZJ4>Z^t9RoaLD|BqmCHjtc=7~Ev7&n!xl<{tt<=gN97=1#M*cPl6dJ7oKnEW z@&xHsAXkS8`B*a(h{5(CZZ@-1%)(yMy-YDxxm%34az8$TEx6fpKkXNXCJ)222Rp`K zatLG7E=Z`7#lhc_ybEH2l_@{Ce?PK){~!q&Sc!t7jZy|m@u?8R8#xY^_f2bWINlih zZ<{Ld1?V;7C=Y)49q7}i_xHiEj>o@Yh)*>^(-h|J->saTfyAAi{ej2}Nu6}`Q0_MF zjGcW$NOiLC$sxn^aM#wvsVusk?$6)TSk@b?jf{=-jhu{~E?zsw-B~7H+gY5?U)Sx& z9gBZ`Li-IzT2U^*Cy4f)(?do7V1UH@KSQDUO>?!vKHAg^vOk0U-oN02+bYbe(C}XM4EJ@EztHu3r9; z=wwFLP42uy5hmbE@IKLKKtFE;{!-iW38!M1UiBS%2beCu238MPb8BCZDom_{O;qJ* zNB3Mxhv@nT>MRge_UHJOIu0p(A|`1<-Tqw|+WNw3AuKb3>+gRoTZ;gaG-+%%jHJtS zaKE$YN-2$3p(dJW$nrtWA3OOVP6gCgNn9m9b1jfzV_bn3GX06Zb$g-#Qb)3gu!s~4 z=Ttjz9q)`T=f);haW^heM|htMb67kuI2^-o&2y4~7NHF|M>3&mAz(TT-J^j3wgo{v zI!Y~Qc(_^2$#aLxcAyd00ph+=lm*0BuMpZGwjZ-qPK%c6iK~jQjW)1=>DVOd6MgI- zoU)+>dAKi>KEMr(+pe;+DbNY*)f*!xE_s+)6!P(RlnieB~)PP38%>v!Xa1 zmp^R3Ja0*5Mq-AIm{*>wz_+Vp2LD)vtfLqo@AONq3b}6ZdIwO|y_yA8l|`S}#BH>K z?wDk*oiF-_)Cmjvc*icjci-(S6$c^T2forLO=~#Lwu?0p{f`tt0cq(k%OSQcF_uE! zQSrV#Nh^$ze;FhwXXq~Q)Tb&%SDbivs_1N=^*2ja7TWkR{-%5Uy38;@>s}B!si!xb zidp$Q^Uf=+9pLixtIZmGJmMUN2F1DV2Z3f>EZXL^C+Neo4t!+ZEJ8>&>>D?=iF2`BKWbD%%bgKAD>zc{t{pE~o*@8b;4Rw)!u3t>=Q+#d1i`6M(> zOxZTisgi%=V311+r*UCLpDJ%m6Zkps1n#B!ff1 zXMo?Som%44l5_lQd36sMkzmYUY7LOYEJ-{ahVEkecO-hRMu>ROK*vwF$K05|4!l)J z+M5WR3`y{Ea^Vi5^5eqgcU~B=1|{?8sSmN?rdIXTSJy{rwOPZoUZ7p!qBt!0zorgHq4<6n~D(NgG2nA8_^@XCF# zPNt5ZNNf(7>ssTDZUUdE&kkUv*_kTq0-LDd|0_PlRC-Ec(7H%Gde&No*XX_pekHo1*% z85U#ixV*ot{mz)zF=>Dccx>8v0fM)Q-;F05G-w5EWRe#o0EdDZ^prmpm4T#Byt~+U zameC7W)-l1U!OUMlHpZEk>_o4L8XRD@L7epYP5A%wOT&bb2p6n;kUYedM*OR6OazCXV9DzQ^JIq(=NtWEn zwyRt}(8d}X0A7FvXr2i;uwNyDE0HcyR8;2wZ1@L3rx&kfQM8p~cQKBF(z5tZr!_dQBjw|^HtpQR-JRE0?`@ZUTgBN=nQ)^R&J=2y z>+n%A@}Zy@_LXUMc1@hbTuqO) z*=q54ZWz6va)guctOSP(^=~dwv@AfaoH^*tX)W)0-_CO!0*^w+~5T3t({B0fhaq%@q~Mn1prO}@C`H7G>!@^Z@^A}{ywgp$fb-o9OV*7c~6 zDdk8C6y85$7DGrW6(Igo4++38kLpfa!X$wja3++bplbI(Mnk~q#r|uke0p%R(m9sQ z#ti`MIlPoJsBqH+TCzTL0DNS{hw1Jkqka zIdY=_Dcd+@) zr69I`t~VO7(847^i1V$%Zlj>3>XtV_Hny|xBW?a%t*T#ZxbJTSJpVEy){X9o37;LxZb!>blt%{4#s9eTjX08eKs4 zb1GAcnH!<97I(09+dTp%|N0PtxS(RcTO_PQWA-$jCX zSfKSM5&`rCl-uirp_)F{n3$hcTs@m*Q!?uHOvoe5dE~tdjoiA8MiLrW!oSs8r|reA zARZApQslC@p)5H(sAw5ygWRJB+jf8GjS`fBqx~7FF~LOz#52jnIsV7$Po}`zh1cTOuI`k}+cCC|x7@Sz0hxf5t01!9phuZz2udT) z1tmwA0e)geV>3rWsWcx^yynZGOfCY@&6nhrs{Xk+Svv4LNBOjt3UBvpxqC8vw{GB7 zx>N&Q`T>85tBj}XPZ??J(3&}(Lq#1@sfT6BugKS<0Bp0T?g$V5WqIwF_>j|8dKdTR z?Hg5oIGl2hsThd72U=^3+*qi@QmO9ag?=(S)AuBbiAS&Hn6QO*wp=7#=rZAo<4Dth zWS90XU+fU#G??^Jez0RencBJEod<^@3`P0+u-lVWYGQNX9fOZh1#e5M$jr?#?045p zIP9i^8(ji7orbCWOH)RMs{8T6$O20T4mFwtn#W0 zcH%)$c&QX+{uEaHHGUthuEL66@q}jM^m@TIk9*Yf>yxRc4S36MNtb$z3XPSK%!T{c zNGwtJh%koiS6+9Wjq<5wYx>8BpxH`D+7%`-&R;2?}ki0Zvb06xK9cbn85|UQk_QTFu`S#rwTIH0SA&YfaCRU4m>xQXo!znHyyTo>HJB~yGuylOn&tFo~#x@{&Ng@w-K_uNxGF&oV( zLAJBD`KcoS;!37c?qbWh{z3+%KG-lTb{*cQro0rmr&7g*b>qbqDS}`5W2UxLpDsl*TW?#r~MYnUY_ISQKoF7P-?Rt4#X`@SqVl?&9c>*p_@->e&~Y^ z+aR8gL``yhSyQwn zKedRq<8p$-S<%aGNc*2@*4UV-z# zr`)K|F3i$MyUWJ8$bDz%_3yj*Yof0GPuF8P{B--#b2*(3zPIRt5&loZ5+QD_HLX z0wUSB?UVA|J$hGxkk`vyaIPBRI$c-1f0gGW<^KDml>RsxA$;!zjoq?m3DCe-#U?># zA=hd6*~_r>&tz`BYy9C_#-5pM&Akba?yMJIGuA3aOg-i&Dd<>pv6$1?d_lq93F&iq zk&lD8W9gX6E8I3xXpG)d{WBZ($uu!n`!Fgb%omFs^Jz`Vx{r@p8psPa*I4opGhUBB zK|)eo{&wWLT+ROc@Rl4+4m1-glCK_m>UuH&(swakF%eNd6MwIa+4Iu@f3wB;_rOP4 zU?JL~5A6X;8?&?4)>ftYsn$+yQFECrGG3SljPgJ`3EMu5=PRoBLpntG%3_Nv8e=DS!>Up4;iMeLYE~t5puslNuC| zWlSD@bZf%jQs7=sS%M{K2_|(cCmJgkJ~->Dc*lrfjPb9lZzqavEzw>wsOL6MLMGK+p8bt46__X%?{K)%6(oOIl^585fuTHp(R8G#SmL5;?%Or};%4slU%a|49$To7N|P|xJxx(Y@wP+w7w+C30tWNJ z4leK{tMp7lx$RvnIb!^!MKeZ12*V+6x`P|;Sx(CVd!`Yt3dn#3J71Yuxa|$}Kb-)} zAg^rwy8!hcBd3N1tae?*=t?jwU*E%JMEml*UV2xTPblA1o2r;_{?FOtOX@3G$O1IN6TuuMzWFoh_&!V2C#Ki^RtsvZurnK+h~ z(bO#Jy)yN!5uT8l*%R!6N4?wJsN4&;6hpXkjnkBg%&>hsE^<`t9gJ6=)p^+|LC%!@ z%>Lz9lEfEi=_iKLSZO2!`8Mh)FE^51Th%*z$0*FYfdDtW*$IBCVN;8@eoOi-J=7%3 z-9tP4(YLis-Mt4R<6%n#&n0#wssfu%sX~9&20;T`qSt!^rSPhWTn^1&Q5Mcg=@o7)CL*en6xGxivRsG|^n53#6diGqHawx535p&ul+{-27=U$Go-EL zqpEQ)=({mv+2NrW5_XAuVd~)NitDE&7y7Szst|)q&9k(Cml=vIgS38gwz6x25Es*X zd5BaVmwc<&yd^J;dl^!Y-%3@wea1#A*VdP)KJr=>MIFA=tIbClqg53mm zG9OWTwfk*VbjVChTufbBzP!m226<`VHq5>yf7yaml=x{+3T&UOYY24DcqVS7@wwrs zZef*WOh|>vc_3w33;D{KVerV!HBgFRbh3-R#$CC>L)@|Vjc2;@SSUrQjBQjcCh|2j zZ#NO#<#?L*$B{-!`b^5xm{gB-2GURSf!?}&tEF5Tv|Vt|;hGc46w2jXS=FNdc$$CA znaLNB;h%3Hd=E(s3+7*BQ}Q5)%W8X3Qt=XujR|&FgE!Z1mW`sjR0zHyD)k9_3w4zT zf~Q>Kul78ln)8Q_Y%qa=uAuZR^&ntB= zxi;E)`*^6dRbEjroi#--+GS{e?o!WU96JbLL_q-&(Xa~_$}!={<( z7p5w`rar%Q*5`7WZ8-tz!py~B30NCHx??n$yry!42MH&=q}UWdYqtA7Z{$xwI2(#Z zVBxRPUG&e3PFnIL_&<6RlS>VhfoqqPnZ0R;7M2$Gr^m9_FLMt^{vUK(LIK@r$J4)m z&zte9G*t(mJ)?TQunWhMXX)yv12CM-UKjyh5eNl`Mqs0PKDV(cRa>}=8Nap`yJoP- zp|>tveSzD% zSXOH$e*XW7J`jMAebXE#a%>hVq7338L$__#=^#pe2In+qhbiRyG`h3Y94lB>9Ba&F zQCecqCr*5KERxbM;2tYwS7fyB&DKx7H1BR^FRLesC`k;SoQfUae^M_<`tg4l=)X$z zol@{3PdXv^s_KlOjJF~ZrYd8PudE+g^pdD=g1L&PM7|d?yL<SUPiS5SfhC^ZfE=o}@j#2gr$?9fm}OD4qs zUpkB6TOZ7OzRx04dFu|SI=cQoofs||>9c`2`V|VARI2vd9skJzrW;UgIL=c&=?BP= zHX zc{i1z`UuIXw+-+07_%(WYzN*=zLSVXD#=+0evXY69zx+geG*WWdR)z!>*a=RR_q8< zwwkjIXWRF)zq;N86H$KPdIBHsf-)w&CR$M~q<57O3F)BFjw|VCS;<*QLa#Q`T~AOA~qu$K1o%)bkZd8 z_we6o70=LVew|YjM~>}8)++YLum0Zp;?r6Rv8Vap1$dFxaa_65(g%H&DPU%dN$@&C zUgBiIp&WV^81yNR%Lq#;{iMG+>421q<}Uhuts=tHg>uDuP>jkJ2W-?S#HS8|)f^!{ zVVHP`o5N!(SL9ogn&8`YSR zlzg|>W9B-|?a^eNH+0{X4&J0&)n?Zxn2T6bO)1Oy z5Wabau+}6=j3YfQY(|tU1lm@(WzobEp3qpCk(4TO*sQ0YD^#H#li zKE$q#?U&3WV?w=yJ+q$w8Xcw7fwh#n%TT_B*#I;_^E_5kYD_|!Vq^qicojPf5fUz0 zNw>wa$T7xF5wwOC;+*SVNEEv%rM{g~vf|9TYIHuMb!l6EE*-HrvtjfpHlcB4y*XhE zwI#^y$|YLTiL?C7=+<0ZyRC7lrj$;%<3vifb@OTzqrOU*-MobPF+(M@*0QnAgiENg z&Z)a0jJUh2ap22-`@sJ6Xq$UPUv800a?i9zO4<5S|2EN+-6O}GavOu@U1e^kF#@MNM}Ve*+vDX!&Z98PKM zEEPhBProWCE0*{*K0f2Q#O*xnDS@)s%i`$HVV*n*acCN+j)#rzzDqob>;=7r$^#2( zuMzBQBEUfyJA3P4hz5p@0;g-VZEj;gD0_?D{0uD7=4f;Y4#ju6ZQ|fStFU_f#3d(V=7yM)^f3wAiuoXCYL^>Y9A(69K$J-k-dwNrHCO> zX(Klh^alZO4=P)aX+N=*hOzw2kGeib+w{Abei!uZUk*ucj6@M5Hnd6wZFy+1(T3Jy z9qQt2=fPjgpn!y3GA)^y7oVM1m0tH*7F9MZ=Q675RldkyU=OeaQdSjgjOP#HKUtpM zZ)l_>1*1}sOqX(bZygvHOA+Hkv-q)gkf}CWOX6KoQY~aKGbJDDjWO^!U8Ol(-H%LW zgp`}-Yj^97{L%7-2eJ=PoEq|$adBZt(@5JyTSLo`eGT0R;ZwBzMs6qF+49OtA*NSc zjDFpy@WohJS{|+RTLn=maDPW>B!9N=zRChiN+m+KDbEawwg_Ru_)u9*3x?kLYN4dl z;0YI-gc{Y|e$I zBmbMmrGoUN9yVNnlFf(uuwg`AdL&{tZ$>Dv{$tqp(jDTX8`jc!_@}J|-_2#=VCY z9Or&td2Zu$HCZRC<+Ck+B9oHAYl%!D#;=AZvL|k;Tqa`Qb-j1?mLO91z3~CGyJ4h> zosCS|(G@Q#fM9ED&5BW@6_|+#h)NgPVT-ekv3<+&^`kBrNTQI%t?#c$PfbO&1*6-kDvY1)ArR+ zLONtG%^jf0i@HjN%HIOQr25Sq#USQ*w#su+B89(4Pn?L((9*}y^Z(;WmH2%`DH5Zw z%{(oH8Z#(?%iFf6*$om>M72Krnh~Jeqq_%>Ejq8lZ&=vqFBCDkAAR(J8`JtL98 z{;Z{tj7E6y0W8G9PI&4{QGj*I*9tk_=H`Y!(9I+r(eH~kM8l>OyWQafbz9F-s~$&B z#{}}A#w&BN*hr|pZJ@CQY_$TEpYtg=evyVuOe@6Wvl4;JF0_C^ADJhGXY^oedEJrmkY9hoT6Mh;^r};uf;aIfWK63D}vK`&Tiz0Vv+xQoH0?BpNE6111juA z#zOJcn5!;wH@WvS*dRf^Y(Q4%eP_eH@IjDP zsLQqKUdYzg#Z1+OL76nZ@^p3>p0+@rAromyp^z)lYXz=ik6O4$U222G*X}w0+hjea zDL$H{LOn_H`E2?;$nz}CSUqt-=aV}P+X>5t2D!`hm;fK9daT02P-v2Xw8 zN0M-~gyj~~A*BlVlV9Kl0TmH5NV!dZkcg^I0h#p-o;X5d6ywI=fvAMpPmO^N#Po$p z4+P46RC2b{LP)3YiHr$@7C*nuDGF%03OWY}D`@XpY3Ik?n=K&k86$@B7V{qVf<;{| zxQn%FS5%3m6NQ?~ihv|2D}Z&*VG$J|BFPJ6O8IZjTxlrgkXzp`kV#{+dZWr&$#8pui~S&ai_hxe_zpE^iHw50h*wD#nKNV&^1576l~JwJ7azkO zIN-CRco;eSB!4GrlYt1fq8lp7MhWNX%tV$JSn5%Ko`mt8RWaK_HKn|$Su2^GWQ-BH zz+WRVA|RB!SwtxD-$JOu#XwHK_~ybooO|O_Kk($xBd0$g212aB({AFs2>t%WnXkFG zYmpj!EwPN6N7+SS+!^7aiH!B`KYSs>nAbh-`ZYfANPyZi(x?3Z0DPSZ$+ovqp%hEz zzGFd;RVpx;1Qyo{3g%5*RzNwujE~qp?vK1p?tJh)E?ttpcb5b?d1U-t_&id36CVC^ zMI#<0-#5nJknD%$;mZYn1RYrqyQ(BGA$@y)T^X32!@2Ljc z?w?>NbaDL=@*>=>FAARbE5{vnM)zxf(Kk$?IIo!PNosgbbW3e1+fYcukuM2Sw+7-E z`4}P5dL=>x;--Gsk5u7^9e3I`VJfy*5Zf_dPdF`AHW4o7W^1IFlcY(vhRL5TwlG6< z?^iIhzAYC-lXv|hpnSM@kjgj3uDF0#B{X|}yqf?Im~|27h1ed7vWXFhrOM>JnYa8w z${-wxM$kuyH{UuTQBV9wIadt<$Z7KY8;6iI$em?h*W^LG7P0F`nHGmfSH3tz`GT^$V z#b$pcSu4SDMz@mw^&lP&W2 zu41-u-1x85qIOJCnx2i|a6SX-bJP1`%zSWCsw=|5oc>zF zFcUKgto&;w47yu(5BdcYC%j<1E}}sy*}`cCB#uy(6C9iXKDuTg&D<*zno9K>Kebjc z30`!)oIXAc1}#if26#%mth@9<__^An32rPb=hbbn1sd+jracWU<=D}>+AX8l znA!R#eX}}bvjL$VDQ1IGMoRr-t@habs3HuS4AC_tG<{2ul%2L&GxaL#lH53jU=GEo z*L7yX#aQXpph1e8MH=8+cqPzaFFA>WMzGSo-R%=FWjn;(ZRAfR6Q2Tq4-rY_;!7=2hEG!WHW0&y)S|TQ?>QMmF3`8bnpwuC^W1 zm%p4B28-}u!5wpsK@61JdqOXeRGzU9|GDT2Ft4@BFjpIe_#=AL%-5)~GAu|@f47vd za>9d6(ot%k?o0HB3-3?B4E}?tA7l9Md%bhl4 zfB7_mV^)!dd1!)aGDL1WT3JO9fiXjqu}TNuMHrXhaa^vdVTLlSH&vub3Q2`#PhySw4o_u=P5qGq_9Vr%+Q@HuOdh^>MO5 zN+sa@a-Gz@!E$wOQ@71ByNEjUn1Wv0Aud_QpTH35v)D_YQH)da$~7xpHNkP7>SByR z@T=-Ram0K>*Z4Yz^l~yXRbpAqe|9=XsnpPL0$s^3ZQDQD344Selxq2rV`RtouEm^{ z8=SMw74?8S{lrS)O4R5UlpCq|SC?!ky{{wx^U|cp%V{b6!=pOGDaZWfMnoP~rc4S9 zI(xdrVKX{%PKwlNNm039c)`_}zZEH$tT=d z&0>QJQ?OE2*oC7LvaIMAk)A`U&q#IU%z`R(`ib>62*u*V3ZJ_3+n^^JtB%{aG!5dA zx4k(M@VHnMrAuuAwd}ic{mr+``gpDE^!42+Vnz8EY2?I(&Ecg2WRla>x>RD2t!2Dh z*t@$g{&g>kXat2Wezq%{a+O9BP1>-54%I|M2G)xyvB3~@RhKB?@WdsxP)KyY7zisk zp>HM7Vh`$~A_3nnw-M+)yzhY^O4A5l+#Z7C$O?thFcQ=QyvP@{gWG|l{pu;F83hm(^Xh}DYBCJ2RgyCyHvuKMx{8}jz8T6G6>H-3Q_BF0s8tmoUOQHoHC zi+C?2P1)QrM?f_!#P|-yx_YN6fRmrGcJ6!zv((V<|8nN6I4UT}13J`qA0&`CnDdH6 zm|WG0FPYjwRKBJ$h!TzbonM4Yehd{svj3QVR9_{L%uZCCH;i+cwLDl@-~AU41VMnwPW!G*ft^^cidgV*SOq#Dun<6`=_n3~(^T7Q9<`0hEL zxU{zWKx2b<_OoOL2uwgT;bZQ$64`gf0$mC8`5UhHD@m~ta?U3F0@~J0d(r2RHi62U zTY+i{Ps0^hQVN=R#F3sgjQiV6zhA$wes7;$?F$I8oohse8Ph-w9FDI;e~X5J>TT05 z*cMQ0lFOH`1>%8^NH-zfhN1do0UVv zved@fa+~r-gv+1=uMXS$cJJ4?4UyIss{{bkAX|29y4(O*LKZSx$?+APKQSA?V7w(NoZhfESlkP;r&!H1WBT2>AB~vvN zQJ@p;BVRs!XrApzB`l)!aPw>3HcKi*xc95wc5x>vKUdk0XwT*9Yj65iPNO4>4DFZj zV5^9p=uHR=6Y$Bq0_CmDo_#o+?w2dk5Cxc92(iFg)P^`3Vjpl^4TL3m`+WaR+t-i0 z$`+*d28XzU60clsIahdvf8H$lW&q+eH?SNP7W>hmAVzT2{HCGboQiH9;WgG?@uo0w z9H-cT)=@6&ae7~#;yNa(?MnRNKAAUiRyb+Gf~4rrP7hK)%)GtHe+Enq{7vCnn_-0y zA92uomlw|dn#?r{)H62Lmd*fGeyY8Il z`AhBx>?WWKr5M;`LGhJ?He0e?do$VFR~6!sn=B#Q$br<-lAxO8!2h^w(+<(j5?W+K ztt!-dl9&u@ox2vy-KXZ3 zYLm)6{~MC6Ev~XwStUH|ld2vpxH=sC4+LxNnLYWEOP~FtMshX0GOMGdPGV=0yzz=e)f|UBpl$wbWc^r$;2=dG7n#I!sqohb(YG+lP>CjkoUD6JHY_ z(pz@nB5LhY$^{L&DH5O}X3=b>DnM*3Wt}KaY&QS>Hg&K7umn^qE`9HLl&dCVsyN&daPtJY$74gRFk`d7doedSFuBGEiM* zEDNxuJSurAM&2#dh_D*I1}xdG;6(~H5)lqb+RY%(NoV}@YrHf6Gbn0&7eO>R2f0*9 zU0L<}hx4e*QExktv@sjPYefI&P1s?HS6X4uXzk9!|Zf11o2%OiR8pl>I_-;o@4-z(HTKR6( zA0V&i@v-CJ(XMItv%CU*QcMFY>&MM#0NiX1a}Ly%XcwhTQw!|P>JU_&6{mv5S!C1B zqmhJJ%1*i7(&QdFkUcmcgD{He2`B?o?IaDz{$2;cqlL*0gV9xoK%( zUBNaRgdoPgeu7x{({d5HG*A{$Z<#kkN-+ccD>&NO_zz~-o@ zBh*3$w{P+~9O=IrzHWdq($xqL_;f!>EZq|IZR3C|yyK%iXkH+kv`RX8iFmgxJaq~j z$OGHMS1Y7;t!eUp{cS8Mt^#;xu?)AJ?pLz0wkGB!#gDJULa?})>MGi4+(*VqQK=2| zkcg(FuKisZ9Qrp=1B@SrZDbA0cbAu`GP%{s9`wNqX{e@~6F8P~AA1r+NJgr;Ncq<$ zD-(ks_pf@&jFpw$yx_H-WW!i#ycU4|t2PhlJ-l5$q>>LKvn+v()m_IV0ci*tj@hdB zOB<4cRYQGe!a#OTaedt5Xmg*eFf~1Dl%6=eRIr+^4(;gy{{DFa8x(~CM&tEKUHh6Bn=5b)O+rMKU}r{FFE!G0%x zH?|A=4Cq{R@oq0KujvO`3rGmnPeEevs2?h-s8}<*%k)xZ;LgwMiMmm8oh5#G`cqJq z(d|!9@J8P*fR-H1M!mf}9gSWL@KKAJRMV8;GAO0cmIyJSL3Wlffxr6fu|1k8N$z_n zR{la&!{#9wnYAv|73OH*dkuUhm$)h@N(|a_Rn~`C;Qr z8nOtNO-xAmCj*0r%ue20u|^6{i$9QsFv4A&Cv;+ z*jJzm^7=oZSm9)n+mvbY{0>$3mz>6I8l#I<)oeQob%yh2G;bAn$~o}ou$}6}<^JHD zs%ic^26o^alHJAL^hvbyWoTov>pRa1G&noPz!F2tmHwa~h;!kvQyLM_B{GQOaICX_ zP%9XWgBVQ+AlP(fR$pny;E9H-DUQSv;QXg>T||aqAP269o(!cC5I|TqJn^6|Z=D+V zm+srVxR__m9-+^iBntt~cREli6sC}1OyZ8}X{m+gb!6bVQBmxIohNEG7)+A%0y!H9 z9QkG*3DE!!bfPO0`!$`3;`&0HDCMRGM4jzAz+M#Z?Q(j<)7sD0`=3N;P2x6YJKVJm2Td8X*w zWzLoFs>io?P%1WB?*;?^sdm-XFR5Om5SIk~vtC(vrJ@7gIJB8>vBpH7&CL;yKg1Fe zLV?J#8;~$|!jN>|WA^66pc}p>TXx)K$)q4z;zcKDqyB-9sw|mtX$yELl|N~x-8P!U zGj2!*PA|D+gJTudbF4Ex8$X!D8{ASci}sBcdU6v}O7BSsaqBt6#;Mn>G12{de<|>q z_*!Eu)x11CqKy4GlK2qlC0>Six~;wMjjyf`ud-B2?LcC)TvJNUEq6<7uK5Sa7dH1S zvdDQJs$v4kDFz3)vDnSDKrf*7rJzu`^c=C+SCM^$-}LRe}^90YQq`1v>veba)uMmKV>Z|TyAn9 zLYFx+UB)M8_+JXDSx3!_G4j4E{8<|)lY{yXCwf7e2ZQOivh48iMHKFV7}4dEIQM=^ zb>2dPOc)w+el7UT8wvX#ZJNFeiS#WsGnodwJ);92Cdp2z2S#HR7Wgd?} z7ZOAS+_TX)fjka-PV1siO%4e}ke-GWy%}}}%|-lZ zVHd36HBj`g- zLRWq1WhH5;czhkwkBSp3I7QMXG!0Qw@4fE0!hT9{Z@xJeO4#%mrPL>1t;+7(Jj61m(0jEo1QMBK~(zfw)=RC=neO$|PkLBz)|k8a(0c%kv<}+9Oc$ zr~qrxY7!{w7uu{~l)LL+g-D zarfuRL(ts${}0G>F!28ad8&Sv>4}jCJ3iWwVk?$y7n<4qjs^jGN;uWcB~CYWuOgJB z^#0z%!WZKK<~DG>aT2wDi{Flpq>1F$hb-nPh%Pfh>=6vMVqA)uSWr4i{xH+1#XRH8 z335v;;FJ=G8w!e^66mcb?dDYHPOaB|Rb;ap%n~{J$NwwQ@b}-mgg^@W6AFrbYVKwX z;qfSA@n^hm1gAF9eWGUV{t6)ZIuDGit@>Z4%4jIFnrJ+ff*gK(d#3Z=r6jdZw+)Dx zh(S2?N1;rbgH9cfO52)gtRWi0 z(oczP%It(4^2fXDZZY9gZE1bt03F7I68}Cyq@cEhAmVE)9Q|Oz-&K*qlYznR@urss zR&HHu_>s_RCVq=y2z%uKs26+L85oKK#Yia$CNBpLULNBBc1=AQ@KstcpR3<5t*$1QF?B|UD^lvemoDYT@EC7?J|XmMns_-=s4gySWu@9zPWrihyk9w2cWUH# zo4|c=^@xo=QUhK7jxxy7kuaS72t3*OrCNHFVe5=s&$0=Uc-?t{JzXWZjo%#>AS*J~ zG0&0Y4!hcN0)O%_)Y-f^sI*aDop(;B5~#Vjz)Nijdvr@jaU_w9TIYT+z28>bxT2jw z8WwNRLN%3h?wj^s3%6ItS8OU14(2%-O_d`>t8}t_B~y$<_=xY?d5o2!(aX{Fo@@5H z#99q>8OWbXvRL-Uycw!NLhPy1kd)GBek)o{!HToZRH`Ig(n#oeeAjzxc_0MmLL(@< zMWUAUoyClg?;_mq`;$sq4bFViSWVJ*Fwdi`tM&G^w)_9CN`9c);nI4t^Rn9rc>L^I zp&0s+E3iNJDX4EQ8V*_1q|6bIe17(?7vkbV{^_LsRy5^{8_=W)?(yz29ooS*@-?Ju z^KO_D>T3R0e{X2TPF95(lBD8Ka#)L@sHUnM4Q&Z{hU>x%EXu8jZA_-AmNJ+wzwq$u z8+0Xo-Mm2io9?9;=?|Rvxf`1Sw?susa)(%VAH9y*f6|PzGxN2^+NcVxp&gor9nx4h zm|{1nZjL{4)q0yZ!FZ#a3BD&2#|ov|V^EZw2f2myis$YL62z3h%;=gl=<3yRu)|5$ z#=8!zKOE8QHd`GIQ{Ip_xRIuvsFKp^z8?@uQB&Qm0C}G_TOY$+zyEch{6XR!GJ9N+ zwnRQI1Ad2OKnDsxyi_J8Gc1Xhllcctw{SVi5nEzRmi^Ah=FT=YZrw+ks*w=ociqp* z{RazD!KBc*Q|nxniQlPb`7)2NISInxrg4&(u&D~0Mf^s}fS!o2Dhlhh)+jcPX2c&2 zQU>ZA1LIuyCezCFHe(o!928n=+H1G%<#g*)DPn`+nuBN@f=h5`V3n5LRp|8A%!60t zmBetG-!VooNgQG$Di*M;u=$={&Z&#xSG6Dt%itmBzj+4SngVYMBPs4|#Q)<4dcV6)E zVR}vXJ$d)JnV!jmn%Me;lFiN6fu+509v2D<9M_g#Fba&+8s!N*P!4j1B%+-cZ?dg_*@FRGwCO!rY zQR^nZ&iH;&$S0ebHpn+7eR0PaE@BJTPw`a;oT*IV#c)DbV|&#I^la}B6Fgd=!jo^e zcFtn9bw#!$R!^Ca5IKQLA+H;oFuBpLF}K4_N{*Q8G`Mzq$R!oqk<;$U@yiaf_?YVp z)LE(*Yt3a2#MOwO?x|C#-BPK4g^2V7Y&|b=L9g{zY9Xn3yk$Qlue`^Ee0t17^)@1b zVTM|rfet0#kN@K=US)!lt*^}^z*20Kq^oZ%{6}Illf5u-O%1(JngDzLlj(?W{Y#myxB9Z%!UEO?rp?p8T^gXKo(uk3 z!OS*_d~e6+^V8XHrPe}E4%agfd9w1ntH>f&w?DmS7U@Po-&hw8q~BVS0DX?cEAz1& zHutBxM1<^XM%vZ$-4kLT3jVHdAP4rvgdlS8 zoZw$0QoOHv)M;1>>)77lPM9f#D`MMws~dWJ2dPriae~b=B5xtnV=7PI!kb2h`7{_e^Zr!E#GGV2|UJxu664>&pY%Cld_O5q} zYiYK*_w%)WXTC`#vZ=%Dg$!`4Du#CTVNcOlgF{Q!zS2jGVcwgO?Q(ZLVhTg6kowY|L^ z6drkpwZhjV_4My%irgjke%M(3PS{ctjklubVCLx4!V`@BTp+qO4_6MdQ7y5eg2fRm zjspwDEU*f0@K0)UkO&H3kt}o1;~ga>M*~(>eHJ?K0}A``*S~@DweR?^^&PJFI`_qb z&IrkoRXm-sEa_sUSVH++P@wtI3eNUJhDL0F&BNfySS(r9i#yCfZ)e=XF_uCV7izki z@q3RJbJVWJ*IIWfghw5nQ^JQEj1SUH9PY0`LG!Rya7LUcWuO8LYT3$@%yIjjT%f?P z@D9a1v;?z6T;)+n21OwRz_L=yOnxrq_y8n@&rR(-449`vVDTK}-A0%SFe@;u1``Un z^ZI1E%6;R1Bm3@eBR|BK?mmoQEkED6-aeX)?A*pmUftDz4RR~pR!NF=f9BM2wd1YH zL);|YDJvnT`=X5Qq%u70L{ms0Z6Ey1C2w!%rg^uN@z?O)3c`3OFqbX4GhXaR$n_WC z%9vBMi}0x8tM_|Fa?RoO^TGl1%{e8zZ@0rISa~b!6^|~gq=wAn^RyGmvUA97IzuKk zMJFKxVW$6zw@w>OWNU)bxLDg<4S|&cZC^y6bnsd*e#?q!naQxIkPAq&QvXplN#FZo zOA{7W+)8Qax+cMs^3m=3+DHDVVh!^&J(LQgxtPI)n!Hx)(})3FJ(e%r%&S8~&|h07 zp5NYdFWo6B3E$q|j-o2sWekc)&rq~CIZWS{wBnyS$5`3>U~eK!o-HXR`^q3=NkT|Q zAv`>$*t>im5#KuKus&^M2A+fx+dh*n9PImeOB*VGT3g7arm4h~fD{Un4qSfhK$f7Jid(9oJ%w&c$7l*+DiRisY0GBc2+)266ogK*gi1qr%hnW^0%Mw z%?`ulp*1Yw)ZTpH%hx72x~FmYC;N2Ysmn06VdrK796HtRVWUZlFB9O$^iEbPJ2QhF z6a8x13^Jw@ypPhZ@^1Sbw|qZRAcq?Qv)1VDaEO;CuAg^Zs_U@wQ7AS&p7@MO-EAwL zkmhUbJ0PxF4e}@69v;h-hq8%T?W{02#he}%emvP2Bu%u;*!GLfy1ydgJBp5cMCE& zmy!{okQtVQc;7nKvEfgN?1oXun-2rM^asd9BslKP(^Y_ zRYPE*FO#pVw+qyx(p=ldrdx4esA?<4U94bT-o5TW(qdGDr88R%Q5-uWRe@|JekrX0 z{-$U4$3Vj^mHFntVZCbdXXaHXph9*W@zZnLc7x+N+VWS5(?cyzyk6H8VXou9nH$z^ zLJb6JhxO6_9|Pd*`|14&a+yfriq20y+VKQ-XEHmqSn0no5bHexb{D+J z8#OOK5_MhkzxSu8E*NaA+UU%zVd#>az$-&4k6#_H;)XnRY|RCJ9HHoPDE!E(NFL0E zqH*pVD3t}9##wk8B|rhJ!IN)&STI@;7x?W2qJ`%0!)veANx^H`PI(>A7H&HzN)50M?7^y z<@}Sp>H@g&*Dez)j)JkbK(9 zFr@KIw6&r*X*N{RtAv5cG~*p%>Qh*fZJ~|zbJMWiFsIij85KBo??fha(euM> zaxJovi|py{_jVNdbX4`IMhg+N=1R%Y3Ki6A+#K{Qs)ov`+MMvItSGX-ImU;V?Bdq; z-7(5aaVyEiivw)Zd^Do`Z7OW|AmN|QAI9F{G$zYl#PxcwUIhGp7Mwd4EO7%%A+({W z+58=N7ta7rnH#+SrS|adY@EuC`;0JM@Hbu~ z`+w8|$AfGdC0ziIAa`PAo;!o`bPcW8?006kH-@$+52BZ)Rc|DFg*-HqArC?hxSl;l zz6F_KgGL{}np_wZTZIO8wKTZl=<9xjCd`YI*mU|u0n6aiHzQ~I9<6K;z+X>5pO?GB z(rws^%w-lGn&#p&Z%s2+qcwR;O5*(I3q*yMh7B@hj z7jwQ>cfZ8th0v$)Fg49%P>a#xTl>>f$zYY!vPU0I_4MLF)AN}K&i_tbGzI~4E^piI zjy^KcYWpGzD1sP8uj9r;mnJVe7s68+-eEg)NG}H=VSm`;3E&oq4UmBfn^7g#hOF(x zh+3Gd553y%F#0vc^{+!c0FKEok1i}>|E>iZ3VCS1b+sm}3UNbw9L@=Q;jmVg^sX$r zS+A{_8Vr&+$>OSic90dN2wgbnpk28$CO#5t=-TSb;x8HncVPAH&3vOI>IK*pAM7dM zxLS{H&f+vN4NVQnj8i+3H-f7SHw`!tcjpl@M-Qa#u)D->9G{MQ3N*Sef1!Umf?cljs1i-5fCmdq zSj%~vHRBg7CDW>I5XzuA2XdU|KADsmA(yXT>2#4J3A}r25e24I34}8E@x+Zs<{J}V zgfcwj7l*L!L<-JZ8Sp(W>S5>6Ty5Y5-(^+R`iR?6;ginA_-4TqvP^YG#27Wmg_JaL z)hDo1mB!lFPKcRLuE%9C5;WV>w3HfLG?1WY_C>d7y(Awh`gq7?-x&^Osae8O6m>ME znLgn7P=QJC3VHcfK;>t>zVNj7J|xY}JZ{dKi0>_Xq#GT0HLv z%>lsR=cJvD30(REfdACVgS?|s`v>`c&2KMn66cDj$&T`8ZMKLm!xm9*BKvtFmb<#(w}0nynk%AO(y7f|%v(0aUk^ZvT6Eve6W!D+R_ByE z@yVr8Q&%d9X33q|2e`lZy=;Qtm?jj`&UjEvj*mmQ%b$nsT0)2xH?vd*E-s8B8;?*F z>F`vL)Zi@#+NTmWfqN|5um5g@%c9N9YFY>{DoHL;WvP!rxMfJ6a&g;U|?sCeO z>v^?Bnl8Qb)NWugdq1;&cx>$Ps-+-^V?qM{)++Cc=sHi@5QnCzC#f5N-H7}_NuO+Zf)ZB{4NxtHuL&Xqa)6(>D(x0pgQq<&8TB3lHuEaR|at< zV^TSC$gdbJ{AnMJzT-)^LRm zyJ<{QXjp3db92E&*ke!~GepQXg>k9*lVnq9D1>`u_VJL~ z_Ob{KGZa1YvJ1k`JmRaIo}2>(Ss2F+2#`D_j=yZ$I%5S2eevWlg5>ED0kf{&!;VME z-;HFhr(Okj!?`OB=37{Gs0Q~7te_fJ0TiJL%|D#|*RnO&Z<9I(a<4kXcg9llpaj-D zVIRI2?L2=e|H`u71)jytS}opBK@)*mFRPq`fXDiL*` z8ImnNNxKxQl-+*9kU9@G@B5zc?N;j4J)}l)k)Unge#h6nsi>CKJB+2i(1SLu*ar;z z^Y}nuP`l=pbKb2no#FjTS&GqJ$h%+?GC zk2@@^cM?X(Ej60ILabb70+x~8N$zH>T&Qo>*+A60`g@2Q3hUhM7Td{p<-s=TngwCIX@x^H}n}-CWN`4T;zpwio{H_ zSy(3Hf{N^KOAG(?FutjrV-JkZ?qo5GYbDnib%pUgwTgwX=i!fqBU(b!;Nzs((g#vl z;$ox$jEydl7c00?04tuu*GoW@l;OebAYzL{#k4pC*bnYNQ&x9_M*fFLO~GO*p@OM~ zk?Co;M*7RZTod6gmtcA02q|lJtQ=nAG^n_Tr_dbt&o*u)q}a*W`3C7!lso*+7LMl+ zS;eLn{LY5-9Wbwb_PM!Y$D@tob*55v@RnpZ3~PdtWT_4F;^&^srlqo^QT=5N0aN2d z=!^#>{-?mbT`mlJ#0}w)Y3IC4z#%-?m$-qCr0A0TT$_<{HZ*6o0A1p8l7bl~wPj8h zaDwt(^0rE(7@;M(w31Ud@s+(towT&~s#dt?v6O3@Lv&0GvEWdSzeYZZYnz4Tg&NzO zHhk$3*Bikr zp4|tLLmB){RuOt#XmfL!+yZ6OrDINURj6P-8OzmkU46BE#p0-<}JMKuk+onVn z_UC?}$d?>T&bevCm#W0$>C{E+jH5PIwD<2SLz$s|+BsEUj(`j7+~DIMq6LXEF7u4q zf=5{`xO1a_E1n{!jOq68rM8&ZSvJfvB2r(P1EOEkaWK#kq$m!2-q_3r`%{*j59eLv za;6b_%2Gg2jMZ}~cdYGK(9U8eQu$qdSXgiwR$=u7oVC(`?vJ9-?!BZe0oqfLngf0> zlhnc+vUyq{lxUrs$h2C>r~$)<#5s3YunyGfJS64n?@qenKEU11-jHZW@BlGp;&#n$9uwqw zTyTey-Tro~bSy^y03A9rvRfMVBAv|#vEfa~wa{kLs?F>i zeR}pvYusO8o6Ta5lCyM;7=JP?E5vYk`EXfRHW0Kg+b_lr!den_rVRCelAz?+TM`YH zdGyHr>4LHe)7ktPI6{M-tVIXLKl$WH{2ZUqlJ<~7o95_J>kvAEe84M^;5h@vjIwjZ zix)&R#Guss&`9p^lo0Kk%shcSO8{7}fKUuSu4CQN(cgxdb&L?!Q?h z;n(cuva9>cj(Z~OTz8^sQa4M)oy(dwL4(*F4u8%FJV+Ktrp#|sUHL3eqGPq?zw#7y zM9u8hBHt_|{!A{tcijJ&7BSOZ61hHoIN*R(6ebVB{j0wScj&5`Q*iru2aoL>^n;Hv zr{{9Y1#o4x+GfNYF`1Itr727vT*c}{G4;X_W6hke_o399MVPrMVOoWbh5o@>?eQWeEc%PT-UT{BfEaDZqT~Ff` z#Cy9{;JKD4D*8TNY`7FZfiU<8Kn!Gso{KF3z}quZXO&}69}{^(2^3FH?jJ0*Aj z)7tcXT&qrYD-p_Sgg8&1wg~g~DKkB(!W1ECzgZhsB{1}B1~~g_Bu4RX( z=!7-z0aip|IQ^c#x^Rm0viDFD>8Vmah*QJs3e|a{?cz~jn^-b>q<~?*#s$J_0BW=+ zGLZMu{8SjZO3Nxt!Xu}tEBo0RlTkfu@lYbN#lfkU_fy#@3m}mF(bE^VNP&bm`$N2> zz(vd9ZZ9>`pUoU{b}K)=scD8QruzOZri{&Wu$H1RM!VqlYLUMSpl=rV<%%3D%7|5J z8-AIMjJqPBWc<4J7g|%~)PADVuu7ipE3lt2x~#w+Qc)ipHKgXMs1H=CLkbk{hh_q8 z>cdh?LeQ+Y>)Y|IaTXs*{7)C?i~V#9xd%-qi*fYUzCF}mQOkvK)=6!uG_6gS+1?ae za>xPfNjDj$lc{;EDZ8Y5^lPv-17Av5$Z{2Uf_=d6_E|H%Kg$Njnkl$mO^_o;Yofyk zsqeL3%979{=JWK6THAKHJ^MKVpvt2oyO7J?7Q%xw{>!*oi@V5@$=*q^swIO{SesprC=uAGNmS#z&5G9`95Ip-XJ{hCk}qX0E{;ay-8OxTKH+i zm=12K-v|zV$$~E{sg_f;rL@Sy+FG`0fjpqz4NuKjxXXBTdMGB*M|vwsPSazjptD(x z^?6mfKk86%C&Uh&n9LT(OzsjCgJ1-28dFzUGa*{`u+CIhg!2Hb>_eGRk%s-NYUv55U44lIGXHzp#w*QQRT@cIlQpVR5^-&SX=AEl<2sLk~y87Zi9Rz^wIM&|6SBwe*sQH`4&~6KsMx_ zh_1Hk%?X!?H{%;>Y1)~&14*JD%1_a)uJ1}-9x$GG`^gG0HYy=%t3lA^w3Mp3@!A^T z#I>4AmyO(=F5F|v3RKTso$-Pr&jbtFrCiKsqf$dO*}ZBLpQ7ID#2s5F@&k(Etd}_2 zy%e8f+)LS$KYBSY{lZ;(a&uGy5k5zUjwfJlcvQq%W}CJ6YHH*chOu855X)bWkA?I% zUe`{UW?Y?{ePWuSXg;>zQrzr1TMz~=LR6KrU5Szf*QKa0>`Gscw@W{N6i<4xN|}d^ zI(BoPoV;Au21k&n3_Q#dnal$t!)woFqECjB0dXgJlFIL33Q`8dY~l&jzx$#yalT>_-LC z=1VQt#}^YOS@X`%UoZ9OWkp}5vb{!b7}Wmj^!=46F@L{;z0qJYSgu9t%-+Cwgm14R zsfjHOQrsMPjQe+U0nT6NpFDP&#hN#x5}l1d_BFWoL-B0Fz&)~XJF%mJE2Lz6_vwJN zRF}MRfLAw|KZAQkVR)S_i!&L68rp*+Y40sR4P8$`{zRV>uAR=&}Sc-uRT39Fu6rrneNw zUBMs$iefDTUx00K{b=#hWYc_}RH*`19iX3|< zPxi_lE&+@ARL%|XaRT0X<2kBr+ln*>pF-I}wrN@7o9*t&_h{Pegv}w5@hI1%SSS!m z#e>I|{VE!~%gK=$nFut^Ntn;SL;^+WlWE9nyeR&c*kiStxxV7f?rdW`afFkB4Zf4@ zW24_b0BV6Gr7dhGs5qvL0`P*nH<7H2J&Si0biTT76utp?{m~&Jas?t5>lhRM8aq?? zJ+WT7bGp2W;dt{4`UjTYY9{DV2gf>b)#9@J_0rf3)@Gj}-1uAs;1FpYso4*h$6A%` z!^au-IztA6>XNs2hC*7iR>jHHNi^NVbIa<;y=9d#n5%yU3~C`MbSx@9o`1WKj+X>6 zb?C}@Uk$9S(oK7lZ3ZB(<^7=I^)KHD=7o-5H5|~Ax^|JG8_F1TLLKD`>l?> zy|;F7>1~EaAVqxThY$gLhs%ALmUYS zOISOnYMH5Zfw%33t!OdeND`<^d1NtDFYVW0EnPN~$neg2Hi^Nn{;1ri*)`*br6EHmPKyO{Xt5g|(m0 zcS-@zlh#>UBrO#^>~vtv3Yrbl$2``O4E97?%VGxuQL+&m`rIj*kc%*-^o5yl_hf#8 z`CSE4FtN}{72W(`7C6g_IeRlb)zgwR)46pw%u~5xU^J=f+DEp?l1~-ABD1$dbTmD) zJSjh-o2n!0Zf;KEej~9{H$;t`^-ih6e8(!+_u|LI7E5`VbdZ+!9qM!Lf92i=xb1uIUHU1MTmN48087uEsQ{{`MuBMR z-nKB#2z*LPGqRI00I@!Z^h=X+8vxwRpaq{2Xka{ufgg)afx4db^ij)_13Nx90K}av}Qqu+}xLBn^^QvN=Rxa zsO;*-j?!=u>kVZTSVug3Dv`13XhOMW!4`@7v@uQQ(9~%1@cc|o04NMY%LI=*u`MG8 zE$Fu#^)N2rD#{BO+>AN|Jv-$)To|PT`A@)_Em(IZZH~u+SMN6Zc?#HwfxNMMM8BvuqgI{b=Hz+lqS((IO7GGnP$~IJ6q=WmD zo0)^Jyb`_b4zZEWP9DC3S~AD;;m>2+Z{qLDPHqmv{t^OJiB*NC63)oi+ZEL*Xme#K z=>xiE^1EUyE_@dqs!?jaG;#|I?;6LedNud(Zy(J|P=TZ@-43S`8eE1uTeuPA!ys68q>vCvG>=rvduaJGkx05#=I-|RQ(i4;woI+ftALhgm$hvL-Njd zRhiqnm&S=rm1^nEC@7Fbsk^ECI9#+#4YuI)#P~$-;W}-Wg*jXIJPP~9mqPmt&%%kR zk~o}S%hs-is92jJRkSRX*xdNB*GpJ^Ih{&Y>dJF?-AI5y3$?cC&&Jy6&X|`~D^&a^ zRkh8>Kn8=;`KtgWT}Gh;0{|{R|E<8HM}-zUcBz03nBhG^UBc_+;i+O61Xe@1#_cWydu?5Q2?+TJ-UFelhOQPtX6NB!F)H- zvgqojL;vfYtZaOuK=uthIw=xrhT=9k+F<-?D5eG2Jnt$duC@?KOTh+tZLgwL_YsuU zFb)F&S1v7o>hN_1^%0~%Cku;b;wEU%x>vW3Mx}+mGc=-DxI*C-BONeeMVjxYYPkIA zWFyZP#v(J(V*j=yNoKJBvpyV=Wi3u{9WnHvdGV1xd7f_-G(ufJjq}fP_F@y{uMiXq zaZ2@POA;pm0o3*j{d&9}GkS9!Hn9r18FZ2P7dHA5myqsTmwQ}54AM+^U4z3_nB0~{ z(L|Ii7|9R55JB277s=v>;g|$sIaldIOTzB2WI*hA*A^p$%$kLg$!>VddUOoY-24`=k6;1oMsi%Gl^kqm1 z%x6`#YQzp)Ja+JL?`HhD`%NYu$2262l%J6I!=Lxr#CwzX@m|G(GG;ferz?u1Wx}5s zw*OL1T-?-kul{6oLpe|?Ggzf?q|_1L9BWLl{WAM>u#yR9FySDns-lZh{hU$meEn?4 zL6EbQ*SLpoG!q59BDSv{6xp|>`*mDzx`vpgRnDE%>CznY&VNkdKHl%4d#lhO&o__xB7 z@`O)jrT5~F2LtJiP+E~0+Otl}%I@qBd-OGc_RRX4Kx>s9%``M7H5G@$qQ4X zgEj6kBh4qRz1PyUMnL%c{3x+f@Q9|1%JOsjgl*tCg*Kywc#LQ%d-n z=kb+@TEoBB*om;pf*95vy!9klWc~Q1qz(26tB@5MHNaw*V3yS380f1;r*0doWT_Du zqNb(>2If1VJ@B7-vfXn2xQENQ!mm|<>4e8vAY1%`qrr}2H^Fh&LH$zQ)zL8@vzBRs zmNCiF(Cy?T;@J!o!#x{=V&DMsbfbJ9&`3Z{dKgo%*`mjYNVWYTCFk?(9Cr zxwT&wOHw1PetA6mZa;k`zB6B{>MK$ye-fQNdzBDaSEp*Fm6B#!AVJA!O-fSzH*Dc| zTrwc`+dc&z{`Z%B_dqT^f-_(NilJBlZs*jSq`d!M%DH|K5%ybo zAh;K`A0*-#mf&y4FAbZH&@P~og2}Rs_K&4KmsJ{(2db5WjLh85H1ySn^@wQ=kGFni z)BA2AGQ+p%{w%or;$faW3u+kQ5C}Z+U1dw9dpq|_y*at|GM1txd(RhB7?$k*0OeQW zMt{C&kX@=L=LQuuSD*aLVL4QxxjMfV{$mO#aL?!aU;_y)K6nAh@HflvT<@2BdoZzg z@*hg%~v%e{Ikl#op(#KxM)QqA3#)B*H#*36|(>JS)bZ&%AG* zg;4bJqFO63#cH;;Kf~@G`u=_wIzn0PFe`t-Dm9#FtnNyT#G9|ur5706tOVX5Dn%WP``Dg8nO!Lr# zy&wXH?hMHw49RNJxE<9df;zP|**+}NhkQ^}oJ^HOkMYJf$FauqoAYH zpIHF~wZ!hr&Fy%w`3Yg+o(bXvDFpKePym_&|6(gAQ1_LY#c~43APp-dQo52d7!=$5 zt7qa%y78i!J^q@sO5jERcw;2V5#3ZH5rNzt-9XX86;M%%;lol-RIX&*j+Bp8TJ*PG z@Dc4`N93u5HA|B+#sQuJw;~|8@0EUI2{Gq?gavqLJ`ssw?G54R-Og0ng6UT_xehq*yjV*cL`uO(`v}2o$y9tnmcRX-jrL ze>eLg8_B|wU!JIMsW-Dqa!6bN`k1?j{XEn&wudKq%k7(8^C_G0Jq5W!nV{crcOt7r zO;gj)I6_)v6-`^%!C9@=S+l97t1-LXk9|e(liwM7edNtYeGiLLbJctAQ2s}0lC-ZC z_(YLVV{k%qUmGse=Vr13Hvf^Vf2l6PX53|;OLd-Kb?GPUkNBO|o}?ly3faQ}k{tMz z?7OFrKJ9bVSntW!qN9r=#F7IE?4`?j>-7#c9^Lhc6vbjKx|QZ9TE(>yGcy`%X2!i` z@>uk6@@YfzCz zNbkr{uU9YxLag}Y2Dy$_3sd19&VJcbIK7u8Xi38JhQv@gC>wuRXa$1kss(;>#~ zsg`#wC2@r4IDs&$7%VV22ba8g)>4ih^$Y3;dm2T$1lO#0mx0YPTRY_!gpJyY15)M& zD9^EYT3E1E()liIas+UvZkq3^IMTA|CwTs$W>V_1YDE?BKD|H4PiU<7&sMmoO=+bo z4|I~ULJ~7Hp8(dR3F5}yt ztkV8+G}N0*Vu>?0m3e1`JK3xH*1*q`{p1Dw;bN70hHyCJI)ye;8%6wye$u);LdD`k zo1gJSjjjILUqfP8xed7=2R5QGIYhQ}Iw{lem@owd8*SaVVU8!<&~!vp4u6FUVm+!kLa8lmAK&k*)ZeVbbRV*)i>Dx@@sCRD1uf7R7`uPU5?Cz=-cav7~`A{4{|* z>Y?}=6L>JChG%HogOMT-D_q#yIzxd+JR-oClFlH8;jH|_8rev(?te#uq@trwrxhcMr^EU#a7J@jBt9I_#zkX5aYqgABNhnwu6HVDE~=GNFc1YlCWM1IRk&`alVF*Ezj zD1$N+&Z2b_ykmVDRNW_TS!!Kp{c@Vqy5KHZW+AIOpO?ECYRC3*-CZ6X>FzPT=e(L2 zaX@M=H3Yz^N_#Fbb`6kYN_7NPuxrfKcKteP0}|Z*llVLBf=f#%yYFRNC4J2;vHZ-U z*Kl9I$syh)8Aae&aDW)FTMplnh&(~Q1^hx|{q}P}WCK+p>=h&QP4L`V+;9fMRoCfr zM8+&rBR2!j^pDV0`NP@sjUx{qmwQH?W$F^q>Y*&>lC~x)wNHaGK3>IrHXY7g)P+Gi zl}55b&M?KT3)gh1iXjSR->sk;2<4FpYgrhfZ!yJy_Mzt{sw3idFtFNg;+^{H;D)f( zFA|~73NW;avDz`8)ZIwn@ltBPAr6i1w|Q2*Nz0_C!35s0Q3UJHNNh$0-T=hTrolJr zLFX!SJ3nF$!QR)zkoOm|SNkEwj*XM?KCSx6k-G6dm0vr*;ehxG^!xr)KGGATaHIt3 zDWDHd;dyvv3NqZdfrthkIT@kmKO~T&lJ*oqLuV%_U}mjcd= z{wEr%8U0ezGk{P8Iy^qd1u)}UtHBiiY7C>XYE`|Xj;5aw_y=DEI+XQATKTZYsqgXT zKmr~-whUpO;Rm9Au14&sbw8qpF1Y!f2%f1tE7p7m8w(2CsC0Q*k@AdIeUI0zE8@@1 zA4cq_=gA%I+^rD37Mqw}-9TpP-q&>wps_A;U=qjBo8kd~#sV+B5lbqBusCIy!KSi@ z(-H9<{BiIrQR0qw{Tao zD4{o6m=^Xsvh#8_G?^aAQ!>5X(b+PzMM6egpdVRA=2srJ9iP=aGRH;CIc7hv)-y5} zUv?J*2YbtVe1R!mvlizCXySvm)mw%dn`sQaZNNE7OcU4?Yfv4ra*#s`37oP?kn{j)E8g>)-5E{cL5aQ65Z0>9?Z zcMGeGRQ7FhPHEQzg4iTm0{W^E^t{I`u>A1ea_%Uqzt89cxRVXNhc5P%nu*(z6P_YU zpD^AI+=!mY#_A#iJ2(_Yi}=7~ZZ0fY^~fSrn$^yB{zuBy7;&tRc!Q^1&6`JS@p=M zjctHUO$v~mQqz@-iE74P*c$w@(ryInnxQbTZHJ_wb?-`lL0pRXxBttJNz-|~iGmQG zmfz`b9W;CqrOe~B)^kky*|%^8%pf$xS@7cOE{&qkuK7AV&e6E=;2;`nj_FsUw_3O$b1V-)Aihjz2(QKe+$MPZ;a38xE?Xvv z?a_&+KLuP8Ee)RTHg7KhLogknjv42vv_tAVn_Ow=Dt4j6zW}LpV`G<@Pfa0G+DM0` zPga|su8QbW6;9R78TQXbsF=DofrN$|rh}^P9yDVXboaV!91vP3wmu8NPtgI4P@HHr zeJ#Z$w#e(q3#|{}ai-k^K|y#KNMB$>rtdsaDBwQe(7;%Pt5BmE!by9lBJn|A+3-)b zbrGEu?am&t^%TrXg3PH}HYOzyJ-~;+q*74;Q~aG8&FQl>Vpuc=^wHVNJbC9zmc=!Q zA(t->xQ+vvl~~~$dKE{!Fr?89Bm}L{pD)pIa2R@YUe0km`$#1fOovNFP(apJa{C6h zg1&J=6!mfv(ccg_64`2GVmR!ko2ZkkO1SVo{;7wx2dK!T9O%T6^p5y&zNoCWw&b2^ z-6T%Hq2{6SnmAKJ#bgj0@vC5zGFFp8stDu0sb{| ztb4xH&lNOQ9)yN^=vJmqIpI!5T)-9g~73&0*cDM!R2sQ`SCChhRUXI;cOYPO$h{n4flR)HpYuerfQWoQ*DCJv?=@F@%=>}X1y zs{jr|qxCfAb%#X(cMTW{$>pv)mA!*Url~Ps^&BCk=Gd2iwUm%pc7o)_M+}RiG4h6? z^lQDxUFb!r8gr|WqE$5-B$`lFj0{amBELrjn_aD1AVULeGJ!Y6_wG{T9sFlmiJTg; zBa`67sx+6AAbgOpbT6wD;s_aVm}gvFeA#HEJ=>X->dqrHdbzw)|2*r$k@mHw?f+=Q z1}WkAph~GX!{{Y6P%q3Do%HrvU+|Y>7QHo1LneA!N8ukhdC#5*r|ijNd=nICtQS^| zqP2oNN=G=mcB9YDQifhw*LkC$4D_%5taMc;6h|Rx40B{QvPJu0&&M6vma)eU@oAQ? z)>!2O=<|u;H!l;(ngt;`18ltIJ5Nm07-nk`^rk1M3bNqQEIgLm>Lhq-s<-Os+M^BQ z4MAjvqvbM)(TF6Q#WCgtSw@joP3GtffyVZ83w7@%))zl~0MDlUp0xP7m^my<@V3 zD>VoxH~pgB#p|eivi}O}m0H&m?dtp3&0n2m9WG;NtSY50Q+54M-;)ORaIM-zo6{pNt+FSE>+`NHQt*=!g`e*+Q41e!{V(B1YhlE`_x|ddqvT(t zU`KsF8Fy_NStM&~1{(0lV9n=ndKwYLUw`P)=7?Y{DjQ)n&tX}&<#u|GFh#d! z6ygYa8i25}vI|Pd9ze8 zrgVROZpSyDV^x24%07QKS}(1kZ5;afdmRpCR(uDHMds@4XL$Uzo%V~151eWr5f7%C z`)kXhA|(2TbRAl;wTz!jgs}N(EZzl@Z{CA>`3`*C8QBWQ9!4t(gNZeCbqDd=3L$Q_ zL9xN@HFW0B^5!}uyyxwLboxx+yjZbA*H?=1VRw;z)hN}ZC;q6(vyf2`Sq6JPO z&l@2+B0=NfyQmET0k=LyET3tiY!n?3{C91kxvuRp9O6VOSomyA?;yqGmK{X$KW9)Q zLUgo4fI-yXV?-H~tO4oWg_C6(5BKjcX0ze(2VPwG9i1yCGcpXZv5RZ`9yC_`Rh;8@ zF$!RI63sx~eNe(scuFllRN;hm@GiS%YHO`E@!QW8cQyX$!osTO)+=GRydm>U$ES3; z6{Lcj{bo1WQwid~uN^gPjJTgEtNr~69}4UBerd7prd1OSTe|i5(j%lF`_lbb&I(fZ zx00l1rL82miNXApG~IKR(Bv$5=i-j%73T4Qh*=$YUnw<9N&MPpIiqQ>;&n! zZltR#804!YGWt1#e}j!a<5^ypS-ZtXRBWQ75Za`C?Lf(*(zLbXFJHl81kMSRiMs>} zI7%FKf3Y#@okHhi303g^D~@Uy?j8*)u&{=ufVGFg#lSYkS>3zyS8;|*C#Wz=I9YeD zdvNS4t~%(Q1(FpJ zSpBSkVNbbEgt=ZIKB&%+2)Myyn5l=JI=g!=Ev#pLRF$8|Moz`^3iYv*vc}1en(cOv z4PB|6tD%_@G!i2b5U%MQO6KFuM0n`0^z&&e*ztz_8QgHs7S#4`GpYB9`#9DN_0k#d zLR(O*o??DViHm(GP1VyD0lox4?jG+@$6Do=XmT2K#&?i5%d7;0g*6RW825Rf<*YTnEt=@l6fS?3dgzpQm$D}VopO?d=!;NGiUFJPC$6nNgbqscR-U5@cGaQ!IH4qKk@Qtj?PIx$DHQRJu}Gxsu^jspKSkeF8`Z$_l!(I z%ZL038S?nwjJZVmE5rgtvFs`)o$4CV58@wi`HKFMica(sVaGZ4gydpk#a`{pcVY@z z^3BD|beh=XmBz{Sk2u51&8qC|>b)#32`S{(;-(khjTgqoQ6ELmpB~ck ziTjCCuRdmP^rEuRRn0x;Mkrd|-<(gufkzsuLF^~t5}fkC-Vhh~N02{)#m!mXUB6&$ z{`evZ7T|~SbKhQpaP~$*Qcy8*HC0qz_1bNoi%;TfV=b;$UT8m8{yN-DyjNs$npW_M zbXE2xP=N=EXj$T)tuKiBauO!6gK)Du5?;UZZVmXsa6(3?zA?RD3jM?yDv3c))Ij-8 zp3FDuhgWRR&#|KNz}5@2mioY9{O)h)#6_q9l|-^t0##>v(+4zOxHm}>Jm*Rym2#it z2%Vzs^k>@W(Aw{oH?~mPgO~x}hpX54MHdgm8I4E5OIB$%2XLO4$ddODn;|Lh=Vfin z(1*(r{dK-`{K1fJeYa>j__sz*bwT$T4+vaOOJ?f8yZr6XkZC#j%9s896q>Wx>oH-s?T_OV@uYNb~Li zFNcP9{eT~lW0M2btHNv>EnjCYq=&H`uB4x~3*6$q!R_Abiz4)nLX9M>b0z`dS?tJe z&hqvegdB`S-BVNWhpE^f_4Ve?Tdyb=b;c@#-C;KyLX-{XO7&;>)Ts2yq&414}>>OmACf)3FEq`94N z!NOAIyU@InhowsA$^KQ7;gQjbmP}mT)2EDZdfnl(-k?{|m6Ygo8H>MkJQ#*Aj=BpZ zlCz46uyWxmoCCsEVK_C;RbMZ;k86nb$VK?3JY@j)$zTg1jlvzyZax*ui`~1WYZ2Br zdq-c-fcY0vqSs{kj@&cq6AJ+1(7T$s(Cuxy29Qzdpne~Y;-4XL3M1vRN+o`8_=Iez z_fiTq{OF(`FQh|$FfExT>t=&Kv&T{@fB_(k*1coojQCmtSo%X?F=&{0BMPHfHqA)D zLk*89t*2I8K*+yy1*3&Bux2U8kC2@67-R#Q)PA_T>0?E(vd(C{BRp*ZM`62f*Cm`1 z-ChmiK;TcG6Nd#nilzMi%f;}wLQ=YM-0rb*U$)iQ{^u+P^FWtMJ)j~s!Nv&oy+0jG zGA{KRYM2H3Udc2VeHiQCj2!x%%6-4>3y5T4|2~>EyNp&BO|xcf+)VG)eSh~CW$&R( zTmydnZ-@s=X$#-W;<9Ua2&a4~;v|-F05u~`Tzt7Cp8z;D$;Ubb^L^vvFZekSs8_w722f&%?-^vY{!N&MHF2 z?{c9b1w#UX=SX(amRx;ig`3$;iQ9I5!Csr_Jxx4N`1OfQfEl+lbfv8ialXcOxO}jJ zgAuyjNM%SC7Z4#~#R!$5&=)rfiu)iSXo4#bRF=Q1T#s4u7PSrzjSB>;j692>EmeGMHb}<>r5KguO ze`vYinU90j_E(b0=i4QtH~YVCKat*W?Vlz)EbbDQ*HOKiNoo=}aQ!=KFk@M;Hl+J| z7r4*h-!8I?;;UfN`$iUxoITyLW-ff|IYRULz>?l@e3X5nH1=xFo;6#k68~UjK-2UJ zL4btlBZbLVGNkERfCmV}_f~vCRF0AG#s~fN;{>`}&4x~QX1AHs7~@{aOQ`+_&Df>` zDt-JsVZQ)Z^)b9rixBn=w^(=u41WIk}X|>A=brLwv3YqfLtC9~V;Vn$&$qPMw zb!17>A16mU?@k|Dk5!q<;!OkL-{bn8BR>hTwx#9Jjwyz{N=*z|%oy=a>S;DTe#g z&$VL7-U9Co^AP4t0VhODLkQt_P%PC@e$5ZD&=~((g3-su%Lprv>ptK6am7@@1f=x7 zM`MeT-Qj#<$K;KkUTA%dPW^ku^jUrr(PNp0zDu8w+wu7K(`0O-Uf7$-IoGQ?rq|Jb zxr!<*KLhme^;ayt2|ZL+y0Ra)hse=U-wpdD*>NPD^!KV?6kyUx(lw4!3iP!ybwf90 zYKTq|4JqhNod~jzIv%PNtTV1rTz)tqUc($LLKkjNEZc-=U&?ugw10i4+kDcA9r}fD zt5xIO<#@pTg`|TqRzCL9chka8TN)_*KslrlB&QPaM0IDim6J;hOHok&+-@G9;hWs8 zB159aFuyrXulU_Gn@DzcTs0qJETiFuS4bc8eD^l`aB;dSRF+I2nwg~Uy zfX|6y{n?g-2Ci@EDi_W;FS8TZOY^I4v&71%Ymq6cexbVF@H;a(Clth-sj)6$fMz>k z^|Y1O#(%*4m{DXsdRI`>5mo1Ai(x0=TtIdyS(%>{qJ-;aR3Tg(>IgvuD_s-Q=M_)XCwhchM+G9)-=#f$^o=Cb z^B8kgJt2o%(s*ZoLJfh7QwPJKblt#)hj`vn#|0eWOr+KD$R$hE<>n8VIh{jf6EgtY zWdIH?N|@t2aKy4#KvY9!6ORxdZ~n%^lr3*^0~QM~$@{Q5oUhr{9U%R5kzlw-Cr@gzLmoHWd%c4N}x@wqFwHL z>&U3OkcbH6?WX)M9Z2PO95i({`dC1ldo)beaF5RwN7p5GAmEW=ndz^^)gVmM=Bh{E&UcsNPw5fzc4dz2>( zY_Y8^8aSu)en;u3*`52r*G^Kn?SiY5j3bnn3?a?S=0X7X@&Y9M!b`2Qv2%8qau_1! z&&wx<3QHX=lW^GwaVv7?VrOj;19>0khpqBMO4|BoQ#e0ijhDbZZE!97_!gW0pj0oz@M*CwV!O8Q``8W?NrcM zqrH%VQdb;^>YCq}54EYp)ZAAVv*cWm0q#huue(!(>C}9MoemK0%ZFl-E*3BN9=t|& z$Cdy^Mz4c&^rLqDlV5z|cKzx1^t~B?Df5xOT7yo3z8#A#jAfHy$$h(7np%~wsO8E3 z_t(n_ttq@=xtO=G(TGPnGBZ_zGij)#t<| zfgd`v&rhg5-%%QHD4$*;!J%F!&!?@GwBSPsw=IGJn38F1>$XM}qGRaAoO^%!CiAOW z5z^JbL;o4<$=C7rBS#Z;EA7B?R$1a087ZQ;oP_I_dSbqe8ODqKv3HMN3VQS1WBN2L zUR=A+zH%)^yQyY_W&o<-zMt*k=xjJ1R(N}Q%Tyv{16 zYZ_}|yJ>Q0PU@|+fQ54ZEzLl4FuTRT^kHAQ=ntzSAoyDT*e>!9uWZm}gqGUwgf=>& z^J3lQ-1P|Du8PzXq7}7LJgkVYT*}$Vag7@T=daJI%qGjqck}|IlotUbRW>5j3O`W? zLb7+W#uA!gJUq3AK05q)k#!-@#}wNpu_z~*Rh3bbLw8{_*6J5=$`P+bQ3Q{F1U@)m zcdwk6Jeb{aC({9bYLR z0tLnew>LG5HEsK*Im){yzwf9HGMWgBb>-ei_))=0t*yMgzt<7gtgDz1S)ig`JN=$H z_Pa|#THl_(@5;GPyu_ITrBorok0I zRqHcq4qc!8FhtBSwRWFlV}yIh-((W(2~nY>FM9UGNf}u=9h>a-2$}soFjG@8 z=pBHOtM89|E||Qe(~N!DPmkY|l|k~OUm5-;Z}69Ub&N)$-RZN3-UN|%SmKwh`-k$~ zPYQBC(nd~Bm}hDVhhJttsiat_u{mtkK-{=D?>i3?ZqK5ZU!4cd+S88kGM^P4&jKOq zpPSJ53LcoA(xvrbV@U|1EOLY9k%OIJ`F-g3Ldfa3vJ%2$;_aL~s`ozHEWeh8j5uh6 z`gAjHJ}Y1ht%4z7<-L(}DOnmi{l)dtPIz zxLN*jDLq?&`8g;U=p*@!Qs4l6D$af3HnX1uci%_UOff31WA|ThTRv(B7b0d(g{NFB zCIq-DA(P;Xtr5%T8v#z;$$MV>zg!t5DFh*eNQPiOq1QchqHnqrir%qDcH9VQ}tkG*yOEK z$Fr6ITgG8Q&UhG1z4`EO{L=od&$aBY=~6+r|AhFk4r6@0t-+tg5<*7(-Ij zL!;HDDW{!yO<<$-6rHiw*?I@BYCO^%_Qzf)1JxFRF|)G2f_x0Z#mnqtR>f0pAZtOX z$`!u&E#o&^iT2wf1me0{h!xuf2CHNyNJ}1ZBXBur!);nH)tcybrnB?QgM@fO>!wH+ z2Upf-Y^WiZ!t&W?4nYA(N~Uh8*}M{xP}R;dZIF#*(f99Ye}a**ClwWB^TgiHaHGJY z5RHaUL@zAdZrF#sPX*olEeJvRY6;|G3q;XrmN!3Nl@wTw6aiOjn21Cb9#hj+ejrj61X?<@y^qUn{Pnb>ay@z~v_ZmV}6g+UD)~_Ne zow`edVlh@N9FUK6dEC44ED`ty+8kanL#HW46WIS2cZNTqR{RlnT=iDW?MM)}~9pqu(SY>*}$SmMSQ_5>14#>b1f5nd+%|x>Dy!G*ZmUv^H zy52iJ_HjnS}vc&FazoUbGW;^e#r`Ik@ zEqPwjFNp<`sJW%%$?uDu&4y4s7a`ZEqb1feCw-%BU43nkXG&?D@e#qT^o;FCQjM9F z^_ev?5FgxBUFKlJ);$jpUhT?Omeh2h7?aU-=F0 z6A;0XP|!LfF^yHfy>^LZp>X>vzsu7=>3qMX+MwyHTk^g871hq&$wYEeMR4LAU2&BW zc@|rA`sC@}d*^cRK+3`SY^^Z}Sa&BX&B8f`)1}|8Yv)@jj0(=L6Ome{z#eH}^hdz2 zY#!Q!-+@ION3B}4w=b7x5vEIZ8$pkEp=eA@5j_ooaUP$eG_wo@@XdnKg8-)ofz^h;Qs!SfWqgcN7{F3;WSTFI&{(UDg=c3$gW6=Etn0p>%sZ$)AGdZE zQ-|R$>MzUW?zmQFwCgVktwkmH@jml@_kS=`u#K4IcSBN$Tt-LVsAu=h6Z^{kJgIdc{b=#_FoLSaDri3`23uHu2|gjm)x;; z1N!gz;cq(pBqk=%O`l^ddAj7Dq~7D~9S=NGGPg74fh$NBubB+$#kz-3*<=hW7u_%| zV%Q8G{;~&&S5#-H1yVmNY7Z8D_R&FN&&cWGx8~6#)Yyu=5NEvkS)Nh+F3CRhZBKcb zf`WW?T7=#P$%q0AHb|+ z)DWWyPi$p)Lj5IYvYd(h0EUvf0Vrx_HVY8~%|0@PSRwp=IFZ=x%QJiq<6WC@Z;LRuEvW3#vyQf5$c7Dj4j$U47EwZVf@g;!HQP3BmcK(IlOvM z%uER3?*zpf>*I;Hzmo-!R|x>h@&>wR=HgH4XREKigX@VcM!c}B0s7A(Ivz=>DcsNIROrpb@Gs17*udbh0gWDUBRj*wZ8B=_ z2(40P)(aZTg4P4Ynr>Zk#YyhiiyklZS6*s05v(ukXgoxi1>5h(G!zGF}yZwaU-QgZKO5-AL_q+i$Zkd<^6cV!}8YBad}9nO6sX zf%$l&uN-QspB?<1CAm}x4!`?~w@~9{ zC!}`OB8(-69xpG5Ij7p=7Xb`L&K(#`$~N-v&b5(E z>1W`YE+gyS5Y9jam6&(`@J2O6zLp$QYhU+%dA)7_8{uI>q6LeTW~SM6H|XsoG0w#d z9S(+pt`4S>!Bda|4n)U}5V1Og^AJNR{IeAk4y^QgxcPOK`5>9y(YE%Jz0z%oHmKftt+XM_$k zm*>2VUJ&DM5Ne?;Edpz>Bl2tJ;dOemE{HVOcQ$&}>g|5-@FK{yZ(4X9!KqI+VJT3N zv`spi*FvueYHi?3-9!~cOFoF3_+}DCMUs;R@6Ec4GaGKx3EnTMEa+E1p4%RKVfa?4 zdB~{t;EwH#V5L~0?(!OfN)$3k{2sC5u1wlkR zkW4f`dS7i(Tk$SPS0Fm~h5j5amc-vzROBA}wX?x9J=T_})Av|DvtHc#ggAAG=iK%q z&{wuSSG)8es*if9ALT``y;+0qRk^S|tu#5A3K@uAziISR1s;}U97SwGW9bSb%FRw!G_ z-S*VJFF?z9My^q)O;+g9)E!kU2$b0M<$6|<4{dJkNVsivO!LT0cO2jqs4kIVm)g2@Ow_NuS-4tt>-|9M~nHb0xU55$O` z_*_+%ee6)u;e;qg<#xMI-81S+_I0q+`g6>76ksw;)%ol~fjXf`S$F%u8xymjmG5f* z&0Az6g;Y$x`p^sLW;mGmkwY?RL@Ln1@42lEE*m!PqdJKiB5M&|`U%qZZr6j{v?_lR z&n<~slkeRQcuHLpOZWF~VbRR<^6wj{#}=hw=PYa{QZU%wAm;F1;r2TWbmxv=~;b3o&AY`^r zG!j0hZwmN7b6*}~R3YgiERd9&Wt7r3HylZ&6Tt_AhBv)PSe+#qPw!(y;mS;!_<&i4 z+b%f~Y@hW(+m~?>?5#HDq~0nqt9i*GI#vq_Q(k8(Wwob@m-}i%Rz*Mx(%Sm%ky6zG zVhlGx#e!<4t|%41e;BUOB#i#+`w$&|zS6n+r5~qD4)4UAgW|b!hwO)^8&lL!Ma{7` zQK8voqAobJl#1&1Ov8dezjo4Qw`$A$6D@}QPF#1)uQ#$zOMiSjcmo?*&Ec|+xPoK3 z+tRK(s~6Jl6YpD6|6PX7VtH}`kNpQZ`dhSM)cM_sc{0}x0|HF%)weH_qsrvf^#O7i zVljP`^iSt2Bd7(y<%BDq0_3Df=*p%<^cz3oq&y*dglnrr;mJqnGJq>}l1?+r@0ua3 zX*~2NI3h_K2&gN+mKB|}fFVXN@%LO9TvZU9!9ANIG zpWji&VO*yZa#tgFMVX5j>?`SUby31G7E9W0f|Q)tsCE4{>RYl-K&(^f_uGqvRYNpZ zBSAA6uy5-hWM^ZRV_hOG=(a-`WPm)CD;em$=`v8}ZYVPQC3b@a6JP6X1oVC7 z#2OF>m#X@J5jNPg+FE0=*<6-7LD&;Y-Fu=!?-) zs8z>zheto~>e8RYtd#eCs~G2bX(bFYNVJt(@@@Ty+IA=O@!9{IB+vCnG0>&nn?p7t zotxNjZ!<#^huK?7cIokOp)I|$l&s9Jnj>oH|9mj9FfRYW9=a5=+`iQIX?)P-O_i*t zESgzFXRY4|z5e-XrVFyT@nS#Q2Qn$;q|2+DzV}fyj5b8_666s?+J-MDeL zH>>wTLvylxPGfR{P2BW|Q!V#0Xh%$Bptkk3#DjEJh^&+UeY$<3Y??3GG%adH2}2-Y zCIjUMsa>sbIsAA2Se1kPy$$JmVrP0NpGtZ|9h1%Uh^C-;a&#V>%4I@%3_d7~c37}D zb#Ej~lUc9`aO6R`qL7{0;e2ufTTIq_@Rzqj)X|J#ByYZFllNOBZzN)mnI0 zM?^McmUMU_K9Bs_8@ltYS^riKZ^QR5pv1*q{3<@oy6!iXV(Gh$?%*mEeN=tq>#yOa@z zGVW&D++AL+J#7fjiF2cNl0<@fl4+jb=fxgEpI@+w&@U1`${2c)j@A3F+ge_{3&7PF zCcTsUbNYTMO^;h|^TYL|UH4xuWyI0mN0C(H_l%|jQKOuUk99f5K+tl#onqimmLbiWN*`p^*q zLtTJV`N&6Wsa3F8(_Udm225B-qdMEz=RM&X_D5R7lmEoyi3GHQAF0>VUjFl8?*{R4 zKp`)U`Y7@PTRt8xxC_wmtVEI!H*IHLIlS*Ke4k{HFgQ}sN?4yjJIcb{*;Ps%Cg))~ za*1+2Fr#i+PRwR(JDsSU!JK(lLWp@}}=pO{~Au5%uzW2zt>p zza>^nLI#3no3}De$?J>m!k64o`e+}pae<4xv_8bZge0oy6H;pZxePp1<2xlV*YHm; zYL)`H(wOLNhFtQy)Y`b5+#0XF>Ua%39gg+8YK_au)kfFR!XOqTqL)VfMr3kEaf@pW zguI2XffdXtd%F(djn3p$U&}vaN`|3U6s30xI}nWkb96~19Gq~A>7XozULWsncBDeE zE+7^_kFase(x%5#beDZPyNxSL)vLqw>JWaxuI)&{4}A|eFxrve45X%$^^^!&*+N)g*u_}*6<3>@lQN)J`N4K})9(}Kb_5C0ar^(1^%C3FwOyQP^5=TvuSv}{%Kr7( zs04GT=l;DHKXqPRt^D<6SXu?U-^U^{To8e%p|Z@^)!v3`FO=5xoYN}Wgbbv$rDcq+ z+R|`;^5ghwx3^~F%inN@`D*LH+Xn@>CythgL^fK9`&%s6SY^ZV#$Vn$i!0vw;M8t} zq(sOheap_N;uOEYdE z%~3W;iOJ0Lde1dP>EG4pdW=mPS%nvhT9IgrW^_r|@Aq7>J+ zwGrjP3eChPQRbQMjljt2B=FCMPO;~=KS(3x>awlOm!qzT&xTfv(-*qVMY1RKP@d>_ zE+s>N6Ne5@CC-Tf`s@rL9xM8Visycc7wM1LS`qnoRBhO<{0wz^q`X3_ob&qcahzZV zf}67n(oSQ`=@xTyk3^xn%HT%X zVMSl=2pq1onW=d$x-clgL*m1qFEjd{aH*S20yR{tci^;M)iX9R~ z$qEWKbcMgX?x_Z2G`>6``t;vn@DLxZVb9xOWAGd(MMRWdpPU3* zoyPp!nfVyFckWo&(s;rV8m- zmzK%txguQ<$_{Xj+HL#zT8=NDncmhg)C=Tkb!Yr;{}A-Ez^`fK%|xCk#fZG0h9(`< z_RIL@mt(CCy-kZNj(xRLzQ_$$D36sv!?tylTuUaIz93K<57I!M9){rt%tj zpwlhLmvS8tCes(Rzv%yqLqP09!NN;&I&!3R6@KqZW_C-QT`Qs2PPahEh(6lZn;*=_ zKK}(#6-`#AV@GX`_5D4E-TH~e z^8I>E*<-k*1k_J%pv{pEU$u-5@#{*?P&i?tS_Q|6oJ+apH$}sD(sA3+r-~11>7CdW zcP2%&qPnf;?yhyPEqu|9EvWgGv!b0NcPHM)+DL{8wN=xk03!GP5>R@CKkdxb1I>ds zL~Z-2$?6WK*o2zb>AmhC65#~GQzY0s1)LaV?Sp{95e+ga~X zOv?VaxZ-etlLZ2z#%du*vap^}t&SpLhN53+cSXtIz!ooexr~F%bd8%NSqmG_A^&Qt zcK?bVk~NNf8+xRzBb+T-?z}0n;h|Cs1rgN{w=bEL}|0KVqzgG~1X0zmrAEZWH3_Udrk7Pd91y7c_RX0f@4( z4v4yw-9HM;ONhV&xNR1#qWEdr1xo=!$%UR87xurXddKL)%?ns_N7^`|Q2X3p|J;@W^$n`5mH-oD_8Z zQbg(d%1L4*=rES{w1)WHLG4QspZ$w!8G0FM!H;1ioAZp;JUpr&P>m4|lx^SJdPmn# za4x#(&A(YXm_aJ@(>#A~>5Cxlyv*4(pErtOXyQ6Hm2yH}x*8w8wHYgmQam;poq*bI z8OH7JN6KoJ(ZbJ)Ite_nI zA&SYZ+>VWCIyh^|IK6almx@zUlQg4r+xYv@Xs$t|({s6-SE3*osN(;g$Z~Lt+4CqrszBbDt#HlJfqfDVR5SlD1sbT^1Q@ z(QTskTg3WF>qQkdF2@0OIjNqe@}gQ)!$T(**=fF752yH}?^T@fLQ6|8H?Jkq zAmb$*q`y5gJ$yy*GYb)^bezCgYJuxWiWzt`RuJa@%#ZzpreaE;F9?61yk_rn#GC=k zj|uhIp;fp)togWWv`43L4N7%GHDJRjY@@P9px~ zXnBdVZ>=DJv`WH`VXmRPLT+%Wn`63#S^?A>fh&sguajYjnF9frYvY=QaQ8=n%uL6-38DYm`a&tMTU%n>^c|CCXDX4Kw%zHoj z31Mp*icO_Ui0E5O3Z}0$qDGet;`;3FmxfmNw}pZoho+`fFxqW{B$P5S6(Dm&OEr*v zlSn*VLpoi4WLP$Q1y@9QqSgV5ji%Yc&e_>{@M<3O&(!b2i46n+=jsKtuY2&ZQ9#ZS z&L0=+TEiv(Lr`#kZ$tk41i!gl)8JBA4g_<(EcaPp)6u!wciU3o(4EHGtrv{r8N!79zTY~!m87H%qHA)0l~2`y_SmBAr)DiECN{{f4;Zl1 zX(OP2PhG>2Q;m8B{^>6&eXQ9z6>5x`c9bMqJr_8X?e%%Il+v0{Mw(!V%>|2VTe``sW-%9y3ApTP&;!H#?^LRjATzLuKqg>V1`i&Kk3a@RZ!8_wq`R{K z6~XB8Q1>!G+ns3XoWgIMstO3SK=Ca}YExd$^|YJGDR)u)eT}J%IQSHXJnO3cXohf9 zdR7I(>Em0!@Rv4KemxyLID58gn~v{^$R2`rwfM$8dWs*ymeC=C$H#Q`v!~3gR0ju#7XAu zxf2JynWcoek9!?@G9BFj1kr*Aio1ZB@WlX-raM3iFqKoXK&jUL^G6yc0H$}CFbn>F z<1dYO?lL?&NR$GFS^bk4ZiBLjk^WA_aQ4P&q_B>xdR%=h*_5z+wXI-lNZajd#X^7- zy?_c7nX?0H;VY7Bp|wEfgt3=r(kbcjIm~kTuLq0w0VVpqO#{g{H6DZVAtf9nfHgl} zs+5DhFmXe;NyC;ya0xG%zaC~dFO#LwH;Y{mTDrPB!^0s??0<44zN8e3tVH6RZ|M`l z4T#u080wb;-0C|*&XfYu%A%b)xQrK_p?nXIxwOh%%p+P}A6OS{sA0>*$`xzpnTeqE zV$2AXUc6GxS!)%$&KB{4Y`}8khl9(V8HH=WH5L&H27$TztTeu5@s)>ac1vf3w3-WK zNNL5}!(jJ}Rm~hi|aO@WAH2DiGvl(P(marfJ=GW{3#0 z>uXZ*6P+^eOMu`!?O!@>*?)S6AW)az;~R*QBrYec=}ZM230Mpw+zqaGBV;fiO2>{# z$W^ib2DkL{@Qv-0k2nU=NzSD^4X%P_OE`$gymp($`Foi`jjqsEj*9sX0)A<$9(+Z7 z9a$s&b}4!07>0fR)|`H;N(F^vHh?+cvi1VgAY;RJMF{)m^t(+>@G5s}=a zeP$8@vc0{WN>QM=XTWzDT45BP&5US5`3K}b-}75)v8ERjm>P@XfZ|WO1a?xgMPiiq z>Y-qxTT+UMAaD{S<@VJ&EjO0Ta8(Bp9N-P#-5_yzx_h%?D#HFh_I%_k(>kMas9WE@ zn$dJFJofFFV752a{~|NA<;@p`{_uaI@Gp3sWoca^FN!*ba=B6>wF-+r32_ltNN#yV zj>%PE9&HN`1WgMZi-jffF|Cy79G0tTS2{^36ZCQPer8Ga%>|a`;1uQ>`D%u`v zo8Ic!bh|t_U4#%m=B|y+F_Rm+?e)W( zBwi$dZd5;p#sa|fWjBtN-sU;_{(n?X`W~f)c6ds4x&uLv)(pv?A8^TX@$Xl|z zFQ7@9MgvsmfTSoONlvp)%`5={a@xRxs`_h z5iHintwsg=3Ty--0dgk&9JPucCjAoIqj}2fpIU?jB6LnhO9iLc*I)R1HI?5$$Vj;` z$$D1J7@g+pzAZKyF+;<{i^z01NH5THoWL-OOB|7?*r?_Nt<}r{ZiB<~)gn6`6+QkX zE<_RBAP70IUCG?NS~AeY9Lk-jd^YN`r)5bf52O*IvFunH$?m9RDWc~lxGJJXm>k^B zTuIMPc<5?|TLWnSXItMRtx|GLV^)9K`2+>mDUUgT5FETxgR3q9&3pdxq@+AO-+o`S z^_MhyWv~iP4pa2Ba~Uk?-`2Q&)5o?4cm1lZd-CR_QXTyLEd|H@B#)t&g@=3BvCr1A zpUby7oJ*IoivMz=_>sU=OZb?|cF^=;*X6U_w)g$#=Mg^4`e;NqO{Yg?5B0tI?YM;% zha(!YfoXZXd&L-M744$IOU%(qQy{uovo#XW!aLUT;BmgRcY_jd!_X^(UGV^_VZpSmiRC?@bsV|`y1{j|x zjGN?>B1FJceTc6|7c?m(f)Hot-FfRwd;pTxrNB{GD64}lFWvr%&;RQM0EjZRxPzij zT0S5Hm3r(RZ#2(M%02jJc1S5XWaMy7%_i&QSe!_D7 zOhs|$r)$UiTc?cJgPjnyN^H#YxoKaLnu4i%e_TWnn5vw2 z&ghWPKb*!Kq>rpMsqc$MGI5=2lxpb>0kgiZGKpbgZ%KLhqy@g4mfY4HWa&Ci8vp!X5oq;4EYy#6Ek^6U**JC^9%?n)V@NXj8-=2sk z>WsFx=jE{Pz5uGonr>G+`LnXWzX-2EpW^A_WxgVS1Z>ZIEn6&@s26UTHC6<_ipqsA z(m-j&T@o`Q0^2X*8}(=3x^t<_<+(q#SZgnX@3hl(jHU`hl4^kyG(WFkv?dKpdd+Z^ z8WFUJ1ulak!AL3s7dtgA;E;f`AA&z5>;pXvtiT`vxw+^Nm@yAE)F{!84Cx~OZNyn< z!`&Nf=yefSx?sA$3KcMRmH6=7U%D^PpmwZ=UiTK}%Nv;5V6A?>4opat8lZL6MH(Uu)On7s8 zgda9%>T9=hg3)>byRGL7xu+MOd!;z?Xqc|nPOk^5N$&+Z)19815sKC%{-1D%NheK> z&0X)I4q)F+kZB}7Hj2xvo4Io3=3&sYqXW@Ix#&^r1`ZMf3=m-ZFc9eq9e=>N_i2M9 zmLdYv{oP4_ITophBiWVss)&K!2$=!D#yN~C&P_{6rv4j&y_)HmTcw;Krm|dWe{Rzn z8VBk-#vZ!R6-LEzyBc*nJiYX$x!azd9g(WCOzFo1PXrjl-$E#Ns{ZKJ^tWk%>DGdI zC%Mg2A^*W|VUn@5?$EQv?Sg5BrEbklV*wKqo5<7)o*VAln!z;i%OMIv^nmjZraOM; zeEN|fhiq5TxqoriCuijaa52_b)Ik8Z(x?7_1I00~p0Odt6Z=4HAARAj zOT+_>2ArC9s~*aY48DyanN49Ikkfj{O%8hKJ(=7NF>aWNLb>o@XL421zM!N zV;a?bM@Q$C#iDfZimEQioaL^TXj<%kIr^SxLrSwI<@LN|smgB&evWt%Ct=BIMu8BG zZUhkEzBk)%5u{ve-IoXxQ&aELN?56XYt9C5;eHV4=S?b&w_|7r4ld(Pqzz&B=YUt7 zUcdda4Q$@Q8Q}wnzv4MwHwXo%3cn6QHX?s3`&;b*t_7W}cVOE5Z|DeeORRNAgjkMV zc~7sP_W;F{n+B6V_c8Uvp4Xs~9}FPqE+&V`g>!xhk2$wzh`I(E3TGmA_Dr+NrMZy0 z)V>&+vdv*n=5gvJ9;efI8J7fJLEPHa@-T#diEVe^!OsRP_7zH5Dw7@9gkplv^-UfRpkc5*#bhtNI@u|BxKaA}BYx=ag)xj%SR`OdSEj3u3DFhCh>MeH;V=*RH%NJ@&y}ltvrh-y z$YcRiuioUx>)eNM?WsYdvVasS3TE*z~JUQ%UAalrM7N# z@TMz*ZsRa&e2--LY%H7`sH11z3^MlXSIl306ZZNsgM%EOD`aD$6%~jbQ-^wa7<7sm zdr|IFl_!^A8Udstf1=Y{yn#6~&e4`P!>$diW zD%^BQ_$#8p;`8VAA7-ZE>4@i6mwcl4Uk~1h&AkHTWun#My9s&uZ2Y*?9oymwWOoxCN~)tJwaNZI*aQ5Lt)(+`zAKZHLFT|rG%L1(#&+;UB- z$(O*o?Eq0zZS=jW?qPKqU!mf!HwHX04uu!H%au1@%Zm8Nsn$&6M#l#$-;P(ttK6jM zR<&Ydt}zt|rYmb>ajwsXU41ehCU#_G9WDe0-6~Z|>0+balPt@_Jl-4--PgafFDtmTwP92aV#Ku{X8#~iqRgSv*}^+iT*`&7$FZU)w?{5c@b<`*%e|@QRAzL-l!H|HzpN( zLKx0-O=w##zg24wP8YU3cr7IDnZr+sx)sOtKvnrvcJDl?4M3=N2CgNuJSuI5s@3YHNnB%G4x9_C^w?%TDUJ(C(xrGoC{qOK0*MXpI7$ zZSMK^M>y(elw}5Gf{vP;T)Qi1{#;ruuo{KYzdBI3;o^jSCu@YB&?d|k#8myfy4dbq zUpo}rS~y+S5*%LsxSMybI8Gu@$>5#hB6q&KOOzlDZ{#%2whLtB=P{h=<|Dxa z#4KftDnw!|Cvcs8Rjud;7Rq76P>1cr9sc$-H#gkfoXteenXHEbYW0t?2v%-J`ZleN z>)!FEjKafxV}qg+{tOOX^?;Ln&|wnjT&FQzurNa;O)!)j-Z)=_1k!i;CW#b5VV3DP z8B+;#bc9+KSZw>EkKTVlgp{Cbw0{O_I^qRK#1{H{6_7n4vF!-J|B~m*42-00q(Ln- znfD&p`i{sY?OtHL&W+b_khH>|3I^PQ`z8R>D!(Q24tyySY=d3Pl#?(p|C!5nj=&1% z<`OosRA-C1Aaz?_z5Dl{MNu_8Slg-c*Q!TXdTIa1r^-BB1Qk-BVT4X8TP8y5suD%*pQ;Z-?uLdqWX+w! z-)v=N^94Yqm}~?lC9JYU?Ul$n`pU^%VOBaK9wgKzudQ56RS3W_J1T;{Oze$SGXv0= ziUYXDm8^?{MpIb@18fjV^o;zc{j;as#{MmWaB4T1YgOxM8ou&hxwVFl-opl9;&*Pm zwaH)K7hM$9eMsn``QIHn8;(xo7=3=XyK64N28-wQu=`s)k2`7ONtS~&ig+`3Iboic z>&ZVneZ<78A}HR%_TzkDjd#z0fCoi90$F<iiKh!h!}b*oE5hgs`;}J?BCRoDARB>q?{1)n&x};*auQFB7mQs4rJ`4 zAsU@Yg*OKSaz7=!$Y&HqDw@D5G#LEF{Qd9yR&Ek;T?u=l9isUaWVB1ESqIlo;pr0k ziK+hxkTp`3>)o#Q-zZ+0WyU(^@w)N+cbMI{jLaIsT>|oa16abTEZHb-Z7UFLI|(_A z%yRKMFfc>3K;NHScQ?LwKUb*ngdns9w;}hLFksDkn_CRzehShCa7YcCqOp~K|7hVL z@oIn@($S_`w4V6f{>B*aD7Kqj@u>v?06O7*^-L-Wk|6O3Dha<4yu^`b~M0P!WYou|P3iy5N1Au`)LXC@uTZm#E?Jt4$^Z&Y%Ygsg~q#t+|; zJ>uCH4Xh%g)?E@K_3lIVA_GY)Dy?S4ouoz7F<> znFG4P=N(j<5I07E_ciI931noFumr6~Tg^AZcq~LCTu4Q_ViygAqTcdL=$0HjZBzxN zL0J>aN$PNblpL!;78lsGnm%k~!NYntOW)$x%2IjPW+}rBZ;(kUR~#M}DN(}oi6Zmt zRT0I)n23D}*&$;3^XBnj_^qh)M!fN0v+-;^t#1R_@BzVy7r~^g?V6j8k?w76#$z7s z@NV*9WE6t5o-0XcvXPIZ2Ja*BYS2oC0i5b9DMcOJJnRBozDD5O5=*mI(ZBU3FoxX7 zAu2o?HYca0Re~mOT4kBIG&;{q>gPXUvjey6x+T^e+xpahcw@RL41${%XC9!x+7Jpb zsee-!?FF_G#uRqtwrVz2U-<=|k`?EbB_u^K?6*DskQPX$Y?Yy)cpNwqzRl;$Fg~J=avQJcz zjWi(ujl)X$k2@+0B$F5-X$Ql{q{lg^iT`?XXtf_0ter|8+S63D1K8>+i{$a7)XLI6 z?@@%t;>SeBWQ{Vi8=2iwUG)@PU|1S=bRP10dcCoeJp~sRcv|12mSE_Fd~@MuCfijn z!mF7ZCdo6ntvT)JFwKK5h5-J1p!)7}!vg_az)MG8u(tq3Vtve3J8-8tdTgUX$bg4W zbY|ji3Km^vyB0!?$Mph?_m6o~$`wI4(a{M{Fmfcg|&c+K4K__$RH``n>E%(Lo#KYiuP4)ME?@3VJhGK_)r^6M9r1fl~gV0 zZm(^kn30_PhFb)p%PFR1==31Ge6Lu^E@_PpnUm)VAAbMH>!0;C4ek3>QRC2GR~P&rH8t`AOU5_s!n??dKJv&gPQ30LIln_$73CN zSzNPv-K3OK^?{6BTAz4Rs+q5;L*oxJF8WvQodW#CIrBC7LN^)=R3E*oMhkcn@Pvg4 zaVsD5*AE)dPJlaJgl?tPdIT4M?}^S3AYSxoCQkvY$P{l!_j_Q1`oR>UR1{uP3^nSK zi?snW&Qpcm!))d&P*}1V4f6ene6$i7d5)UV&=gN~foaR+Q_Iru;VE*ymnw)mIlmG) zEq6$CT=t!x(FFt0&HtAm%e;J2HZgDjCFHei+cEpgCG=yw&T$baj7U~cX+GdTw?e6T z{-`ZdJ)a+;4vI5U_t3`%GVrcCfP*5d-IjSfe_!C@SO9Nxu$2dev#2a1sgjOaj~vFm zyY?TQ9Ps6i27R#1lGvy}BmAGwIn*E0)9S`D*FSpwrnAbHalf`nT3+TT3wKL@zk1`= zmil7ldPYi+eBB;8m5axGwev!<`1unVzHeJjc=?cFlErc;@|jUrG=JtHvt|6?|3 z6sq#%XEXF3gdry%kp`>6`N)Rm3NkkQFvB7b`8hN8(>I2g&ah?Rx~m-$P$-MnGFF9v zy8$^UV519DUN-_=Q`bhM#v&tz&-OM(5c&52+lsMje5mJyT;bd>M(E%hEth5E!%t+t z&p1+Sn{7vebaYxw?sDsq(})HRQ#U%oHvkfvnsmS_23*Vt{lzv%G5g4# zSdLz`gAvKv(d%%qpENe^8r`rKS!%w1WTC_Ao@%074qXKy{fd&+)rYSZah9e0V63&j zC4vN`W-XIl8AL1Lt*^O=Fj{n_zP|L>u^By#>~(70)!5)1{mER;T9-7}`mI}J^;Muq zGB<7#<(NW{7#)z13twHr!X)hPp#4A(UNxlg+8x(U9MYeCzuP$X&nuB?5jG1Sz;5Jb z;2R3X6aqr+LMp%+nzlZ=Dfc}Af5v+iq^V7hhxHqT#_n{u3_gW0BkHZ89BG-z&@|&> z$r9D(bn}ZT*5(f^ns@egRUp>ofQKR5Qz|J*E`7!brwX0U)1*Q04?TsDEx!O_0h^k! zz8G#_SHEYO447kNJ@%HqF8T)hb(V&)qtFq5Yp0@JMYvG8t@yVPp&G6u^61kFKS{3Z z+W!Hivfvfz*9v{lI}~Y(?T5F0iUhtLVdjo08BS)o^c7>F;xOe^`1pakQqW|-2G&rq zJ$EAd$;y6Ep<7b1SJtsnmcTv5R*5U1DPr(tcotgA&rAITX!CEU$s0+x9e_%*QYD#H zf8yD)-E(~*I=^Rw{o)h`57I@m)S^cq0{T3Ojhn_Q>X*cREmI{}#nn)uQBQf-SYUWE zKQO+2v4>84?3kkY>GqZJS)F7sq=;)N(;;S3$!f%hB%MHRX6}`Cp^6=TvkgNyZ*2B6J~3 zk*3Mu46_(G>sJFcdsSJ8)%R@D(7yf$NKjsHCip)?EAH<@erf-Z2GTf$ z!Z!Wn#a1s@5uHf!r~IXq7#%hMmL3kFxPb2W@d)h$mEOY!*$=&QE@F;-rlBJcARU0D zjB2l8C|LVf=z{{5@GKX3=9 z)JsV8Kz5JI{ka5X4v5~SYFodf&75Lf3;_|0a1Bj%TAhRj7v~9@Vq&)!CyfMsF1kiu zGQkcQ$!h_-<GhU;&Tm57o;c%6xxM4X-9iOt_8p9H zk!u>H;u>M)Y7S+1$1#j(gVdA5r6_XrQ2D9QC-oJ+l{-5%4=(Mj7h4>xA0RC40bOAQ zRLs-BXl!EPq;;;4daO6+Z*M9KP6PzMV*}1>`Iiy%F5&~1(BM0j!v5XZc6`@RF6@3p zeSb)W7BiM#7P7gZ^RZ4vsM%{egg+%L`#i)f)%U+>4am_bnS`fP?m(@y8LX*mcDNcS zEUQrYvCznHdC6Ct`|I&%Pc$yWf6WYiT@J|m{)g2DTIS1v?#=j?{GJTy<*Xq_h&AJ6 zDG$2wG3b5>Y4k>HeKk*#0$$I9;`YGu98ZJsIqlc*=&x`4Mcm7#7fADkW(_n)~4k(|qmS+Qa z7JX?Rk(^f8Z{E)E6q7g_@#q3@#KK*vJ2jpG(;W)lu;!yYRQND+(mPn*FHAQiE5)4_ z;MTuGl>G5cC#>^vQ@U`QzT==iXO?3-h`I4$j%|I&Qodx=G-@VD0*8GWAOS~9CoBG< zso&b213h@~e-WGpEmuE;R)5d^Ulz23z-c$Ja=u57!s?T)>ogNAR$WXk z|Esbmzl0m7^zW~?E){o&S%9J-iTwS%*R3mmP)FqUZ5Fq}-3`7!ItR#`khD5ISZ5FOC8U9l*EZ`v^p*mx_LFaS7CZS> zH4?g)e&e$H#O)~sVu$d`2TXFG8lZT9!PR+msHVLAoYda%GDEoP-r!TKDUFwJ_yecz zRnCyl=YrKWdfG>~ePCYR5FjVdL~*O*G|uVF25Kh8v~!Cx8%$QLJQEYtO=pbV#q%-9 ze@E%Mu-><(BF0yrWbyZnbMS?Dm)eHs1UGuA-h?q5qKz=93zf?J1VP%3yKE$$JltQ* zS zCFYxL*CG7hEe?#`<m3FDyF;m7z*hnfh|q`DqBxt8A4GN;>?b z1l+5LP!;N~x7f?(bMT?sWybe5H7sgwg3>Aq1l{!BU-mRa-H&${a6;s0cftcE8ny6T z>j%fItIu=5wPXtnm$zElUf+)}xmJF!61B3BiHQ(zO2HUF(%1Pc%kLV6ltcjUK>X$Xv{ZGB7|fN23=O?l;Mu3~3MMve8H z=$J!sbr)6Q!>Tb=F*!~Hb{V+uZ48!Xm&9Wg{*bkeG0T3m?P?D|JX#w>Qp}>S zsHf=W#N;fzUB%zz?d8)9%80z)gFOI72LCTwZKt4?c^c=AiID49l%UBB@II$V!4R*A26sy*?nWcOgH3D9&&WYi5 zOed_-3HHO31yhnrxg5~+o0G1@jPGUpq7Vc!v9B`jRFA)Aa-~X#fedr#C&zJXFiZw7 zSF|MwvOUm#Ck1wCXBvFA0(zn2FvCfKHKnWg$L|02Q7{3pFJU%sqpB0Ftj^#q*AL}%K(Syn(_i8XjR)hz1L$L*Xd2CJJ`DLVi-0eeEe^&|`TgVn${Z}nV>&pzp}{^#}M=+#XV z-8L8g@_@J2O*S2r@Vq!{lOG$PQD%KAJ<)k|RnZu;8Ws zn71{o43pm>&uw*>pKImwGXxr_X!RQvo~s6@b0EJAJ_ghVw4yN{&y|QJKK`ZwZPdut zqB3rQF9lY4dE%)I+c@#s)I9>Vt|EO!Qbzg{$6bzlpN^_|d~yMelw7|Ui0(-ekiQzA~3XjxMr4Gb_;LUeJUm@kV?hLv_61`g<&TvetO z*aYn`%{4|_%vHY*wF=9J%WlU^zwFC6!ti~pYK}m_aoB89!MC1TzYX*_a8Im)n&sAU z2#g(F^|Y8ebKl@KVD_$J;ZLv^TE$wp73eM2YXT_(7n|04m24!P4r;e$9jukj@xi%a zFdR?@X(22N#j{AfyDz5t`>vHUyb0v;7n3<)jkLToeram2M$Z6~RdCJ<89aVVc_>tBW$_>NV&Zncp^ULFsHtB2|Ls;?}xu zTD^BQqaj-}<+ZjheEv?U2)-4-&h@wvisKVGAhmT z-v7JHMi=`jF7%aq_FsAN2NWcwahNE&~-j%0qh**V@(j`K#rT+_9u z`QukYLclZR{97~9x-IIuNH$iJWhBagY@xbQNfA;-F4#p)+~fo9a|=y;#a2+HrY&T% z5=y9H6Bi18O`X~Aw3og5k-5%l!Su(pM%PbtVG91cw^f6L>0@}h_3%yO@3+Oj9;`DG zchYmslUHZHor{(!1PgC4mx2mHi244~?Vmx$W0*Ra425y-_#l|%nFAr+kDOJt)lxTk zoVz^fU&=}D^5zFB0jXaTkv1oOd6bjvd&k`^U?4MJ z3zcero^k*e(LM>xG+bU1g7h}Q2w99Aw&j3% z6Dt+GK$Gv}$VE0GNyx1jD8j*$-X^-i z+<@%z9x9P*3P=^7Ke()&73<{l_K5f9waCSRhKuV^8O?nU;>0`;T7RutPh`=5$jN8r zxcADs^puyz$4sVl?|6G!YA8u})|pvrfVUP7Q?2rC?)v%_5wx{g)Aq$O)ae-$3wFOt zW0+2iQbGdk2&dk856VaU?3z#3>X&j8t87Ix9M?zd*d3Z_6lJ`ehpq;@PHO`#(Drhl z*L=(RgzA~jl&?g0zjCeIrkXX$gY-H_i7jj^T(XTP-6HPSA%>niPQr`%)J7uu4lutV zJpYV!(YvpbRcPJ4V8il%PrEciRj;yLG$C8VY5r?#!u1@r7FgVS9D9zkY{mdzCDzId z!8&N>>+^sf{rZoX#@0*qtZdxXqNXBrYL-MA|DBs|@XXMKzMzv?;3a>^M z*Q~%{yoo-xRtC>9D5@YLOf%=M4@ z=JGy$$I~FSW-JARB-G;@H+y1+*!y}A`31jzc$`lxON#G@`0~HO7Js{X$i~pXO@;j5 znHwKft+e=0s@=i{0aAFwHZIa+6l8D-%v&Mzt5WWZ*hTwJ*Tw$;Rq@qH@}$ilhuhSd zJ++!$g7h_=L~b4p57?O0oG4PgwHoPWUFykf9^gPZn~}+Z{{KI*gaG`HDwPK`kp7II zV3y#Q_|Akyx5a*1OcHBJf?NK4rrpFaRj$MHK5`Z&O{WqfWRSRl|KqyO@{fp(!D@=b z+3qOC{P+z!h*u;|;(L?`&th9nmSRIF8GYK1slj3Dc&0Eb2VV5Kbq7mb$k^v28ow-hzF;m@$hG3UFJ zH{+0yP`X9QZR>yKyJ|5LolK_#;D>D1duWEznAnUO1H4y{+6{NinS)%UHii{xB%a7a zJh0?6yHLMk(GS=$*G@5&zvWS71+7vrWsoBUt6;3+dR+_JAqW@~{FsmTB1M>Dw=hVl zd|Mb`b{d4r%8SY&D`AYEowX=t0Auj4{_=d#{vRX&R1$rcoH>h^9X)<<5$iasUrxf)GDi#vDBqS{^?M4Ot2%2W!Xg-a`(J2H6DryzV z9;r^8?%Xx=F;v9ZfxW1w%y^$yl=hCzCu1RmaW2o7G_6<}?zSRc{;Ql~AI`6wPS7Zr zi9=Tj7+_Nl5WHGPR|#k0ZJcFeiXCY1{Ep^MOczA;+~=Mti&QMy*%v8$5S0@lf76@C z!r6Kqb-DdMM_oqfruBO41c#~`90cV5s@DdKZkbq~)<^o2Ky&r{WDcIaC*V#4{KEr= zV`ee5B!2*Sx~~#oeBFgQGT6q|)c@5ps6%Pa@ArO=Z@Z#TdO$M-vy;o<)9g6R(QR~n z>MZco>mN(m+>d+3ieOf;;C(@gTo@zs6fL76W}-QQ3NS0|NTS|O;dRr)uDB34+y*CxVE5@Bq>-<+uIuz5?P35=z(A z<6^4CBqc~5ljOa85Uz%=dw84#f_qU>&ubS2D?V)y)xK^-WW7S3UQ0$uipW+Tz@vQ( zM4xP3x~t447-u?`_ghR(^J6h|{Gez4i)Cx85#G2$2Vv=%8si)J$-n>|;h!w8sN~d& z5wLzw@AGd(LT{k6=L>1454k9qMgB>Zwbo=&dhuj9qXh_UIlpGZp8oPB6RYxq`V6V! zJmjr&=>i8d>Al$#;2OUYk5$3VgRpbK8owT7@*EZ(h;P`a*c`kVtzQKMSnmk8(Umkj~PX3#GDL&lqtbNYZ)n-Grs~ zqL9lX6buYRxPi!KfSX_}S2s3Nh1=4~jj}L*9Q@(T>t@Cd>wba1d@gKONCIxH8OI5s zehuV94sd28PQnN_L`}<&4P1ftK*ebr+0L6BmUAKtY6 zVCowg*D1R_u&Q4Pa^(yq4D37N$JvbzvxLBmn>)rLP-sA99bNYu3Tg`Tv$-y>^H}WF zZpRN3Cg<(MIXGK}Gw4naxI!_3{NiJ>ZXM5=kH0|sz=#rp5Al08%JP-p%&wzcPhUwF zcQWNmFnx^M4oi7q6NNSA#JtlvOg-Hm@=H1WJq@g~l1r7Vf!iF!QN?F+;i(IOsZ~ZC zoWeXDU`)dSYiRLbeza3;JtT47hOtcakB(7S0~fLS~k^*8YZNQ^AeF?ipIFT`j#3^%$n8?&zXmL zOlkq^4;geTk;7c8ri3e7M^VEAqkxYiv+2^0B8&194t)BNR##{lGkY8S8usS!)h>QW z0LZy7!1{Q3gqfe_-^%z#TRc~b_ zG)GnT0ZS_^_olBj+GX?3pcI2c;EKJTX4yP*@gx})KKCw+@p8BBjHhP7eiJ)UNzSb+ zR0U}q2z}4qc*t${W3~4>MU_ZgTF^g;f2vkSF?kLBDd4E#FwP7&oM$)Emp&k5{M5;- zrkn0{UYbmqS=BRfJ9?mW0u57@R>d194EK%!Uf=ECKmx0rwogCT;vIO_vU}Z)$jH1j zmnm9h5~9}k3-6Rgp{hk?>B#%zZNDXfHV-m6js+4)k4ev8Y-Ud9--?##^jY$D-OWR_ zc8R}keaLAsCjUD-H>oHC2(<*SnD%(#g*I>EN~to}a@x)?;|kH^g+(ulo=-Rk&(vHZ zwKQ`A3tatL4>_DRpv`t!Bylks{?>D*ERV8Nd)ldJA6@_1PS~uZFyKN$(rX4~BIxVJ zhXFS*S>i7YQhfeXL=rO&Lr9h$Fgl!qFdmQn%X39+?E=?5Yw@UVOx%iI3~v@K`*a!g z2ln>Vv?w$^N*Cv%C*T-KQcukh(gyo?Ld4QMPf zW7=nXx(?ruU2HVUKy8>xod26lbk-s8O#P=vTozp_A~w8AMRHjx|9My$-DSTs_|0&# z_TvZU3^wnn_emqc$)Yt`xAPPA!o{}aP8v?4S~cbdmTrUWN9DKxirAn3WfT3%cd5@R z0CjeS7Nu`@EHPwHLw`;-PS>qIj`_N~vSNv{L9O`IkA|tMR7jiU1PL7*{6OCasObj# z_pY8`>nt*DK$1Mqk{})_HgSgi942>kd!u|+LYo=3g6e!9mu(7c*9z3e%+BELb^Mo; z{>P+d@Gb90KIW(6PViGT`&r)F{KnMW07^_%z3$AGnnrMZTrpCGi?Dd(74&>f2St(M zTgU#g1D`K>X27(yI#U3{ze8!oL*&DM{3|H}eQ&)SzJZ=A))o8@g8vRJ@^36pyEe59 zQ1WgZL*u+^7P+!jYWMXW@pb8Ho*bR;^Q<3SXUhY$CviFYrM6{EC(%$9*N5to%T``0 zPgmBICKkGN#+%x^&Hi}JT)nPX6K8AV$|ccIq^$`A2<14s=F&CVfk5lHJu79PbgKqTZpm+qC^&H^P}j&LAubg0u_PU?Z2WZ@|h(=SZv<1DHC z=?QpQh!~j#r`KV>e%9cIwuxjrp;f&1E7j{YVzKM~gVq&&` zP$erZg=juWSu3E~Q~ZbQUUM#dCm$Bby4*_iyXm#pIhbomj}dUyt&3sBH?TD zRQkhp%1U^VZb`d~j<21IFmYu+zze;``KaEwLTSnaw#OQ!b+1d5*%2Jd$azi1zGB;M z91~A|9nRJ7_TE(MZ93|Qr`x*^Gp9(ve_0$@MF4ug6<+HBTfg;sl(WFws4>v%mOQ(N z6v6@Rt-KBp(v5+6vB{-!D#G{st`3(WP5W~BVV>;g;j0vw=9spL(Os)1MZU{;Gf0P|LzzUrJW0`@iW<)$G3& z!GJO|-!F!`lh+*I9y#?_8Yn=54H}bvxc`T=cZ!aL3!+A2Pi)(oV8V%Qb<(jh;l#Ek z&V&<8Y}>YN+jcsb+ux6S|9fBWTIZo3diCmcPMtcts&?(F$l~GJuG3B>)^)xn%E0)A z%o&tf=C5uKg{t`^DwQ{zoE2D>$wA`diy{-pvl9p1bHfE2)KQLMGBOl!!w~{1`)gg! z$p$WLHkIZR8{C{)k-hSbokDyx{ZcLsRumDHK2NDmW!b5K4Vw{ILN`&1C@rTe0aqEB z^M7xn2kAOwQn+oGR)Sy9)Hax|MY^5Ml}~{#b?EpTO1OAi8k>MbU=yoza?84PIl{F$ zP6Z~i+k;NkwhqU2^=r$5U&IUyt$1oTpk;#TQ_N#fu|_jAb9oRq9+HWOr$-;MoRhoI z!%LkL^!9R+!Tyb7afn_-N0Wb}@u~aa)1kmbNcK>=S#`@o(%#2pnh)pmE?Mf$Iz z!|?sQ4gZC4U|IY&+F2J|O14P2zS(@(P8;X}&>-^E1H_V{>qr;!vN><>Q;2)H9VT|H0$T@`F9i%}C6GHjB$!!8e)W_H z9iSdA6Y|>S$i6h|)-jA3#i|(C21~9SPoB_OX;-dlkxMXlT+U%j#Al`aiTxcrlcjEc zaI6<UxevL-i@GPf6h`#pz2F^8ngli#9*6VCr&^%v~De% zAq9capliDq$I@cJ;{AB6G4~Jg+VZ0lKMeeBVPcyn9OL8P9J^UxWRQD1%Dq<$w+}|X zbA!PoxVdUn@>a+M@D-O>0)zga_?iyN3P*ghOjS8fW6X=6I%@*G!{>uRkP5#)UiQa3 zz0~uUez1U%(RV%zY-<-U4fNpJczg};D0qJH3PuO0{iQ1|p?%EKSYg9#(W;Qu6}K8} zB&S6aybS?1<)H^;oqF5JVLKt#sb*N z!N-4O&BT1zqii}!bRUN|VCm%lMN0S|vV8-ptfxyQ z{Neh}Z-m5Z9SWSY>K6hNu_xExzsi+Gg%}h|7VQe>Tdv`YIzQcer|bh~5h?afFwL@; zuM>_EH+>w~T0g%(>thhIh|PXpg6Q=Y1bWQ#o#}eY$W9+Sy#67i#!N2aRIVHTN?yNL z`2E`A=O#%kK#o*jCDV+gp?wZ*^TAcpi11W=Ge6McBxxc7j`w%ma0s&cr6G+Wr{oRF)<(uuGrCYtIfvY34B^AzMP6NQEz0JKQ@ zsshkk{e=ikIg_yxSg}6zSWfuJt3Yn+l+;bmzbz58XWx)EF+2zYfcb;s;4aH1&lnFi zU0s#{z@Fo3ShkA$+)Ml3VX?%-V?7L>m>ZQD3nQAc@_b5lWqyfY;79mcH1CRBccciX z8=6^wg2LLFoCj=zd|q*CDVRGI?t<2Bg@nQ|KfoN`q{dOf4+U&IZd=~+438EGwIRe= zNy-kht~LV^dr_6kgckrS5i2my-%jw*9%64rl^mgmBuPcLYdAn1bE!Qs>XwMr?X`#p zRin5+b&+|YfVbp&xyCeI>+N9Fef1*H5blR@VLKi=Y3I=Ax%TzRXqF*=YJS!|&Y084 z^+2z6oDwvu3Psa#ZF3j98w|~)!18`Q2aj>S{LbOPZ(MtCe56@1w!wTb6hF17yZ-~W zExe!@v0}};4KjG%$FZ#jf6a)2e>y`$rL6Tart(>SJC-828_Sg2VKdit)$qZ*{xxVg#bIff;q4K{QUlSbRt$Csa2Ai%pgl})qNb<0EFM-5s%q=!1(7P zBX}H>WA}1Zjjr$z=gM(GyYKw!t4=Fk9c)`1EU_cv!%b8OfDmVD~eqvW~G7nukbK(iZ zL9X0>JYOH6wnlIBmb`ZSlW4r%4~olE_wb&6?sEmFn!@4UGvpaI zk*H%^A}Jr#wHbpMN^Wk3$K51}OF~!-X zDU@`W6r1d+f9H3s6F`6~XiP#-T_1IIWp(|BuZC`W{IKs_aP@PqnbYH0^bX#dP8RZ_ zVZOkucrx&B7C-AZ(x@u$5+)4)H@#8YRc)N*?D3H8f#FPhC2+IjYV!Mp!Ly5?k4^fZ z6N`Yg@`2E}O#v^f&COs+9}0cYK1>){vm=*uO!R?8YLD=f_)Kj&dr$Zj#-Bw8G|D7b z6%WEf_=1zv^0Ny@5+gRZn{+>n*Z9o7ZYatE`RryT|F}->qBq8W!<(X zb@%OXgaIt0pE_VFmhdur_I$@--|A*S(ux0IgxS`2!d_!Ws;m3*iSRP&gfi}65Uah@ zV%zVhz)gUO@?um+$`L&e6jFiOZdg7b`TVW%mrqC!zc%lAL02%B_~N({2FSo(_2svo z0pyArrwXtVEDq@A{)y7!y$zd^5CQ@S`oUGCTzsoT)UPysTuAut2CYd}H9eFNF5ULV z@}t?`lvF=X7*_#%>?^psJUkeTwF%|9o&Lgq?4Ig!bl6RCH0!>z{VZ18*6~NIb=#}d zwO6y4(YEcEHuSJ8cK7$5$TUFanofgNncAFUr&M5EnlTO@oG>S@5y2@oDX(H6Q=VYF zZr^XHPK*i-iV>Ax@|bn#JNutTI7IgHk0L$|twV(h8nO<*^jd8L?|Y#7_EyUD-E4fo z-m}eHj?uoI>n|7eU!JCss)Sy~W4o0_tvVYc(^o`okIr%jur3$4KPgg`cYG6H6U`nJ z-{3A6vh@^q8igk{RWo~kbdk6?I8wzDzLYaO2hF5NXOQMWrUpd?ZrAWU-rQ!o`G{qF zP*O3Wkc7dW58^I-c@$xh?7Qz78&(Uka@*r`U*|9?3I0BeVff!#0Hx|) zSR#umLB<%XGN@G)`aKrzJ`8Wmvuy+${yv`Mnx9dWMq}VW(iXD0Cg3H@tlCVBR1#sL z9Qmx~r0oQA1zgaVTzY)#!m(vI*KGWhIc;P-Sp?jmvP<#V>-T+kI;eN!mc}{qH&658hD}a@j22YX0=Yo}EgI(bN^4{SqlLUX7(>QK3Lj8VMWIymw`VX(N9DVIJCGBIB`h zeeLWh9-ko&^&>#e{yjW?*n&7iA_57nGg5=DY2_;3)?|X=+X&gel~?I$EZsw4{|m_% zHxX+Xj^~p&fE6kdEuI^j0z1uFrvuP}~9CevHrUM8uZ(!VF9?{`3}%u!wM{i6M6pS) zuvDjOUC(@GO2X?8DPXSxsw=tLin?9v{WCxSR9B6?zSl-bVCpN*JX& z;m)BkxFZe1iwPUMa2}d5a<41^X*ZIC8a|2QdjV3{7QcrIpSyCMZch6)MXUdD1}yPx zwaI!7vTGMbXFm#4RTK>b|5(i&Yc`~vEM%V))(pn3-VWN8ytLY2tfW;%NeBlmq^NIk zk2(Py8YPd5Tba-u31QT9-+ZbFT_@`9{&Bw92NS}XJA;o2TrPzT^jSSZ4&}4&zoZCs z(Yz7)<2;vrF&K+zF%eL~)K$|=)(Rd$%^Bu>^J)nSaFsm{%vZdaa(_EpHqNQ6XP{ul zfTm2Sxmx&^8yPjn+VlSTJsfqrgnK7<8VQDlNuKBnImHu?Lqy|*Te+z;1k+W^1@4Jv zbM@rZ4Ri`@>SYZ2l7+cjCiW(jcEHEdc~#SXZDyPo5SZy*E~ly)*0g^;~|3HpTBIG zSj)$R6axTk89CVJYTC4Lt-PU1f2dm^k=|hHLiHU55FKN%ruabN{{ddombW_>X*Roh z!Ca;s6Ggs5p2q_~gIcZxDuFe>}*#uIlGOe$CVs5OZk1AA26aGu8igqnJ( z;38(+WL(bfOB1U(F!}STj9m+b@F%R#e)QEP)IOsPmf#4{u&}3K$9rE61GPggn?Q*Jqnl*+#!GfS#J%jd8f{8=() zl3F_NCgm|4U-uzAKa%WpewB=8Q<9&#TCbB4YXdP-AOKs4^!r{E9z9=5Rvv{G0b+qd zK{=&Wf&L&PsEwkGvx|wpb^7u-EG%Jr)@Kfx#N0KUcH0KJ|AkCqS5Uw->6iT~17#6) zKVR5NH!q~VQ$o-k&sn3&Z|@wb^3beL&$({$LbAEwysun>7@a|sx8BCITdQxu>}v+9 zoj2F2JS+H~&l5`+SE6h@GbSu574Y&`? z91b#KW5-B)ytRE}~d_u0Z}I zNSYMU_BB9_pbbR;aGR0fG;IundHhu5bK5HtGH@ulvDLQDE+Un^(C&Im@)u?DO_adz ziF(tY3)cbiXBW|OPBu`r^}JvFC}vA4p2cV(HJcyTqpbe%SB#y7ehfPPLeik3(TNZN z**!kog-MBDlg4n5FmM|wT<}rDERu)yu(&I}6SdtK1=ai^Z(nLZ*H3tJ?fM_)us*m6 z!8CX~81$sN+y+C4fUu^>YL_ums1&i2%Y$yzkfe7lwo8Hy>$*z-^E+JeF?aD-);pd~ z?tHG)Z%5Inb@&nQpyfSC$koTOx)P5dgY)GIEcC|08pDe+` z6JpsqQREFU1hu<-@bRy!O4FNoAOjs|1^@WoQ}aHUs=0eM{{pVXcW^tvNIn0SBHihT z#C&P~F1#c0Ta_*(AKK6BFds&PyEJ>vKfCtZHGT>)kU|gRfGiA+^~Wo_V-908YZ+Yy zV|fDx#Q_vP!H!N&q?R$; zz#K9HxSMD>ZUb~2e0-hADf9bO3)OZsvf$?D;!HeTezP|?FNy;FS-+&=VEp=GFOfYE zKpVrf)RZ^K*$5}6Pct-RM)3_yvOo~HUZq>x%BmcxJ4?kqNJ@W=*&pr1yt!uI?m!zJ6gvlFwF4iTkxT^c71sd#*h=-pa39KRTl7Va=A74yV zA0;=_f`6rn?O+$)*Zbw~Z0U7S!c=^5)@ z2EGiT6#8|bvHcT)YP85ddU1kksYCZ1-8X_urKE;zlwPK~tD_ra6mZp5H;e;qZzoAE z3oM>Janpi(G_QJ`i(A}!)re<3p@FBP!iP=V4kF43T*bQ)!MCXt>XHJy4IiC1*k3EU z@T!b=&dW>n@7aHr%zs025KxbUbd&>{DgnNo+}!8tNWgg+n`A@0FbLW%>;aqTCq}d` z!R;NxtWEh3X_tl=MukHy(c}VhL{T-U!}Hlk2#I;^KTN3Up6ei#fdb<=Gd>3sb!({( z3oJV&;9NtDGosbwEr@eKhBr!pmZlk?r+IoH&o47Jn~1(<*5iOsjw@X7jUDSr?fGy<8k3d9LRvTE~=t()%NB2X}n$2Yw^RXxLozw`_!Yv$Qt^P*p7@9 zwQEEjt;l$zlhaHsBZS&gO7MN<&z)ZD zF}8#7xf9C*3aLp$}8xq0&|F-b9#@IqUjAvcXO6@TonQg_gIVsiT_o zYK6?0B#~n=6J067cTm|C!H3Z^IQ=UZbe4*WI$&5N)zs$gU`Ib3slO=J1rF6ovk3#4 zK=4hB$5vqr0RYpYS^fE0zpuQvudKq_QT?j@vU*vKHd0c!ydBmjW%g;on%5f#acw0> z$yKpUw}_BhS=1GRZCbzd#V$zfl)DU?0+?8gV9KUMr|knUB_pv`0nXtEuBT<*-fjYl zZ5rp(g?VC@F5M`|Hxl~#Bpo7cfZw7sXPrOGM52hi$a;24EK-%Kw3O2gtvk_hFNmcp zn9-uARKP*f{6azO$yD*(qRb7;P|l6d1ERa|vym#AT5Ow5o84WkZJ<&uL@*%ECp~8O zmaup$@s3{1$Ur}STw+;ZtVT_fB-r6HLaFv|e$0ui{8%DTtDwjJQSCbm>(4t4d^{2l z!{RdPol}I`awPN>OC)RMcLml^%NS-Rs63d|E|0r!wW@T>vmCV=QNA!iZ57)v@e_1; z%HxduyD~T{c#9cXc$7k80RTGujX>J}V0G;VWX+mZR^6<$pge#w-|k+4*SS*L^IME9@86Oxgj)t`(R+F6ld- z5Xs-R2*iVnURndHezJ(6AFTz2LEhHjK zkI|y^xiT^f?->%ko6Y(t;Q^MF>v;_40CRD3{q`1<-a1CA2%D>Hv(Y@i9d%oLAe*l^ zUu~_)$%xQRDb=OxVB6Dd&N`ofhU z<2+_yu}F$JwJ!b7(z3xqBdN^BF=gOEN~*wRU3xM-ztO|aoS_mIqC88XkuTO7s_N=r z2?WlfPNdsGoWCKNU0d_iRZSQU9k?%C017OwBk@zrZ`Z=cMR70ulme;(zv9exlTnun zR~YXio!46oL8I4Ke~;9v@;lu50kv)q3CoQ3mBBlS(T!>EWEVc3_C;(FI%r^`?0ey< zOw^-T;nGMI2Yh%fiyeyT1!sfvY(p^y$c-M-1ei0S2SIoScgov zT%4~ZmrQhChX=Hh1vGR*G_s_&WDGujQpD{opS>m4Qr%kOF-x$fy}RWB>Z1g5&C-0r zB%p656SiEU9UBxQ>SS^rYIEDssjCH{xuGeu75DUwA=OzOnce76E)Ir=#G?5k1sqVc z*n#2W>VNcVx+edK%sX2btyJL*XdC|8b3N#+*D?A}(AD=_nK(*+YogQfO#l#-;fUG! zUYmq^uHDLMG)Rlyi--$K=B~8$p{E|f4P>;iBPOpIBY;#zY%?!&(yF2Z2Iv=Tah8ja zY)rctZ2e{-*X`lPJz?DBm-e2%C_}pLGQtyqE0f4!XdaLeCCaK2foOdunOw@NQwr~n zUX9KJLHLN9TmTr!2130lX%~?BX!y;jy^y;ryGb>u&m$-pkQPe6 z@VYgj`V-bdLn7r5Mdtgaly&fmVr1`k?2xm)%b44>Zrv|JO^EQj2x5`hedFN9GhDx= z&lB>EPM0TXEG>s%g4=(9)!oI~^=Md&jTPJbyN7GZ!(2HVX=}}`c1%35A-E7Mo-*Fl@RiNPXURTi~%sC6pPawzBqgoSy%`#-JClDR0m)uO1VJElgrr?EOs zd}ZEo=#7_QDj>;fqcdLvU%*6nY;$S^MARwCvaea!q_XV z)J8-Qh%qvc2Lkd(s_w!WNZh{OU=oE~cK$A()}@%lEIBH)`OkzU*k#`B8* zZ)h66^xW`fvUhdbwT?2-i2DtqVvs|hRfajUGFT+FP;z5`WibFJE>e_93({z*;=nk^ z>@tMu-Yiu_OQ+t{^?P#%{<<=+G})0%AewS)4x@tRo?FSpko6i%0Su{T_PX@V)rC)R1RQTr32*c+cc|LRo1V@?Y4Uw{2I{HgiJJfv#=X{!%(zN?J9H@oI{}O zp!pwFnxf7E^~1~D-p~SR*8*y&2*=z4^TRLlMN6$>JM-K<=Hdu5WvWynso}SdmKb@q z*yT>`m3;GZX4+})YJO7by5j%g(KVYqZzV7AZN znpl#Z0g{8i|4VV4sQ!_r2W%+$MbPRL(cl)-7ccDUH?)p-=p3zb41Ulz`XIgGmbnF7 zk>q;lFRQ~lB*ak4+vMPQZGLO3QMao0oqE;gdqX4l&D|qajRSh1Z)#JEQgSmg0DhUG zX1hi6SO>d-7afm{x$dx^wJ88QAbCL?EQ0urc>{|;vzxShFg&A-exNBZj~HsvRVNTI zXz>dPkYm^pm($!kOx#Q#0_)DdsqUv|ZnkYmHr0bU~naCST+!V+!+&K7{UPz}DRlY+R z&(nZ6N~^&~?KXtSXeQ6uVZc(#`6(hUyFY8>wG^ew;C|xX_lSHLuh8e=5XXFeTd`U0 zl6(}V%R7RZ6zrABnzEJJKRucFFpu4u_`wFnQlo9l=p43;U&G&Xqc3cTi2~*IzSUe~ zpDZl0pAhb(8buRUGp@+z%&@)`D+W+@;4!*)utBJdg>>B@UdIg0VHJT`z5wc;%q0~4 z2-EN8OE%tE#H2ToBxN`rba2Yhe7`8Ok->av!|(#o1d7}2rt)V^6(cO35RT0Nvt+@n zsqyKS8H4Q3h%vkTeTb8@k;jZ;11<+-LcuhbPEgN0olHy9(SY2EbyTV0JOaB7(l7Iz zn}&hAx$^RzQm)UeKdGGfRv3eH0YhzRXL01@)-15wd4h(9Fi+iT_yW(%g0<(Si(S*Z zSewhnJ!QK$;Wq@YNuI8Eet5bfa22*25NXEd{p|MfAN`+%%sMuiA)Ef5_!hBTLK_=7 zHcIZI);(i7!xN&+w}QcVO9@$&mJO-QqPb6F?hhS&2u5Aonw?EUmVPmO9{sOJY(`Z3 zr_#x4?ms`U_|JOC;Hr5e0%)(>nV6=x-dKXT1#xYDC}-hq8ou>XJ0xS2G-#$a3N9s{ zmzhml>PL3nN(|~)qb=0A`I-6Dzx~nt@kT%$G_|yLX+;{mD8xNn<5FCW4yjQQ7s$v! zYhv=DW{*dTA38F^o_Nx>B_0J`{6#E87(mtfiZMf7SGMv|ozsE~-FMH`$t`wSBZ7`*UDvCi8q1aq;K47vI5K<3k<5)AOEm5HEN||PfLP_X8xR(^^x8?rl3Q; z>yrfwUO;QUexdkJ%T!F4}5IK6(?$*~~ zG-jdVi+KW>@x(Dwq;_UgXEboI{^V2EL~e=x*cAeeb;q}F>MU4Z26I&LEQA)1URJVk zVbcg%&2Yn9*y4#$vPE)KBPiCdW#=valbT5CMmWZQDHE=T%{4vFvF*=L87dIf_rZn4 zcI>)3u)uHN_h6*Qmo|(PQJx4~+xHhC_zMLv#-(KQ4ViikK1U{y`^|IGJAD=Kx$y6< zQXa$gHCypg>%t@TEYBT=&FlG&LVw_f3u@Qeia5OF-RP{JLPGzRzU;|wE-$l~GN7l~ z_JoKV#_7Y~`xufG(Ac<}Oqw8q^cMy}@i!%AI(=j$EY4soeI!B&7mjy3$h&eGPENHT zUj_qNQ3N)b^1B9Pph!S`$b%B--RAOV*r=HfE$1lp{pE2W-|@xg6=x#fc15Eb1b4>~ zfm`8wa3tqGaEH^OHMz?a?*3E^lBIenu6IrJtg2Pcxd0$g?^}I<_L+qcX7&f`)O&h0NTq$)Y_;kWvnwbPfwVvw|`)KhtWg_=Pd0 za3n!u`NUvnV{>}pcVV}!ZDVI;_k;JF`0vdZp`|NPg2a~hACSR?U7TbCD8t7S`&v8( z%A4!2^s{4n!r@95s^6yt31|3I)i@R6>o;(HFG&Sfqcuia8QZsfGjtCz0<^qQF>cmRSe!Ew=z(IZSN~Q* za<}*(APYJswR$5i+N`EU)?vzM=}bT=BE51)B0K7@aO~Jf^$&Mby95*?cjrXkaBa%W@gaLWJy7!X+X)Dw z(DsjnqCG2CPeJuuAG6%%3k|XgoBB~#D6!2M{xV0*`2VoO(@!M6DFzig4t0%tzoF!>UjK5*GTYi0~q3h+pQP5M@P z7Lx;u{*wa|qdxPu^&H_S!F_4Dowa6|tDRribM`Lup9%GP;*!|#nzOw&o<^Dv*ESmN z>TG4q0Dbv%$z+;bIi~W?D}{&xPVHXeg3YM+j>yqOUL~A%j|QZ%yrB-J9H6GBXPveP zi&Bwa$*MDl;$%r(N@^HB%C$iMc}i@|wX(eVm-|c_1bMQdpz!)os(#Pbx!PI}v*{I- zPzuwkr8TVF52xUt2s)noWYC9R=ECEOo8>x0+_$SICHR_sVs4QB?i%jCzYtnA)6C+G zXjlV&=oYD;zWU%=b^xu;6d`{v|8D6!{JSx|r~V5wysyeHD6)QkHS!FC`-DH_UMnHh z(05FzE*Z8kJeepvn%nf*wn+%dboa=f`{CYES9^xffWj?lz<-RdBQ|o?PI;KsJ8Pra zVIQGv`;^t~RCjn!o3dFzvr#oOL*`WXsMHjZOurf+O)AgP4qf!q@DV6NBzL-gl;~gI zl!WIV&C-NYIqqWX`bhB_7Iuq95Zd9q_n6e^j>AoSlj+2h)Qzz!?QhIf3WHlANMF() z!@M+D%kCN!sfIb0JkI}6UpI8;Ksq>4r1EotinyCGuH+Nwb2U6&dD}(&ki{^UTIYv#L>_&A`mblIk8wT zml`%}Kg(DeQKoV^(?ri6QmU!mBHc&P%!BJfDhzDd$C~gSY<5dma+7hPE;>o}n%&(QRuG6=cJ`B3kDT4wywUhJX$~d#h*bGtZ zjz1n!o>0{M_DC7|vPB^)L5@5^7h5eMq0K8C=M1FIA5+i@K;csj6qftLgW4=dA=(0 zC+kS8o7|tIKLsvOwp>6j)aYSc4}W*E7o;h|nGHw#mS3W2F7y~?&gjj|^HlYRi%_6O z-@JTH!*90kaDk38o02dEjo3=v92*J}9pe94JmfoaLCL@x*h1S<$TR*XE`BWr)u9y8 z6em3feTLzvJG3I_bD_E6wz|TqMh?n9$yv%&*EvOc4GJC{fZ-*lqO&#cFSwdd3C@1s zF)EIP=lhLG6b*^Q@0W+>k{neR+Qm!y*SKvFf|4n|4@(ZDE;r zqj&fkVx6rw*-95U!7_PL()K4bDU+&>eEd1(r5j=eU+>r}a(2fj71HTF!Yd57yPqZZ1~g1Lp#cQ)rht46p%DArk1%@l z3TEb#c4W=lw84kjbZmZ?HiZi7*^%(0Xau^gkA|_))gXZEnK7fRfZCyB-v6^l|Ls>v z6bv~0tgaa^F*IBc{-L|40_c@ndm0y1_~iSib5^8zlw8A|r1ia4#IYwhDGF<3YCONA zo3@{326p+!j13X7HG7^mP_(8jchF6%myx?U#KKOl`0>s8;ed+pZEhhvLp`9{RLG11 zcsjcWzAFF6D*GFNpm}>7{Nuzom}IV*3WkY5<}Y?7uNw}0wG)D+mIJlE8g3^3AlCnB8|V;$Q81Y2kGYx{EUX44eZPUaF24{O*J)JF+o+8>lL!7O zKCW-8(p6SAcrGn29}MJcv{@3sFyZMLfgcfE*mjt7$bFO4{MEx?v~IeIy9dA@&58Ift+vVmdKiO(-C&^;9CbBtM&id z26oCFlC3yFXhI_W#%m2X$Ze01&EPV6AkNjNjP?nBTwl8?)*TvRaSv+qSv_@6Gxc^@ z>Pa=cQXaJcFo&r+6*dZ=QG-YN|TXZ5A)t z%D{G~jZlF7z904Z@!}riFF;t0-T{74a$0DBkvUv+ls@Tq;Vh-UOa;&3T;S{e`LMoA zoL5L zfFWr5eXO00$!_0s{?#AMp3yR{2*gC9z31t(KA){N(0G13mGjezW^&gTV36I&MV0pn zZj^6SGQwDvl})Mm!}To3K*t=DD1D!0v9EAAeP*ZE(bw99o1jW0(TarivmUv6YE`^` zNSe=fiBiqK^Qu66or{#%4Uvo1 z#8xB$4Fb3--~}baj$P3LeIK>>KU%&gu7$tNx@=*n$dgsd z=WahA#sjr0(^t|3N$|Y&&--?(i}&|V54yHXuW8KtGWrEXg8xtZCRd3<94N${d*byE zzr;MT?H$ux80t$Y^%^pX&fPhjWuB`*r?SJV^qbO11lc@AN*|dBX`iVNF^(quq;^iG zw)YwuO>j+d)XrSChw@e~n6GVd`Ono?rX#>GA&(#02Q79-z;YRj22tJ}C>pysJj0!N zY~~V!TmWfo_tC@srHWL;EwDNw*YOnz3;h}iZUYo{xfuVijV-Z(5j^9j%>HFV%)x?D zL8}l|1i0SbiGR{-#85=%^9uy06Z9BNUOD`uEQS>iO%I3*J{VOssp-lo*9&q0KXdUjF98D0EtReyx zxF$=^_Cya36v)~B1)QY?C`t1TqpGQdvl0UuFatpsm6q(~1&dL#S{f3H*IolV){Cgf z345dc;~C8v_G*n`D(y>H^iz|$eG3vuR*PLr)38|JN9HFgM8m{*>e$x*=8BOB%StWjzF*iY>_A9T#1&&#cL zL#zf{Tw@?aln9-WUzAwYg}m|dmJSQmlrXrIw>?pG)K6OMg<)rVHNWK*Mv|%98ZU>8 zT=Lo(M`Tbnce@I!-qID@N9Ma`D*!u+nDj8;jQ#bD@9w6;H~aR8Rx=@0e)Zo)UXOfR zg7VKlttQ-loxF5WE`yQ>SaUO_rn2iDu^itVikhlB_80tSc)|YWl4eJySFWk$dWAnE z46WwF;m0LS`0rqmOLB6^!@EI?4~<{B{Ou~#S(?d#+AYHysx_G2W%|Wa^SL2V zcl-K~@NTGi=yX89=p@T%T08bHqejPmLa&_abDsRbwYXoWf$Y z&J;U_8fR?Jx<)0}!n|lM{`*C0>zQ(RZo;2hjV>7kA3TMhZDHw~!bwnTu63=--sc2v zKd*{mZ5JhNjUP*P4;e{@l|XEsu&`?5v(p)NbZ^<4Nga2`{B&m61)2Hv&PBCpm9g(S zTt#r-L8>$6n`P8vgKVGaLHw@yaH-E<$Ls3|ERPiO@(Q@_97vQPN%+-`-lmuh_&%=z zeR20E@3Z*U_jCUM5u%`_M~y#8B8u>6JQhnYRee z!j?HB3x9A+6F+#mby^Rt`ZfG7NFIyNu?7*yubh)q`5m)6Tk*Acs;t%P^-WFIkHT{q zEvHDFl&)J!u{>0CY8E=_VP6gDY$-W?10>S;koJDgF&4Wet$5WH7sPsL;hg=n#Cbt( ze9C-RW|)1^fy{RgWhzW44dy(vEJO8pX%QQgWPsg z*W8ljVC!m9>pt4pMwhx`@BDHG;kIWsX6QxQ{3!uh{mWudI;z(%xhSO3`EV9@rhR_v zy!q(O4EoDv!w5m`O6)`nrLEjA^bhHf8r_Neqz_8|j~FaORX*LPqxOLkp?( ztjyXO5qtLJJwiR%4Y8p)i((+8kaINLRFRvIedWKs3@w$#=5da!W34;D{L|+6<&acJ zrZUTC_NpsWUsaD43wJXA8{4~KVS9o%k6*8X_3eq(*jjtC)01;_UDe;xS(fL7;^w%; zCpq~@hUXCj^B;d&?U>rHlTXfHzS&7&P-V?#uRF)P^M_$}XGl+ydi;8)T2tE^rP|o` zGf2$W=zhal_%nR^3;S(#otYhH-A*>ueUDvNk5+9d>#y7k2lfi3p~pOJO6(u_wf|fg zDWo*Ars`$zkGF2H5|`6fLasS_2{vSeVdLvO9FE!@)HQ zEPF#BPfROCQq?88jNwPJlJGTsy%M1l03qfAZ;yRskp?XBpteB~3_KNK4#lEaEQ zBY~=}sR(;KHMiPosQPoe3wz_9@Eh|jb#*{wUowK?L2iCL>2g9W&h>rmzXX2|qPvH7 zt3}nMECp?Nx8DvxQ>2atCfzcPhOLQ}rog$+_u%xc=bTI2uNPxhqkDx1KCC#@S-Alt z@`@=@h7ZYg%u$&mn)Gn{jZI5MXK5MvRSh9dd^PRvA1ZeavvS)m@6Ge0!gVB}kL{uN z|0vL|gmVA_$%dK9qTr-Xjr=;!Sb8Csa9rJ!ooP8So11DB<#i7T<3UI#(La=l8k1VErC- zK(Y`(ZK1W7w|a1TExk)cr|II%O_;F-b=HT{0rgJbGQB9LcV{M9%tP{KY_3n)-lqF-}yA}xLYO_0<;W>HwTrVMU zw9kxs8(tJgpylV`fV4whqy7hnvDy&*Xr?RvF;P|EPXW&Ts5*YU&(!HaFCYIhMGRZ? z8k(Y&*A^_F?eKWR`JY{JuXtaTOkgd?EhAc=t45y*;)EZkliydJ6FP!|OGTFrut%;^ zWWaA-3L>vs4Q8{5?7SZzWbYV<+d+^>BRaZ!&-H6ICsdVqO<4*J*LH*eg628u;Y@M) z*gz)fCG^Rq08t`aJEZlGm5KVKB!hyA3QfUvosXKbL%<Bqcf>duG6iuLIjLSik z0{~yXRq0hiBDBITqm)-5E|iw6smL?IeTd0fpV`>)cp^1h<>jU}sm22r$MR6^q;Xm8 z1i+)ZRce~lWXz3IXrYoH*sQMk@NMoEw{)q(qGFMgN7}JDI^&f9$MUFz0etIaCc}kt z-9(dsQjctLdGT2vrw4TZiYsgyR`d~trw(7l>9C_Ho17y4xusx27h))rIaq&8oSzB0 z_RBSquT7`uU(o0<6_s4&t+~3W&DnWuq&3Z6G!$~Q(5R; zBW4_o%+UQIquu_Dug4&OZOmM-?TSsj7`J!iH?;>qipwRyIX+-SE{?aUGJanCtC5gV zU9DSf$AkktIlmmokJ~=Jbf;Y)O9Ck?Xh{8)bQjzCg9VONmSDD{Lx3H ztryGH3I~f=yl9{3N%vV;p)WADxQNy>Ao@cUvarHXl+XM5-1(5y+G+Vi?iVh_dB&sAI&SH3BrW9zYvrkI0|K?v-2xK3}id?I4g&XQ~dRFNE1j2onL8G|n@ z|L|4QPOTj)+M2%PDpiW@-~tIe=#in6$jO%g{qR!!8zd@WNWEi-$eL-i=WRwbU(1Ik zVzgwu+z`Np25U9ZcpX>rj4ohe*;ofp0mGxUel-WeWJ;w{FOq$rMJgl#c@7=Ln!%UC2S-?`bSfl-fUK$n{lgBYkP? z)$eLpdb4PN^}vspMyo!tk^Q8GI{_Ml2H#t|NW&MJW4e0e9d2epbCs)h`z; zQD2=nn(Aqm$o%QY*=j|=w+k`~C3NBJbUA5;CWW9_=wG}fMeHB|IAEfK9;MSYmUpsn ze9csz2-0s?AAJ=Z+h`4Dks{RI04ST_X_pmie@ja@g&S5+sFkz!StqgOzDJINVLtle z8%aH+G6MKW#sORuU#sm4T;+lOdeeVpc&c|VF`$mZct$CnH|(fB3l|m&bV8L>2Mu-8 zzt_^GEgK7MjVuZK$`mshrySE~hvpvjOWnkV+W|<_|NTvSEycW`Rvze@gW9UCGDZm1 zbH<|i_x`=n4}@bbTYMRU@3tQ!r@^_HqLE2v(UR4az(vx*G^pzvE zU0paS5|ztQ_;4j5Xi9DH`g%zG5`HZ7hsC6A=Ct%*epoX~o>!&7&Fyg6d3yM7L5RaKeX59f)He((j%EiyUsQB!0MCh)$9*MpMd^+#c4yuUj^EH&XIqU~MGxCh|#FG3`HZ>nis=tPS zt@pMQ-*UX4sF()+VVP|Yj5MNq1_oz!0wKn~wZb{E$&GFF6Jb^8n%3JG8(gT$>AlBz z{p0rjBPoJ0zkNt9dQblt35v|&x{k|0m z===Wo)88IubojF%*`}rnSu?I4h%=lA5c#eQ^0SqH`q62nUHCgeUkJ|MFFi8K)y47} zj_Z?uc;jS|0cf{1)-6#?Qq+~I;qrI(C_)SUr#lqizpMO$?37Xu{xEw(&;P5vuZ(JQ z>DsP9fzlQ$v;_)nvEmw}c!5$RI0^2-rATlqQi>M|6nB?Ea4+75Vj;M@Lve>MJ?H)2 z^PKZM@2~IIx7M3=udJ-hx@YFz_w1RyuYJuP&Y;(OL7k7$btC}8DB0pyZ{h2T;}_1% zR*_`wY3bR^p^uwCE0e6Fmri1j)cjMGHw?A>eB=@;MSU{-Dp*XPb=-~)T1%I!XL>0Y z@Wh@IId=9Wr{qSrilN-=LAO!uy9Iapk@qjb$LjW_Jjzl?bAnTB>nNu<)5NPrdH@>WmV>$VSJSC=mmSF99BZ+Ab91_&7tX zA{I4uSUHW|`JBbJi$N%tf-&8TfvybDd|*q56|$^2QfgjJ=pN_b<|X+HRXk*3j<}oJ zk&haYlzg~tsJBmXXw*ZDZ(lCi`1(hm;h@!nvjARGaQk*F!W2f_j2Vk&n@_OhxmxHJ&$ekqr%ABl}zXK|)4 zyabWxL3$YV$xKBs6Fw#Saz|Rdf~icPJAs&U5B-GN!I+BWTfm3Qg4Wow52-UM3Z%RT zY1Nb2rs@oxOIrJdQiV5U?a~!JbMjtOh|1p0SV&rIOfC4+tN5*@*H9@AqL)05tMBe( z&f&E>Nw0*krKBF;#&+5=aSrbYXPcj_+qhbsZOmzYMpQ4mkDtGszj`>THdXVmCCaCV zY$FjjBPa08$@IKiR_NH`aUn94f1|h5f%TI}0Ww%Ax z(Ra%$-k~mfeYip4_WbH-kwa*}=re#~p98ycJs%i=9f%r$ApC^Ig>U&Qp;a3r^XNWJ~8gMLS zBtt$A_9FlagejM6tln#+FCl&oGQ=-4#Un*x>!94b=cD1&w05~V)wp{PEjpH8@edrf z#MUlpR|)EiFKDvWz)FNO$5b|1-0oqQN=udeSOs5cjI@TI2!hT$b3L}>wa|(i|I%OTxDvjUtmVf4kG1f zc^}`~I%9=mCV5{mbx`}l+)w887oJmULOEUnLL}N%Z2!wlI+y^G6VvD}5X?_Bu%m*U zFR%7qdDtnQ}C%kW1pOh zb!5kpa#;N3xg>IR7_TLE4u-fkOSP*sV%{t1*j60T=-@BUws4-seRFbfhxD*{9$13_ z$j63E)7mhfbZDyfbiniUl*sgn4?d6R1GNAfTMxchq4({M4jdB zGKSZx#hFUg7f`!uA8r<=SWNA|+!54kJCR_Cif0G~u`FT7U%jW<@u-tVI)9g&+-HXD zPARZh z%P2{FYg?=&Mxl<1>aMC2e-VccTR?W=D9z-IvtdJep^k`HsE$$%+v5qdTiPBF#N?h` ztPg!^n{=3=RWEz5cidwK7IxL$>0jO5Wy>?xL%ZC12P8Khs(7Uj;ndj=@BW6?-eHMo z!@h|w+$*4VNHNsSfilb7$~O>t8z@e&jBZPFqB`| z$A$&?2i(ZND!h}ixTK>dDI+TMt>sfncAVm_lQZ~{O-t#05Ms_nQ2^++Dp#P3FM95v z;TSq~UBeqVvfHn0Ukn0T+msiVBxs4fGn*dkS|l7S6zF_$TF?13+28l}Z9Ko^M%!nk zsS(C5mBbMi=r1nno8qn0?DzR6N?nQjWs5EE$He6SNFgXRKyF38TLrP0+&1tP8LR#* zL?LeASQg|zoHWxmU~SyT zS1)ESmz6m`6N~`I<{1fFjDQL#;#5~2Ip>g{<3=741MZzEF0jzCB>Z@#6kSgr_aXe= zj6{d6e%^R}?%6<;>{B$Dga1o?aL)?UZE?1X0Ki<(l~sW_AKBA!CMK`;H&AM&f(R|3 z>$s7@?$lz?7@eascDb05s*Ko;qudHp`FrPdYn~4r_?9W}D>jC78dOHEzr~q!qjBlT z67^mAL&3s~dl$Q7NYmHd!W-H9l1uV>&FJil!p8$f;DWXZpP$+!`+gpWsz$IWcw$w& zMroi9v?|1ozO}KxFQu<0Is#kNnH_@9(Odt%i+vBZbWO1CD2(&I#*;uRgob`0+ox#6 z6q~u%64-%0kB5$$X6i7JkoB`QM4lE-g+6pY%q+9Ir$XK!Xlgx?jXdYU%Q8KA1on&8 zfDBuWM)3jHq*p;~3$^B)l+1l;tM>T)3^CJ=nztG@iMXon8IDdNPu|f$44qesWZe0L zZ$LzGQW8{wjd@(v)}Rx_1EgrC0D$sCUOfY=SKQ;(l@DU)o!>Y(bq_Ul%MuoXo^V;;mIkm`Ar1Wo6a}~g4 z2FtsugHR>rO(gs?WEolHUp`EBXTel0Iwp(Cz=r%Fa8^?CL1>bICN?jD`Dh&AiwYAz zRI3w6Jj%iwWEh(I3G%ir@RJ-q{urXG--wTks+<>v#mLCA;}=-4dYGwMch5w~+Kp}m zBxNDPWc$UCdgQ!PO>rYJDa+-(*Zsy~e883ug?8TZo`jFDw+1Tr^F41Mn^u|Ww%Li$ zBPDj*P%gfN7!5Mgjx^&U1ZYW<-S>W9vhv5JcH5^)rZ%0+o)o-;HAO3JMxiUHoPLfs zU#>fKQRu$N)i|H_y$%#>*D)$_XsU@pXyLaL4dqP)WCZFR+N_ z0K92f=9pR*vzd7G<$mAwq@p!lY?fq~FK@i%Fl8x07^9e7|WUM<3?F&^fPlq?_|c1);45YlL{ESXthN#`!2)5QF+n6 zfCx-<_rYuUnN&`!c6!#L4EEt_i`!$z(l4lr(BPKM!o%gyWav^((ObhPwZ}DhAW)Ul zHpkY4q8JqqorbI4Pa=r@{3w?SHu)&kC##zWGQ#pniN?sp-5>0kRlN-`nHTQxZ(>yk zNnKJ?FC1^C6$PXT9BzH6cDEtxyNwid^h^(32nLN1!L`I}%dtp`n6;y^eES6uX(7@5 zQ7-SFV(Xv+H(a(%)p;s%Y+`TU4)+!Gj5BxaWX9$9_mysXw?twe&Yj3MnyaA+{7MES z{^hng_yC48SV;LQ+1Ixn&-~*^%KH8MhnUFMyUb5|o0$f%RPbAg+|=@yj330R;Wd6`w{&F4v7{}?By1P3mb&frw6l{dG)l_6f8YNUD^Z5W)b0xUKmq(hieXlbq z8n6fDYIqQ0z11vrt#pK06|?Vi-&L58JJjz-pFh@PA5!Bj{Y_KByuJ5A*{6Zr{OK1l z=dQq&Hv$cF_@os1on`hbA!C*g+YQZJxHcNB>t0H4>vCsbB~n@YaJ9=cFxf3 zOYfbOJ~oXK{+!zK!+BnYr1(wsVHW!*tr_)!xXywI%y#+kyL-jOL~lhfF*zXN7vIfP z@9W1-jNRUat+D6b_wR3@dYpcplT$vazxRjK%TmOkSl}8j9?7B6u7S&{a@pc&_e3e& zfFew;15Lu$H0gD>Leyc6@r825(KCQnik)Kp~ooHr&pt zY=g}oP0TTwEAVqM;07Os=Fo~G=%B>`zi2>!2!*%+21mytGLtR(+9UJoab4`?Q2%OR87H}%TNgxkPpA1-ooqBaW|xgla6Grh zaIU^p3a3vc-W_P5n1!B$Zh~yiN`_#XO2K}qPHkmeZw_0z%aWJjx<{sc>hW{q@oFAG zK*q^K=OrZ_1S_yHx>bt0Kl^TX4@+#vIZ};_j4C^fUgT*!-{UlSJO$y&z-M6l?{2zI zqYk)F1<4D-Y9WzprYzOlg32>6hh3Q=GDn6I&}vKlnE%}W_fQjO)W=c*xXoQ;0FF);r7sc zZ-W)Ri_~*culeo({CrC1Mlj=DMcn#;yT*D_O8Yp4C*fooLHfA6CHdLNP{5t?JA%*^ z7Gb9wUDAoEMkqsy0EHs>Kts}rTV4eYamC*lt%;w9Kv|Ax1-KMRuGQM#-3ZY1=i~py zpg`Zc?Qz{D_gtoHR(C0JDP?6>IJY@#EXizLFly?Eta+Yl&f1Tj>VYnNVwg}^Eait1jT8!6yiG0eei$gAdKOV@D*MY( zvY~Y1Q;Ah^NoWqB43>hMZw#UAtt7WHtoO~5#zeSi~Pjw1?U}@o!*U44C>>T&?9eNwtQ~^#~?#Rw4x3~^b zD}B@6U>{73nSuO1$yp}bkH_pkxT{vQggy4N*;P-zRIbaq<#y%Y`+S3;bm)BY^|bx! z0k4-$J$AFWe8x;zB-lUG@^WP3hfY|Dy@~BUA6Syi(d||CQ^&y#i~z6iA!l7xF)h|n zFIEaI?)7+ zAR~irT#p4CulS*Qi%yS=OXz5s=e)mPPA$5?m!D-4Y4pEbr)v6LQ?$EA)&@tPirTGXqXb zs3=C46Vi^-_7D2#2PDv{`p{tHQAlGWBkbrF9f|b^RZqzU4;|1dQ-uq9HYt+XR?(3E zqe;$ccmqS{Q|}3E{Y|;?)w~l&h0vkvpSYVX--q@$vMDsPyyRk+hTr}g>+Ugkb(JA%+om0O($2EWH^@$)XdxML=fULE!nvDvpXrkWXDc@hr&%bzVzBIU>&0?$l zSC4<(r5wx#+K81QFlRAuSZoZI!C)%i|6IZTv~vFX{#Y;dO{ut0VUsBXx3$oATJGz^ z|5P~!GfNNyhNyG7;)2xm-tx@7zeD^T=xGtP zroYhN_*j4TKmP&?!$Y_Nl)|`q9+#Nh0YLmTnCA@#{#h}mDWx7fF-#N_Un4$P(VwF(t1p85MA5UlM}8>VW2nApW49BR`$ zJ6r3izA5A7aZxNgowznM;o4hX1ybC%%CuF#hYIdU8YoM)P^9U*=S0BDIG=O4G88*htU zf3>nx+D_ansuDdt_AG!0i$L_WTJ{Z1k^>^^>STqL$ANSOX6yJcA>XeXiW3NQ-V#M= zS~3N_9JGi_&+L$Kv6@Fu;@!U7C;LP$He~VGi$#FC^u!lYj+K#jB%a|Hs6N&!d(3U< z8qCp@E*DF;_f=jFcepN#Bywyon7t1a-^2Fk)+T+ovY|y`_lLph8CziS1<<^59@|x^ zYb4M6^GWY;)kq$9msNPw&(;}06_1|BEH?n4=P_Ezv{=>k9c32Xv{>a#pjA)3^&HL` zmb{l*?$X%yO|QB7=kU};@66r=DzC}YYQvkO`}@R|Hmsl4ahFf~^o?<2Up)>hC!%X~ z%1aG)5>_SBTM~L`u`O(D(Kxa((U99m3I92+hB)-n-qCmL=SIcl)FXJ0Mf%6I!ChAU zj=4W`5YX^hm|!|KTO z3(fPpmNtzm*Dur|jU(4z5{zjbOMr`2fl*DKe{^L=B(SB9{n^Nh7Rh3j(<~U$7&l|5 zzCNU)E9Zr**I2MBEIrJjbIgq4aOir%xejiw{Cc6T(PgzGmyG^h(IG_r6!}Ej(Ghx& zX5K8=&gLmROj&LP%gH8HOF$Kl8DVPuS}k!KmM8uNFq+utA#je$j;e)qkd)!BI(EZU0GH6NM3Pd-R{OnD#6bqMjKEZ{P?=^ zP$bq_mr=aTA!qoTMxmsb$ZOhX%;<@D-$HL?4nF=8FUPaEb7&R25f@H)R>9d z3GLAt_Z@ycE35Pp?B5Q|UySc`UJ{OzFoW%jvO4#+Hce=b;^L}OcoVY-yQQ(?5f~R# z+Wht@^?#nXYM){FlD5@zU)lbL@;8|B|Gocz<@f*d_-TCGaI%%7S+Tk~%2epVM=re2 zc_r}ZF9rHnWx_IlvAoJ$c(^wbSZ)VgcYSa zQ@*Tt#rZ#WEm`iCAL#*Ux#ilx%jNei=Mxl8b93U*hak}Mz+8toR){Q;9LYMeu8l5T zXaDsv5@PcMtyh@$t>uZ#LM>?PKcH%{Oe&byUt&G?hvD1}Rwy z?aMfI0UrJW+KQR|yfh63$LgN<>vuzfivH62TB8gS*qDlH|fk}C#oH3908%0`W! z(Q0j8TOl$-X_3#zN?GpS`2T6_{Oh-GD2A)uiI3Ha?A%3Z2{o=;8Jk~EXaM{pY~JQG z<167PWXC5BM&TQ&)`jvWzxT+EKFr9m)mfQ5V$iJIf5ADB2oRC&X=DBm^HnX&Z^1q= z)__7b3kk-MNDfx5N=fSO`)nUSnS8KjzFl6N$ibReUrmtHpN2_HlNnm-Q(Zm(*}+5e zg`g{w|FxmvR4t9% zHVJwOK%<*=bopPiuw+;4;i2gf(40I~SUqf~I1Y@lKoT=2aAIl~=vIfrG;&^g8k+JP zZ4tipdJ`aChDygEXa8*P8w9Vm#DI?3$Q%N(#e@KY#8MQbeQc-XMXxK9yCS`!*_yH? z0vVT9RtC$zK9!Y`$;saVD`}V~;E!M0JsGTIH&cRBDWh9%0BG*Q24c97(3sgz*+N-e zW}qO;#m&r_@45bDWa(<%uo|kk2*Vl|tCLbQ9#NmTlqw@0m3S7(Ok3w;tdOjBk`g}} zn7H)-S6jrTlM(=SMBEZzb5wn$(V&Fbz;Rxj?de*}$UZ`p*RZ z^Iwbo=BqpAfJ#k$V9~F+=Ih9owPC&)6v0)&AkF$-HD(^2ljaR(;dwV0J+#>n1x{KA72W^?J5)aRK+&xb@ET?LtoX2-Y8M;Lz;&q)F zg@tV&1WSE|!`a=)x5~_1+F|*x{f3W?Ee^l?R-0I^w#f1l(aj^N<>Uc{k2U(~8>dr_(6S74m7H1qdKbmogf}>*r6tXflk(ry0IhPzmR-YQ zlb+3QaL|L1sZc)MK`KMGtKO!Y&E0(ge?#17V7mqd0H5SI+f14dDZxEXsM8s`nXiQ9)GMG&fYndscj`dWf($i1c6c9ye8| zbNaCQ^V?4;Kj%BG3QLSl&`0NbU*nA%+tajtAK4aU5P|<5#MF<#t#lcD_Ehr zix#J4L9cmOVvSBcmp1^iuCV9A(h;thWMTN)bcvR?M*pc57`Hw378Y~7erD)houeMD z^IZ>W)OO9I>>w&nF+BBLmY|Nde8YAQ_nQU_t~@G41s@cYl*4V?n{;wiDKpF!U_9}}`e?LKCu!oxiRh&~ zwGVGXvo=T2M2%GuTPSR1pR{QBh~ZsCx^g7JXo$8~Z$Eq4>j5pBTiE~p1}GJ7`3+-d zzjFPVD4b?23{?ez62C2cSa9ZjJ;EeG{j8Ntm7olF0E7o#P=Ero34#OFdp>{IK-G~1 zzi{fmOJJXV`orC&%g^r)#LLO1r6_h;<}lUk5PfQfe$NvxCO{+?-+(ilL3P}#DKM_$ zvUehiT2;**R0kg`U)fxHFbf}lZY<#ERF{C`@RBOlrwPhlUD zgeuBC=>x~9CJvk(C&4#$ae~Uy0l!u#EU+5-!JuZPJ@X9osA|3i>iV*3*1!GOJpy`|cDF z9Ia1l_o_=SW2H{s>%)JLpI3Tzrt75pIDTrD@3LTqc~r-X6dQ+cAo4EGKVgBnQVe{s zhfE4FhP*zlZR_3ZM6<8QSGAznnZ47w?aeIu8tqO$dQ>?0qq-RE^YuK=u*pw;Iu`0= zeR^0`>;UiKSGtf+lUG?7&55tfHgj)sY9&}Y_N0`PJ% zMev3KA`WebUaj|z>YGNrh$2G(M$;(x7>kn9)5Q|6hvkt=8q)CQL!r*pH$VcR!`Hgq zBU(3Z+jOLhmhEXigVZghxkOpr2&m$H;Ke03F<6Xf-&?;z#V+A!zB}f%KWnv!=dO*a zYJQy6D~)a8)EzD|Py}Id2eFI>pOO7q&T3jtP*9|rQLF|Uy5sb$%6w2hIQQYkXx>Nv z9n-;e+vU`}+fOoN{IcbmYd;=0T${omuM?5wwI7;Kr?^c6DTosFJeQ&F$LsbyXQ38a z2OCG#A8Q5nl9Ca@v3V+hiqET3p*3G>+A_k#yz1YO)cO(j5fa zyB>+&MZEOF!8-?eUBVJ)EMqdn;O~&omhv7}5Wx30*!j0By_9fnx_(MT z7_g(M3okm4zo=n$kCd}NTN~PZ!_#`UkE5CTngIaSnZ)hCLko^`dG@MoCa64Hv4K5mY*RYe#YC{X;Ty2Zd_}CtJ zL`*-Zb4^5#C`%5>3JvxV2z)dBow1>a=O{d>=JhdyvEq8bS$CRO#)zCY^)~dT)rYA# z%D$VjK^At_f76r|<6+$2d{v*FZK5k9Q(!-Me|6Ja8@}OS&7uxIZ*uw0kus(DX}#p8 z8IF|Noz4?+F6 zLzvw${v@n2r-}M7W$quZkjfZj__xqQN}N}IU6O38#S5D zwqwDAeIypETVNi5d(=2Ocm9t5`wLgeASsb>Yry+z;AHItQbDcXY?dS0%R? ztMktjI{=o*Y{gjZgbvR7lUBpSiwT%@0ax6;SvSFHj}wE5n%!FfWBfASsFGng!1v*@yK?060=E+^|t>lJT}A6m%ii5-^BVbBh|uj(C~;YUnBE|Lx;)w0(a z_Ag(r{2*Zs)42n90&Lf1tUw^vyR>)HPp&WG5cI@FMcTH_!3xRzt>uFb>nS%L5_R*> z`XwDVC#%;Z?{AvvjGXG|?9l3sx1Bl0dK6o8{n|QUS2fujIou1{WjYZf8#e#m-afn& zuQlLe|6KR5R|n!nH)15psxQNB+N<0vm+p*r+H7=04)Lm8?w>tsfP@In&RtMt+pYA` zk|o7z7uMz>o32qsH_CAlNjIl3J)eUXoo;DrK?QO$X69!}8t+0nv(StSuG$F4ofs3qO{r z+yywdMhj4%oxH|>!0xD%rJdtmm7}bhRp6LJNbc-4O;n6RajSXq_>euL_M8)WML-bo zvI=%wZa~Y~K|65ct9`FPm!59ye27F}?PSI{@K(mvf!Dg-(DXhjzczP7S z%v+a9&X!C+qmXjRc(gMt0g?Gx5U=kcR~N$el{@D8)QaY6cd`F{07Eb|E-~?)?$|ba zx}LDQ_fT93Wk(B+jC>(=JUkt4)|+GNNiglQt83|h$FXfg^-|#FPQGF|mCU3o7^&~0 z51&Zl+hmR&vmm~(+0VNfA^`I~eCoMNNDLm!>lT$_P2?M0Ee|A55%!1^xmxowD&pDS zKQxM$B{C>)&!8gyr;|PvCzgV7J{MJlg`8ePm&XL6A7Oa+fyq)EWBdv*bZ|)hTk7Je zR9>}qz^~cq6VYtvM~!LJwc#-uP}j2BbUNo4)rBt|Jq6Z?oSlLpvshe1CfCZ2}jir}(CW~S(i-A3Y^ zj!Z?~XSfd@sI`vP>`qCEvgy7*AoDZ>X^;+Xr<~kKt5n;i%`iobT-r6O8jW3F;b>3_ z_K-#DTS}Qg@ zY#Hd``ezY-XCi zSHJXASH>HZ7_EVtRH$2SE{}Vd_XXrLRT&oS--sm0udlDu`%hDZ<|0xT3K<%-Ct@VO z@zA-FA6K}p6C94Os;UvXjLWD>a@!A*xHL12zqQ0`2-yjl=^^t-Kxf+9`ratwQQ9#FV+U|3A!H6XB?pLfT>-%KFUDtw4LkH3!!#i?9;>Vn7@gpyj6BnLU@0#HQL!^+Z+fJ(fZ~h72We-U ziYmU55nYe0!3mZyrk;;CjI^|4*#@cwpC~mnx@c|7yNwl8utJT&h-JOBnI^RG$~W6B zTUlqhscPdVk@kW)I%uV(g*QZPQot^2fi6~?KX5vK!t3hK0$QXBFco*`L3WDQl9 zRxlmF#0D+#gddRn-BiLX)8D4?&~B}T%-UeDZy?Yoi@{8~bAC`YCc|2_;TS_iFUk9r z=MUoH8dAja4QgQ7eubyfDS}WQ{S30DE&ezKl3b~wt428ki1Yo!y;sY!Yo8fI)Q4}A z6*rC4d6O~j} zZfel)UgxIhdJ2CKx>^Xn8^LBp(RSskgom#~V`m{Z>Rdd<=K1L9o&TbZ{e?GTAkmLZ zMENm(Fhb611ees0sYf5RG^Hyussh1;WkJ5RWD|+*`ejonz{lJ!7q4F_agR1048&Bd)_R2T2N$p!olQy571i{P7K|hDF8WljgOxrpKh}^h)Ee z)GVM?;Qwm=Z*BZl%K_HZ+cGXuucg0&$^VLH-omXV{~aT#e)W{#pJVgSJ8A`f$5_1Y z8l3-aI{I(*o3q4tT6Gg4215Ts`O5F|vxmOx|Ngpux8Peugvowk$?UiHpL^(=^gBDo z3g4| yamldecode(file("${local._dd_path}/${f}")) + } + _dp = flatten([ + for k, v in local.data_domains : [ + for f in try(fileset("${local._dd_path}/${k}", "**/*.yaml"), []) : merge( + yamldecode(file("${local._dd_path}/${k}/${f}")), + { + dd = k + dds = v.short_name + key = trimsuffix(basename(f), ".yaml") + } + ) if !endswith(f, "_config.yaml") + ] + ]) + data_domains = { + for k, v in local._dd_raw : k => { + name = v.name + short_name = lookup(v, "short_name", reverse(split("/", k))[0]) + automation = try(v.automation, null) + deploy_config = { + composer = try(v.deploy_config.composer, null) + } + folder_config = { + iam = try(v.folder_config.iam, {}) + iam_bindings = try(v.folder_config.iam_bindings, {}) + iam_bindings_additive = try(v.folder_config.iam_bindings_additive, {}) + iam_by_principals = try(v.folder_config.iam_by_principals, {}) + } + project_config = { + name = try(v.project_config.name, k) + deploy = merge( + { composer = null }, try(v.project_config.deploy, {}) + ) + services = try(v.project_config.services, []) + iam = try(v.project_config.iam, {}) + iam_bindings = try(v.project_config.iam_bindings, {}) + iam_bindings_additive = try(v.project_config.iam_bindings_additive, {}) + iam_by_principals = try(v.project_config.iam_by_principals, {}) + shared_vpc_service_config = try( + v.project_config.shared_vpc_service_config, null + ) + } + service_accounts = lookup(v, "service_accounts", {}) + } + } + data_products = { + for v in local._dp : "${v.dd}/${v.key}" => merge(v, { + short_name = lookup(v, "short_name", v.key) + services = distinct(concat( + lookup(v, "services", []), + try(v.exposed_resources.storage_buckets, null) == null ? [] : [ + "storage.googleapis.com" + ], + try(v.exposed_resources.bigquery_datasets, null) == null ? [] : [ + "bigquery.googleapis.com" + ] + )) + automation = try(v.automation, null) + exposure_layer = { + bigquery = { + datasets = try(v.exposure_layer.bigquery.datasets, {}) + iam = try(v.exposure_layer.bigquery.iam, {}) + } + storage = { + buckets = try(v.exposure_layer.storage.buckets, {}) + iam = try(v.exposure_layer.storage.iam, {}) + } + } + iam = lookup(v, "iam", {}) + iam_bindings = lookup(v, "iam_bindings", {}) + iam_bindings_additive = lookup(v, "iam_bindings_additive", {}) + iam_by_principals = lookup(v, "iam_by_principals", {}) + service_accounts = lookup(v, "service_accounts", {}) + shared_vpc_service_config = try( + v.shared_vpc_service_config, null + ) + }) + } + dd_automation_sa = flatten([ + for k, v in local.data_domains : [ + for n in ["ro", "rw"] : { + dd = k + key = "${k}/${n}" + name = "iac-${n}" + prefix = v.short_name + description = "Automation for ${v.short_name} (${n}.)" + impersonation_principals = lookup( + v.automation, "impersonation_principals", [] + ) + } + ] if v.automation != null + ]) + dd_service_accounts = flatten([ + for k, v in local.data_domains : [ + for sk, sv in v.service_accounts : { + dd = k + key = "${k}/${sk}" + name = lookup(sv, "name", "${v.short_name}-${sk}") + description = lookup(v, "description", null) + iam = lookup(sv, "iam", {}) + iam_bindings = lookup(sv, "iam_bindings", {}) + iam_bindings_additive = lookup(sv, "iam_bindings_additive", {}) + iam_storage_roles = lookup(sv, "iam_storage_roles", {}) + } + ] + ]) + dp_automation_sa = flatten([ + for k, v in local.data_products : [ + for n in ["ro", "rw"] : { + dp = k + key = "${k}/${n}" + name = "iac-${n}" + prefix = "${v.dds}-${v.short_name}" + description = "Automation for ${k} (${n}.)" + impersonation_principals = lookup( + v.automation, "impersonation_principals", [] + ) + } + ] if v.automation != null + ]) + dp_bucket_keys = { + for v in local.dp_buckets : "${v.dp}/${v.key}" => ( + v.encryption_key != null + ? v.encryption_key + : try(var.encryption_keys.storage[v.location], null) + ) + } + dp_buckets = flatten([ + for k, v in local.data_products : [ + for bk, bv in v.exposure_layer.storage.buckets : { + dp = k + dps = "${v.dds}-${v.short_name}" + iam = v.exposure_layer.storage.iam + key = bk + encryption_key = lookup(bv, "encryption_key", null) + short_name = lookup(bv, "short_name", bk) + location = lookup(bv, "location", var.location) + storage_class = lookup(bv, "storage_class", null) + } + ] + ]) + dp_dataset_keys = { + for v in local.dp_datasets : "${v.dp}/${v.key}" => ( + v.encryption_key != null + ? v.encryption_key + : try(var.encryption_keys.bigquery[v.location], null) + ) + } + dp_datasets = flatten([ + for k, v in local.data_products : [ + for dk, dv in v.exposure_layer.bigquery.datasets : { + dp = k + dps = replace("${v.dds}-${v.short_name}", "-", "_") + encryption_key = lookup(dv, "encryption_key", null) + iam = v.exposure_layer.bigquery.iam + key = dk + short_name = replace(lookup(dv, "short_name", dk), "-", "_") + location = lookup(dv, "location", var.location) + } + ] + ]) + dp_service_accounts = flatten([ + for k, v in local.data_products : [ + for sk, sv in v.service_accounts : { + dp = k + key = "${k}/${sk}" + name = lookup(sv, "name", sk) + prefix = "${v.dds}-${v.short_name}" + description = lookup(v, "description", null) + iam = lookup(sv, "iam", {}) + iam_bindings = lookup(sv, "iam_bindings", {}) + iam_bindings_additive = lookup(sv, "iam_bindings_additive", {}) + iam_storage_roles = lookup(sv, "iam_storage_roles", {}) + } + ] + ]) +} diff --git a/fast/stages/3-data-platform-dev/main.tf b/fast/stages/3-data-platform-dev/main.tf new file mode 100644 index 000000000..8edcb0af0 --- /dev/null +++ b/fast/stages/3-data-platform-dev/main.tf @@ -0,0 +1,135 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +# tfdoc:file:description Locals and project-level resources. + +locals { + environment = var.environments[var.stage_config.environment] + exp_tag = { + key = split("/", var.exposure_config.tag_name)[0] + value = split("/", var.exposure_config.tag_name)[1] + } + kms_keys = merge( + var.kms_keys, var.factories_config.context.kms_keys + ) + location = lookup(var.regions, var.location, var.location) + prefix = ( + "${var.prefix}-${local.environment.short_name}-${var.stage_config.short_name}" + ) + prefix_bq = replace(local.prefix, "-", "_") + tag_values = merge( + var.tag_values, + var.factories_config.context.tag_values, + { for k, v in module.central-project.tag_values : k => v.id } + ) +} + +module "central-project" { + source = "../../../modules/project" + billing_account = var.billing_account.id + name = var.central_project_config.short_name + parent = var.folder_ids[var.stage_config.name] + prefix = local.prefix + iam = { + for k, v in var.central_project_config.iam : k => [ + for m in v : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + } + iam_bindings = { + for k, v in var.central_project_config.iam_bindings : k => merge(v, { + members = [ + for m in v.members : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + }) + } + iam_bindings_additive = { + for k, v in var.central_project_config.iam_bindings_additive : k => merge(v, { + member = lookup( + var.factories_config.context.iam_principals, v.member, v.member + ) + }) + } + iam_by_principals = { + for k, v in var.central_project_config.iam_by_principals : + lookup(var.factories_config.context.iam_principals, k, k) => v + } + labels = { + environment = var.stage_config.environment + } + services = var.central_project_config.services + tags = merge(var.secure_tags, { + (local.exp_tag.key) = { + description = try( + var.secure_tags[local.exp_tag.key].description, + "Managed by the Terraform project module." + ) + iam = { + for k, v in try(var.secure_tags[local.exp_tag.key].iam, {}) : + k => [ + for m in v : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + } + values = merge( + try(var.secure_tags[local.exp_tag.key].values, {}), + { + (local.exp_tag.value) = { + description = try( + var.secure_tags[local.exp_tag.key].values[local.exp_tag.value].description, + "Managed by the Terraform project module." + ) + iam = { + for k, v in try(var.secure_tags[local.exp_tag.key].values[local.exp_tag.value].iam, {}) : + k => [ + for m in v : lookup( + var.factories_config.context.iam_principals, m, m + ) + ] + } + } + } + ) + } + }) +} + +module "central-aspect-types" { + source = "../../../modules/dataplex-aspect-types" + project_id = module.central-project.project_id + location = local.location + factories_config = { + aspect_types = var.factories_config.aspect_types + } + aspect_types = var.aspect_types +} + +# TODO: Migrate to new Policy Tag on BQ. +module "central-policy-tags" { + source = "../../../modules/data-catalog-policy-tag" + project_id = module.central-project.project_id + name = "tags" + location = var.location + tags = { + low = {} + medium = {} + high = {} + } +} diff --git a/fast/stages/3-data-platform-dev/outputs.tf b/fast/stages/3-data-platform-dev/outputs.tf new file mode 100644 index 000000000..e486411da --- /dev/null +++ b/fast/stages/3-data-platform-dev/outputs.tf @@ -0,0 +1,214 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# tfdoc:file:description Stage outputs. + +locals { + central_project = { + id = module.central-project.project_id + number = module.central-project.number + } + dd_attrs = { + for k, v in local.data_domains : k => { + automation = v.automation == null ? null : { + bucket = module.dd-automation-bucket[k].name + service_accounts = { + ro = module.dd-automation-sa["${k}/ro"].email + rw = module.dd-automation-sa["${k}/rw"].email + } + } + deployments = { + composer = lookup(local.dd_composer, k, null) == null ? null : { + airflow_uri = try( + google_composer_environment.default[k].config[0].airflow_uri, null + ) + dag_gcs_prefix = try( + google_composer_environment.default[k].config[0].dag_gcs_prefix, null + ) + } + } + data_products = { + for pk in lookup(local.dp_by_dd, k, []) : + split("/", pk)[1] => { + for kk, kv in local.dp_attrs[pk] : kk => kv if kk != "automation" + } + } + folder_ids = { + domain = module.dd-folders[k].id + products = module.dd-dp-folders[k].id + } + project = { + id = module.dd-projects[k].project_id + number = module.dd-projects[k].number + } + service_accounts = { + for sk in keys(v.service_accounts) : + sk => module.dd-service-accounts["${k}/${sk}"].email + } + } + } + dp_attrs = { + for k, v in local.data_products : k => { + automation = local.data_products[k].automation == null ? null : { + bucket = module.dp-automation-bucket[k].name + service_accounts = { + ro = module.dp-automation-sa["${k}/ro"].email + rw = module.dp-automation-sa["${k}/rw"].email + } + } + exposure = { + bigquery = { + for vv in lookup(local.exp_datasets_by_dp, k, []) : + split("/", vv)[2] => module.dp-datasets[vv].id + } + storage = { + for vv in lookup(local.exp_buckets_by_dp, k, []) : + split("/", vv)[2] => module.dp-buckets[vv].id + } + } + project = { + id = module.dp-projects[k].project_id + number = module.dp-projects[k].number + } + service_accounts = { + for sk in keys(v.service_accounts) : + sk => module.dp-service-accounts["${k}/${sk}"].email + } + } + } + dp_by_dd = { + for k, v in local.data_products : + v.dd => k... + } + exp_buckets_by_dp = { + for k, v in module.dp-buckets : + join("/", slice(split("/", k), 0, 2)) => k... + } + exp_datasets_by_dp = { + for k, v in module.dp-datasets : + join("/", slice(split("/", k), 0, 2)) => k... + } + files_prefix = "3-${var.stage_config.name}" + providers = merge( + { + for k, v in local.dd_attrs : + "${k}-providers.tf" => templatefile("templates/providers.tf.tpl", { + backend_extra = null + bucket = v.automation.bucket + name = k + sa = v.automation.service_accounts.rw + }) if v.automation != null + }, + { + for k, v in local.dd_attrs : + "${k}-r-providers.tf" => templatefile("templates/providers.tf.tpl", { + backend_extra = null + bucket = v.automation.bucket + name = k + sa = v.automation.service_accounts.ro + }) if v.automation != null + }, + { + for k, v in local.dp_attrs : + "${replace(k, "/", "-")}-providers.tf" => templatefile("templates/providers.tf.tpl", { + backend_extra = null + bucket = v.automation.bucket + name = k + sa = v.automation.service_accounts.rw + }) if v.automation != null + }, + { + for k, v in local.dp_attrs : + "${replace(k, "/", "-")}-r-providers.tf" => templatefile("templates/providers.tf.tpl", { + backend_extra = null + bucket = v.automation.bucket + name = k + sa = v.automation.service_accounts.ro + }) if v.automation != null + } + ) + tfvars = { + aspect_types = module.central-aspect-types.ids + central_project = local.central_project + policy_tags = module.central-policy-tags.tags + secure_tags = { + for k, v in module.central-project.tag_values : k => v.id + } + } + tfvars_dd = { + for k, v in local.data_domains : k => merge(local.tfvars, { + for kk, vv in local.dd_attrs[k] : + kk => vv if kk != "automation" + }) + } +} + +# tfvars files for data domains and products + +resource "local_file" "tfvars" { + for_each = var.outputs_location == null ? {} : local.tfvars_dd + file_permission = "0644" + filename = "${try(pathexpand(var.outputs_location), "")}/tfvars/${local.files_prefix}/${each.key}.auto.tfvars.json" + content = jsonencode(each.value) +} + +resource "google_storage_bucket_object" "tfvars" { + for_each = local.tfvars_dd + bucket = var.automation.outputs_bucket + name = "tfvars/${local.files_prefix}/${each.key}.auto.tfvars.json" + content = jsonencode(each.value) +} + +# provider files for data domains and products + +resource "local_file" "providers" { + for_each = var.outputs_location == null ? {} : local.providers + file_permission = "0644" + filename = "${try(pathexpand(var.outputs_location), "")}/providers/${local.files_prefix}/${each.key}" + content = each.value +} + +resource "google_storage_bucket_object" "providers" { + for_each = local.providers + bucket = var.automation.outputs_bucket + name = "providers/${local.files_prefix}/${each.key}" + content = each.value +} + +# regular outputs + +output "aspect_types" { + description = "Aspect types defined in central project." + value = local.tfvars.aspect_types +} + +output "central_project" { + description = "Central project attributes." + value = local.central_project +} + +output "data_domains" { + description = "Data domain attributes." + value = local.dd_attrs +} + +output "policy_tags" { + description = "Policy tags defined in central project." + value = local.tfvars.policy_tags +} + +output "secure_tags" { + description = "Secure tags defined in central project." + value = local.tfvars.secure_tags +} diff --git a/fast/stages/3-data-platform-dev/schemas/aspect-type.schema.json b/fast/stages/3-data-platform-dev/schemas/aspect-type.schema.json new file mode 120000 index 000000000..3813d7b7a --- /dev/null +++ b/fast/stages/3-data-platform-dev/schemas/aspect-type.schema.json @@ -0,0 +1 @@ +../../../../modules/dataplex-aspect-types/schemas/aspect-type.schema.json \ No newline at end of file diff --git a/fast/stages/3-data-platform-dev/schemas/data-domain.schema.json b/fast/stages/3-data-platform-dev/schemas/data-domain.schema.json new file mode 100644 index 000000000..d8002c94d --- /dev/null +++ b/fast/stages/3-data-platform-dev/schemas/data-domain.schema.json @@ -0,0 +1,378 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Data Domain", + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "short_name": { + "type": "string" + }, + "automation": { + "additionalProperties": false, + "properties": { + "location": { + "type": "string" + }, + "impersonation_principals": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:domain:|group:|serviceAccount:|user:|principal:|principalSet:|[a-z])" + } + } + } + }, + "deploy_config": { + "type": "object", + "additionalProperties": false, + "properties": { + "composer": { + "type": "object", + "additionalProperties": false, + "required": [ + "node_config" + ], + "properties": { + "encryption_key": { + "type": "string" + }, + "environment_size": { + "type": "string", + "enum": [ + "ENVIRONMENT_SIZE_SMALL", + "ENVIRONMENT_SIZE_MEDIUM", + "ENVIRONMENT_SIZE_LARGE" + ], + "default": "ENVIRONMENT_SIZE_SMALL" + }, + "node_config": { + "type": "object", + "additionalProperties": false, + "required": [ + "network", + "subnetwork" + ], + "properties": { + "service_account": { + "type": "string" + }, + "network": { + "type": "string" + }, + "subnetwork": { + "type": "string" + } + } + }, + "private_builds": { + "type": "boolean", + "default": true + }, + "private_environment": { + "type": "boolean", + "default": true + }, + "region": { + "type": "string" + }, + "workloads_config": { + "type": "object", + "additionalProperties": false, + "properties": { + "dag_processor": { + "$ref": "#/$defs/composer_workload" + }, + "triggerer": { + "$ref": "#/$defs/composer_workload" + }, + "scheduler": { + "$ref": "#/$defs/composer_workload" + }, + "web_server": { + "$ref": "#/$defs/composer_workload" + }, + "worker": { + "type": "object", + "additionalProperties": false, + "properties": { + "cpu": { + "type": "number" + }, + "memory_gb": { + "type": "number" + }, + "storage_gb": { + "type": "number" + }, + "min_count": { + "type": "integer" + }, + "max_count": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "folder_config": { + "type": "object", + "additionalProperties": false, + "properties": { + "iam": { + "$ref": "#/$defs/iam" + }, + "iam_bindings": { + "$ref": "#/$defs/iam_bindings" + }, + "iam_bindings_additive": { + "$ref": "#/$defs/iam_bindings_additive" + }, + "iam_by_principals": { + "$ref": "#/$defs/iam_by_principals" + } + } + }, + "project_config": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "iam": { + "$ref": "#/$defs/iam" + }, + "iam_bindings": { + "$ref": "#/$defs/iam_bindings" + }, + "iam_bindings_additive": { + "$ref": "#/$defs/iam_bindings_additive" + }, + "iam_by_principals": { + "$ref": "#/$defs/iam_by_principals" + }, + "services": { + "type": "array", + "items": { + "type": "string" + } + }, + "shared_vpc_service_config": { + "type": "object", + "additionalProperties": false, + "required": [ + "host_project" + ], + "properties": { + "host_project": { + "type": "string" + }, + "network_users": { + "type": "array", + "items": { + "type": "string" + } + }, + "service_agent_iam": { + "type": "object", + "additionalItems": false, + "patternProperties": { + "^[a-z0-9_-]+$": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "service_iam_grants": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "service_accounts": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z0-9-]+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "iam": { + "$ref": "#/$defs/iam" + }, + "iam_bindings": { + "$ref": "#/$defs/iam_bindings" + }, + "iam_bindings_additive": { + "$ref": "#/$defs/iam_bindings_additive" + }, + "iam_storage_roles": { + "$ref": "#/$defs/iam_storage_roles" + }, + "name": { + "type": "string" + } + } + } + } + } + }, + "$defs": { + "composer_workload": { + "type": "object", + "additionalProperties": false, + "properties": { + "cpu": { + "type": "number" + }, + "memory_gb": { + "type": "number" + }, + "storage_gb": { + "type": "number" + }, + "count": { + "type": "integer" + } + } + }, + "iam": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^(?:roles/|[a-z_]+)": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:domain:|group:|serviceAccount:|user:|principal:|principalSet:|[a-z])" + } + } + } + }, + "iam_bindings": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z0-9_-]+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "members": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:domain:|group:|serviceAccount:|user:|principal:|principalSet:|[a-z])" + } + }, + "role": { + "type": "string", + "pattern": "^(?:roles/|[a-z])" + }, + "condition": { + "type": "object", + "additionalProperties": false, + "required": [ + "expression", + "title" + ], + "properties": { + "expression": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } + } + } + }, + "iam_bindings_additive": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z0-9_-]+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "member": { + "type": "string", + "pattern": "^(?:domain:|group:|serviceAccount:|user:|principal:|principalSet:|[a-z])" + }, + "role": { + "type": "string", + "pattern": "^(?:roles/|[a-z])" + }, + "condition": { + "type": "object", + "additionalProperties": false, + "required": [ + "expression", + "title" + ], + "properties": { + "expression": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } + } + } + }, + "iam_by_principals": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z]+[a-z0-9-]+$": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:roles/|[a-z_]+)" + } + } + } + }, + "iam_storage_roles": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z0-9-]+$": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/fast/stages/3-data-platform-dev/schemas/data-product.schema.json b/fast/stages/3-data-platform-dev/schemas/data-product.schema.json new file mode 100644 index 000000000..453f81e4a --- /dev/null +++ b/fast/stages/3-data-platform-dev/schemas/data-product.schema.json @@ -0,0 +1,290 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Data Product", + "type": "object", + "additionalProperties": false, + "properties": { + "automation": { + "additionalProperties": false, + "properties": { + "location": { + "type": "string" + }, + "impersonation_principals": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:domain:|group:|serviceAccount:|user:|principal:|principalSet:|[a-z])" + } + } + } + }, + "exposure_layer": { + "type": "object", + "additionalProperties": false, + "properties": { + "bigquery": { + "type": "object", + "additionalProperties": false, + "properties": { + "datasets": { + "patternProperties": { + "^[a-z][a-z0-9_]+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "encryption_key": { + "type": "string" + }, + "location": { + "type": "string" + } + } + } + } + }, + "iam": { + "$ref": "#/$defs/iam" + } + } + }, + "storage": { + "type": "object", + "additionalProperties": false, + "properties": { + "buckets": { + "patternProperties": { + "^[a-z][a-z0-9-]+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "encryption_key": { + "type": "string" + }, + "location": { + "type": "string" + }, + "storage_class": { + "type": "string" + } + } + } + } + }, + "iam": { + "$ref": "#/$defs/iam" + } + } + } + } + }, + "iam": { + "$ref": "#/$defs/iam" + }, + "iam_bindings": { + "$ref": "#/$defs/iam_bindings" + }, + "iam_bindings_additive": { + "$ref": "#/$defs/iam_bindings_additive" + }, + "iam_by_principals": { + "$ref": "#/$defs/iam_by_principals" + }, + "service_accounts": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z0-9-]+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "iam": { + "$ref": "#/$defs/iam" + }, + "iam_bindings": { + "$ref": "#/$defs/iam_bindings" + }, + "iam_bindings_additive": { + "$ref": "#/$defs/iam_bindings_additive" + }, + "iam_storage_roles": { + "$ref": "#/$defs/iam_storage_roles" + }, + "name": { + "type": "string" + } + } + } + } + }, + "services": { + "type": "array", + "items": { + "type": "string" + } + }, + "shared_vpc_service_config": { + "type": "object", + "additionalProperties": false, + "required": [ + "host_project" + ], + "properties": { + "host_project": { + "type": "string" + }, + "network_users": { + "type": "array", + "items": { + "type": "string" + } + }, + "service_agent_iam": { + "type": "object", + "additionalItems": false, + "patternProperties": { + "^[a-z0-9_-]+$": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "service_iam_grants": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "short_name": { + "type": "string" + } + }, + "$defs": { + "iam": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^(?:roles/|[a-z_]+)": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:domain:|group:|serviceAccount:|user:|principal:|principalSet:|[a-z])" + } + } + } + }, + "iam_bindings": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z0-9_-]+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "members": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:domain:|group:|serviceAccount:|user:|principal:|principalSet:|[a-z])" + } + }, + "role": { + "type": "string", + "pattern": "^(?:roles/|[a-z])" + }, + "condition": { + "type": "object", + "additionalProperties": false, + "required": [ + "expression", + "title" + ], + "properties": { + "expression": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } + } + } + }, + "iam_bindings_additive": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z0-9_-]+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "member": { + "type": "string", + "pattern": "^(?:domain:|group:|serviceAccount:|user:|principal:|principalSet:|[a-z])" + }, + "role": { + "type": "string", + "pattern": "^(?:roles/|[a-z])" + }, + "condition": { + "type": "object", + "additionalProperties": false, + "required": [ + "expression", + "title" + ], + "properties": { + "expression": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } + } + } + }, + "iam_by_principals": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z]+[a-z0-9-]+$": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?:roles/|[a-z_]+)" + } + } + } + }, + "iam_storage_roles": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z0-9-]+$": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/blueprints/data-solutions/data-platform-foundations/locals-06-common.tf b/fast/stages/3-data-platform-dev/templates/providers.tf.tpl similarity index 51% rename from blueprints/data-solutions/data-platform-foundations/locals-06-common.tf rename to fast/stages/3-data-platform-dev/templates/providers.tf.tpl index 4089af3dc..d1c224c5c 100644 --- a/blueprints/data-solutions/data-platform-foundations/locals-06-common.tf +++ b/fast/stages/3-data-platform-dev/templates/providers.tf.tpl @@ -1,5 +1,5 @@ /** - * Copyright 2023 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,24 +14,20 @@ * limitations under the License. */ -locals { - _cmn_iam = flatten([ - for principal, roles in local.cmn_iam : [ - for role in roles : { - key = "${principal}-${role}" - principal = principal - role = role - } - ] - ]) - cmn_iam_additive = { - for binding in local._cmn_iam : binding.key => { - role = binding.role - member = local.iam_principals[binding.principal] - } - } - cmn_iam_auth = { - for binding in local._cmn_iam : - binding.role => local.iam_principals[binding.principal]... +terraform { + backend "gcs" { + bucket = "${bucket}" + impersonate_service_account = "${sa}" + %{~ if backend_extra != null ~} + ${indent(4, backend_extra)} + %{~ endif ~} } } +provider "google" { + impersonate_service_account = "${sa}" +} +provider "google-beta" { + impersonate_service_account = "${sa}" +} + +# end provider.tf for ${name} diff --git a/fast/stages/3-data-platform-dev/variables-fast.tf b/fast/stages/3-data-platform-dev/variables-fast.tf new file mode 100644 index 000000000..7aa193024 --- /dev/null +++ b/fast/stages/3-data-platform-dev/variables-fast.tf @@ -0,0 +1,108 @@ +/** + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +variable "automation" { + # tfdoc:variable:source 0-bootstrap + description = "Automation resources created by the bootstrap stage." + type = object({ + outputs_bucket = string + }) + nullable = false +} +variable "billing_account" { + # tfdoc:variable:source 0-bootstrap + description = "Billing account id. If billing account is not part of the same org set `is_org_level` to false." + type = object({ + id = string + }) +} + +variable "environments" { + # tfdoc:variable:source 1-resman + description = "Environment names." + type = object({ + dev = object({ + name = string + short_name = string + }) + }) +} + +variable "folder_ids" { + # tfdoc:variable:source 1-resman + description = "Folder name => id mappings." + type = map(string) + nullable = false + default = {} +} + +variable "host_project_ids" { + # tfdoc:variable:source 2-networking + description = "Shared VPC host project name => id mappings." + type = map(string) + nullable = false + default = {} +} + +variable "kms_keys" { + # tfdoc:variable:source 2-security + description = "KMS key ids." + type = map(string) + nullable = false + default = {} +} + +variable "prefix" { + # tfdoc:variable:source 0-bootstrap + description = "Prefix used for resources that need unique names. Use a maximum of 9 chars for organizations, and 11 chars for tenants." + type = string + validation { + condition = try(length(var.prefix), 0) < 12 + error_message = "Use a maximum of 9 chars for organizations, and 11 chars for tenants." + } +} + +variable "regions" { + # tfdoc:variable:source 2-networking + description = "Region mappings." + type = map(string) + nullable = false + default = {} +} + +variable "subnet_self_links" { + # tfdoc:variable:source 2-networking + description = "Subnet VPC name => { name => self link } mappings." + type = map(map(string)) + nullable = false + default = {} +} + +variable "tag_values" { + # tfdoc:variable:source 1-resman + description = "FAST-managed resource manager tag values." + type = map(string) + nullable = false + default = {} +} + +variable "vpc_self_links" { + # tfdoc:variable:source 2-networking + description = "Shared VPC name => self link mappings." + type = map(string) + nullable = false + default = {} +} diff --git a/fast/stages/3-data-platform-dev/variables.tf b/fast/stages/3-data-platform-dev/variables.tf new file mode 100644 index 000000000..1c23e1edf --- /dev/null +++ b/fast/stages/3-data-platform-dev/variables.tf @@ -0,0 +1,173 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +variable "aspect_types" { + description = "Aspect templates. Merged with those defined via the factory." + type = map(object({ + description = optional(string) + display_name = optional(string) + labels = optional(map(string), {}) + metadata_template = optional(string) + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + members = list(string) + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + member = string + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + })) + nullable = false + default = {} +} + +variable "central_project_config" { + description = "Configuration for the top-level central project." + type = object({ + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + members = list(string) + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + member = string + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_by_principals = optional(map(list(string)), {}) + services = optional(list(string), [ + # TODO: define default list of services + "bigquery.googleapis.com", + "datacatalog.googleapis.com", + "logging.googleapis.com", + "monitoring.googleapis.com" + ]) + short_name = optional(string, "central-0") + }) + nullable = false + default = {} +} + +variable "encryption_keys" { + description = "Default encryption keys for services, in service => { region => key id } format. Overridable on a per-object basis." + type = object({ + bigquery = optional(map(string), {}) + composer = optional(map(string), {}) + storage = optional(map(string), {}) + }) + nullable = false + default = {} +} + +variable "exposure_config" { + description = "Data exposure configuration." + type = object({ + tag_name = optional(string, "exposure/allow") + }) + nullable = false + default = {} + validation { + condition = ( + var.exposure_config.tag_name != null && + length(regexall( + "^[a-z][a-z0-9-]+/[a-z][a-z0-9]+", var.exposure_config.tag_name + )) > 0 + ) + error_message = "Invalid tag name, required format is 'tag_key/tag_value'." + } +} + +variable "factories_config" { + description = "Configuration for the resource factories." + type = object({ + aspect_types = optional(string, "data/aspect-types") + data_domains = optional(string, "data/data-domains") + context = optional(object({ + iam_principals = optional(map(string), {}) + kms_keys = optional(map(string), {}) + tag_values = optional(map(string), {}) + }), {}) + }) + nullable = false + default = {} +} + +variable "location" { + description = "Default location used when no location is specified." + type = string + nullable = false + default = "europe-west1" +} + +variable "outputs_location" { + description = "Enable writing provider, tfvars and CI/CD workflow files to local filesystem. Leave null to disable." + type = string + default = null +} + +variable "secure_tags" { + description = "Resource manager tags created in the central project." + type = map(object({ + description = optional(string, "Managed by the Terraform project module.") + iam = optional(map(list(string)), {}) + values = optional(map(object({ + description = optional(string, "Managed by the Terraform project module.") + iam = optional(map(list(string)), {}) + id = optional(string) + })), {}) + })) + nullable = false + default = {} + validation { + condition = alltrue([ + for k, v in var.secure_tags : v != null + ]) + error_message = "Use an empty map instead of null as value." + } +} + +variable "stage_config" { + description = "Stage configuration used to find environment and resource ids, and to generate names." + type = object({ + environment = string + name = string + short_name = optional(string, "dp") + }) + default = { + environment = "dev" + name = "data-platform-dev" + } +} diff --git a/fast/stages/diagrams.excalidraw.gz b/fast/stages/diagrams.excalidraw.gz index a7b0163b4dd3a10096722635787f47b551f505b6..62d08addbffd29dc89fdf74582ad23be821537fc 100644 GIT binary patch delta 135956 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

db(h~)uxh@k={w&_1 zE|A4sG9cZpPrM#FExH+wTQ80A9b&a8$IO;Dr|DXe1zAX1xM?z4oK5VpydGy`zGcG` z5r5;A3_v)1m=`s!e(_KM>P}hAuZ<{Wt{-;hSK-G`d@i+)E27Pxf|Hgzn4=&@w|jTM zK@@61xS?G_#o?QfY6KLH9YP*fUmxA~wJ=OH4_|qiZ*LQpJjkKeuA-npdq;;iD~eIa zJCrJC1F^POL=_UK(c`M8t}gw2t7Tsl4~mrC7_6;K`^UA>8N-`-bGGNvmq4E#q_J#W zHoEB)(4(;1os)mh1YbCp6mhBToto}D^~>En{PyhyfHeDj4nQJM;`v&ISmr}~r;L2` zer$5`ldq01eGqgof*XdB@*Y!=|_tUddAX_;p@ffEq9O3mFjtJ$3DL zcz~V+Lqt!c=ZX-5Fx?J+otFtpcC_IuLIs+8@{4c#^nee}LUlI7qwVd^Sk||^C7;U^ zgz=t7G4-@DuQIv(>+Oos56Y0Q@!hZ;5ZVMm0C>g9Jk4=^LBpE%rsn(G>MOYp3*FJ$ z8zZ+vWcPL_=_q0EIN-yYC(3fTK~R6?RZ4T~IIve)drqXh=?D)d{`U2PlgVy?x4*zX ziHsRfoo&1cr+R$Lz_s+ZlN!fmg!vCXpDLQWK9JK7UArA?jSDvdCe__y+dkM9NtgCoB0zX=Ng*aE;-VR(Y}e9(X@ZAr+{_xM+0gX?N&W^09Og-8{>+SOYsCgv-KBOm2JCs%p39FluSlg3jHeJ_xlw z)Vb2r>y^o*Jo<-$>h9v_{n#Ixix;0IPaal_QvyTN7Td19Kkt*WB?pq@xLxFN?-s)w zzl(20Arp4p{TMjC5)7|exT0qW;5}zt{PPlpkvs3~+;2d)6|girNcOS-BVK)2vykqK z&9;~=yuqv%>yjh^olD8gV*vF|JYs6im1UxHrKR$ft+m9W?J_bf!cE>+kd=yM``J}hDAEN29I6_rm0vJB0&}=rhxyb8&g~7 z`Nyg@YTd2T{};#lB-jjcn9K^mM|Ztd=f@lI_cyuwOcrfSR!q1k*Vb%zaxxk|aBwlT z)~C3?b^ox^D93P}Xj0?3KB>jiecJ@qX()WSsue4aY2V|TPLy4cBt(iETwo~H(*6Rf zDnzj&$n%Yp^D!b7+Zr%od=HuHKiXCguQY;vjFQC6B?X^pat<+|x?B`s#Ar?CE1h z7-K+0X(%5W;ppk)VkQ?sQ#b3*-wpuHcRJpFGPv!In%D)KYtNGy$z6`JajU1%RTvdW z>kV`gmiA2#?Ya;7ZX7u6bdVKs1_uAy+_LcLbOw_|C#) zQ#z>xJO4&AnP96P=;7?s9hMoANjfeP<1YIoi|McUtcevJ>ub%kkzys>Oa*b#R>DcL zY7m#z^%WD>4SbP;Ha5l$>gz^&4a?o-v1}oTJ)qsIzGilwcAtTq7=r8benM^I9+~C= zm{vgF{8=X+mLrv*h?gsl8M<)svX5%r%8TD zSDCa^GB&qQYvZ4tzv1jp%+-}5HtaWv%7ZAQ{TWJtwAilsYJe1y-ja;&{SItqcZQex zyHV13(ET!738D5XdO$kT+f~$A-yyTIH08qd#}MlnYsz-$%}Mel6)+`Gn|cyz5iCNi z5xF;qFg_9;Ut>&0`s0h}RT~bCq>gx|A+`Z_PDco~kEa_&8WBbMzZ)?b3-N=G5ST$* zJBJ{|ytqkL){*9Z(lo@pYGpoW_^E{^(so$O?yZ*!%)BNMrSWIo*Ls3Hk89-dH)I@u zbOuUfur5ei>gyHjqu3%p}t_&5=6oaiuavWutHXd$Jp{Jsr&bavyRm zk;)CcjVtPJtxtz=cl;0GUKotq9Z055>kK}Y?MBm^e2xP2uZ%jt<^+#0Y@cn4EChvk zO4tl-jt`QE3k#F316P}Lnyl|R3Z;wtq{uT2#ytwPmy1-3Rl!9+ZO4eQk|Mc|F=nf8 z9BEo*grs?XX}bONs*DyROa*UQVl1KAUhz55G>gh+2+)3ra|xsgygX@yOYYMBr7f8_ z_&{4?krU{= zr%qw_HSy>rKnw6k?2s4lHZdmQOq6%B@VUt4W`*-u%84K?mUvY=3c>jsH^%VMT&EL40`dxUY-VRaANRj4b0=bHF z>xnSo(1vV0agWUb?bz(UPgwl4HX_s2*IhM>Lw~wn<}8mbet<4(#vV!pwppBBzIG4& zq1^$_PTTe7s*EK7Av{mC1vry8h)gw2u1q2N2vPCjm$+f57j%sL{U1cW`41w${0EU= z{vU|k1WgD2FN}R!Q=QI*~_eor|*RjxXtMlK<3pG&40FnDpQ zbxygwwt(XKSix)bnIXHVF5j=R4B>u(ZD~1U(XZF7t?%A+g$@aFsNgvC=%qY)`xhwd zMr$z@2Th4@=dY9~v$m5_un)(jhBsR`f*(4?ZDw>c0-aTg9VKBggyj0dG1%Wv=(~PUxOWmb%JiMYIm*M|MxFt z(84iX+5?Tuh>LgaGo(xtlC*N1jt4~zDgOQP?YlafZ7@a>IJC-vLx@+iU;;`K>eAj< zk$Er%DL>ppJ2zS2|8A_#NsK&R=d|R3!x?z`$HE2Xz^d&l=FL*XuPt&Pcp&$V{>~(8 zK-xmN9mFnt!+a)Kny1QJH~D9$?|SI6+s5>yX|%VmK4BKJG<@pUGhz3%{)hfeCytuG z&zA?rwZ;pyn5Pe0^d`(nAE0NJMA-L z^U*JKFUaYy=*{8w<8n{Qlu-U4Oo4HAk%@)ZqS^i^|hrqyJZoVsJ*ev!Y%ws;|#zRqS;O$tex!_dcM zK$h_nET-Le%k!u26JqOkT3$jfUX9sUuD(cQzP=`q*gQ&L`7*q;T@fG~CHlo^^~DOu zUgX&?4oH*L)w z$FCay!#04Ai-6=q6+A{=D5e3{zu|DVdKwL>^B8QL`@OO$Y6UFeVn4z1@;~i|%vkjo zPJGITDM?~}hjezb4~MJa@E6&lvOBnH;@a#ib+U~CHL2vK4|=s6eascw;`;_juCUCw z$2ZKT4DNnf<-hTzWGlLf$;fNdm&D(oQDjLq=X=od*w7EEo!j!=D5J6O`t1-}3)*ydJsChT%}1eGH1b!= z?>&|UCZm!`WgVdZUN)UMQMGylW;|VEnb(2;xAOIT7Z~5^XrV|Fp^bI4$SAw-rwg?| zZY9*Dmr0QhVZw{8sJa_FkNv)TV$BK^4vV8RV3S!xAhbWtd zFlFH*!_++nn82H-1UsXxsSYC|Vy*m&hRbmM8uq&bJ|CBl<{7xQ>48;cX2NF+mTLw7 z@H5`%tj-5W;a7^=X>X)lKj@h_qk@@-XmofT8oeqWfQdyK%?nC^e_PQkd9F4CP{JoxpT3-_c^1ru3N zkRBuB4?F_j3k#&UkRAZ4UjCzFG;9Qo`#PdPzKX?%D^gg{`|t=dH!kU22=En zVbM5YFPXn?(6ab#cd zFwZK#ETgxeRv8?G8+v@SK{qi!u62YCE%$V3HC!vDq(}$WBYnaGF=2=?KfvT3#>epc z&mrX1Ger5NY{oGlEpYwor)5Ulqec1}q>&j`TWWIqGO4*}>Y}Tur|hOi=vBl1sP~ng zb9Rm3(7IvTQRhg6T*=6gOpM|j%Iff`zb4k$Sas{{Tx*7v&}Bpi@#8^aMDvbwBh!E9 z99s`CaG02{h?(lB^sFP{wjh!2%OF%JrlZ9!baAsU!HZR~XqX{Fv3jh)UpUYChfMGD zw*f0O(y2o3iOhql2bUw$-a#+Na=p1|M0YQ;$DWL{r}KfD>taG!R^L;% zP{Alg%}TiS-8iB5dP^S3&qotYdpu$dP6A`L(WBt8cI2iP?$O1)UjRg)6a>o-2`beE z&J^1AR&OZW&EJLQ+HGe*q198vLKL{>#2578|04}GQ*Bk^+u2l}&~jIrpy$(?LeB#2 z2C#C>5Q_m;ge$xN(uAW>&)e(%HCv@)N)5t8uC$uM(7K&sh(7UCLs9rYKkEHNxbK;d zv8kW;)X}=&vofb79C91Y*WJ{hNYTJq!h;{Y=ojs{gTwF?ZvRAg)XGhjKRjcZPPRb| zvn0e52f!h#_I9UW`z68A&eZnBL03SVNkr6P+SK&T&gi{!H>>uRDGZJBtx!T(QyDv4 zKF0(<5oQ&e$6d~mkpl*=hor0F@nSeUZtV9m&Y_&x@KN?iBO3=P7Z^nFc`1;_rJRs7 zwsUi7>QwF_T*t+8V@xL{F5)3KC>8LtNY>@O|9itfOU+8x0negUoT4h-9)0Os&TY>l z?m<T|G&!V`j4~)BE#)NLaQYF-KF#9RilgOn82u(Jvna@bu{;BNbnT!R70zmcR${N_ zA=~9VME4wUH#AFY37{pOB=lDVvCe;@-El|Hc92gMHNf${w{gCyy$;<@PrO{Y%CVS7 zI?`IKaLw(fBVI{=@!UC8o&SH@InfM^E@a^^@u;7( zXKUD)3*T?GyriDextA->(s|JGZuq+Xk?1&u5+Epb(TSW>N{0OToAl89!*A8Ra8U;b z4ZpC$kMZ{)?-BFGh``XC9|1?MpJQJn0(#*s85^v5TvoD~=PF|0e?*yqdfsC%bz9{x z!Q&Vkr0=3eSK;;-o%rD^MI^-+eVuwk^a(GVSzruDV%9~)^=ohH4UkoHZ0?4}@|6Uz z2r%hyW{@gNyScdi^l->CSMv`HOZtSfL{ibRviP+?38~6!^i4TWnrSkv&FA@awSsnD zFq!&bW6)w{pPPAD6YrQ=1Rg)s9(GH*23q}N#D|YCd?nNf+>p_U?Id~y44#ZL`}!kO z7f~j=6ZO2>`E~S!msi9(JaNr!EWO-T0F+-_u!+-Ms4V`kD!+z}MitNcLoLKE>}zhT zBZ()kM`y}&gx@2ye}tD-+JePCnn_pQ#l4Cx*ARYpTsjKvx@CqX3Ry;W~Fx$*WOs-<^RnqL^{9G3Kc(VloCHB60QPfdr}SaWb16W;C7qxNyd zwiX6KJ{;ePF7rK2z_*H7` z;XE;;Q)Sc`bGXlR$9eVdPQm}N3e*1=t8n^nss04;>nYk+T9Tj-jHp7%p5lbi|Osk}1%zI&lV=O6~!UsBE|F zzsS;_l-UFVU!3^7Ul@FU09p?Wm4zPAk0qTBkxvaK@Y)&|mBqXh`-`CfFU?~9`yFlIM?S9(k)QmqvIw3mUT zg%U?-q;IbJ)7r~^wj^V*6moO?VqoH9%B&D#HFBK)xVw#0nW3=Wrj$|1z0k8n*^?N8 zi`{OX9|0;?w_cl-r)q!X@(e;TdU-aO*8lz5+jeV@xH^v>lHF}O5T4c_FU&F_k`76& zB?n%BoAz3!6w|{Cuh(#f@yC3joZ>-`e|F3P;WS%Bd;u`9I5^k{lcakcw`=?wpB2T6 zH`G=()3F(UGjq)wdJWbgz#_?mb6NeQ?LXb`krw*r&m_v>>`1)-JEYog`@{KR>%_HG zca2OFD}@xlUirq$yF;42g2Imd^yYH$=om2QfA(MT`Qe_zLYisPLv1<8>fq`7^rNVY zU+^h8i1WlJ?m>H7Ye|RoxQt*gz|y>~wnmqGB`;%^es!g`X31MiUZ`~Ja{qPbWsj^@ zOvM8e&l3dm@c8@1+k0+(E=WWDzPR#e$fwi|9(By!LoeTTE1ivUt$*ep z)*OD;bQ?%6{A{_nT?!{cU$x6vLWNL+huR|{=uV;vm%C-GeB3)27g5ojV~USv8XURo z85K}E@RdqB+N25E4A_NHC8 z6Ho>v$w}8I%+Xo_%e+2G!Kt1Nj zbJJ{a{6?g?bw!&&p`6rzLNR`mzLjm59Jo>9abzf`K6ED$3qLp^84)(U%>=Qh$*h78 zxo^1@hL*x(>$tz9g;<#Af5Mn7pjxtMl#{Hr{K<*N z$yv1yjj^jdlcc}D%KFjV2T{kRk9271P`I9m;u#oR%uAu9h{!|Vd8ng6X}ktH$@Ms|f2vc~UDe!qNi zoU(*=7ra2?gW9ub6{rm&W^VYF2RM1#kHJKXt3@B&A= zT(R2J>rF!k) zo|SJa8d80#IyVnbPk(O!E7sfCA@hi)!Z&m3ofnK#1;16j=+nukl061Ucuu?K(}N$J z%Ib#eD8APm6RWrUdT33rs-!gpA|9-}ldYpnM9>*Rq>yPLEE0@LO`$!Q#U~j>e(8wt zO8Bt}v9-*07OwGw>fd+z=m_nwJfnmJWWh&-85o!^sTuT|3i9#5e6?yXbCbb~PX0?f z_B#2S+LOrIgs2HT?;jJ%aQE9g@N}w1n+D~W7#pozAVetGY|boy#o zTYRzgox$Oi`*ead)hO>cKI?DEKt>VKTkyNrS;@vX2+U6YGA?^ChHq93?%wcn)~_mR zUi@YGgl-ljclHd#*Qev{!#!%DLogXuut)IgRvfi*7b_8~Cw{&2PcEI>i`rKa*S#~F zxgY3&>GDnMAZ!%uw^J&MAa1E7oH}+`I~%@v z*fy}NNw*Qp&?RKxQ(btoRQAgX8%yHn&m3Z#Mh3gpeOCZBhQ!$bAkVC0_HT!fWcw*J3f(N(dBP&{EKzSQU-u z@yR9S(fW)fZ}V;yG*2ur8SE! zjf(uRvk@apVB4e&ZK@f2+UKLRHMCBBQTw`QTGiq7)TpXseQfqHfdW$kgC^ZIPMnnS zdH^JY8vuj-l~$N|XCc^6H>O>5uj?-dx+11<9*KSE`8cEVB3{v0l#bh(VV>6)UbsQ#SlxV@lffdUNv{xbLC5%{749ygyL*{yEvFe*y&S{@4p z`RvWrMRj0UQ~&AIP{?eyXorp)@3DsQ>?l|={fH!?zuIaKxGUmZE zd#5EK?bi0#UrM(kv?jGq{X)Ao? zfYrv|pwL}W_pKV-?)i2pJTLZ3tMFRnf|?yVd>!%9*RT_}7c6zS;UG+3_jd}}uKXN? zK!AfsT&G*;%+c3}Pl(qkWpiiy{u<+B_+1r$8PCaYp_UzjrVqheflSa^+h!Jw2o`+p zJY6vDGut>c=UaF<6Z1IKmIDZPghAe6NNuLs-rjmx>v`BV4$OQ%`*5xrB69LQ+_BEV z!R1?oM2$njm;c>TP;~b&5bSO7z|6NTPoUwg;w{{=-UKwSH4Up->Cvf*yk8sz1#U41 z6A(`-$k}I$ol^ZTIyL>s?mlr3Mo?belD3il3>QA@E+1b@&%+rSf1&3^0A(Atdq@haNs=%faIT{t=V@crIC2& z!I{lG`*yu&I5nR1Qo8e0|se3$zj1TcpV%ASI z@8xl~>N_r%#Y;y0o+J7+uIUp})$t(~&lwT;7O_iRJ?rAcx-R`pxi@#Yrd5i6|9q0vu=(wywt6aT7*6l3VecEi#AU%g zbvS+EKa(No^-=hk0JGlC?!GIohUiU}fHBJA0GS+lNW>a-Ci3*Egm^y3Uv6Zv5VlfN zOH@Fhan zAP?51FPiMq#;=U?{SEymL$Apn#7u*L_nnOA!a54?DTR-5iwq#Z|4LmVY-(LYr<~eE zn$n?@)R4j3Hi6H#vRr@VDB23NXA}GQB&?5I+zjG#6%#g+!EjC&zO~L&P5)~7p5H9U ziwm*0tEvMgJm#E#EXR5%*d+g(pF&*r9c-F{WfmAcF)F~#uUYKZr1%aDW#?Ne4obg{ zuzfPl!ie~`03pD_pZHVCKuIWwsOwJ$f^Sz)1IX)OwNKide2ho+9XZ~3Q26M2keD#Y zpAf|~s_qLhc~4+;vcWKUHop6lwmA)Yaz+Y)mKljdPCHc2`%6k5REK_3Aj42Sg0<=A z`B*CrHO0n}5U*9V`9Qqs&sa4I?^ORS53FOBZ<>SSS;v4o#BMISqzA)8*TT$eAS1BC z-~xU@_30<+fUcF_5ZH>iE+Uh=Y%tZ5yWn1RgW@qyri;>}Qjc`tH+2kG-rs+fR5CN0 z;f%c;8@E%qo5l8BA%Chag7ZSSio3o^Ey3*~V~oQg3`Bo5x83ZrJ-~h|l!l1j*vBHh z+u77ZL_fxZK_OJr?b$y-#@yHoet%??o2#}#=0n_wR)zpJ#uW}5E9N64NwY^!cEj9- zeFC9sew-=^f}HeH01SeO3f)-DkTYSkI0Mtoo-_}%FT!n$ZWg_N$Ni~BltTPa?7ba* zEvviDym_y@lPCEu^!3ZDT??JobtY^Q67^r9)`yI!%i&+;+6mT9vh-19Oll4t1lp!P zHeNn(zKbZz*W{ouc$bd*pVOz&H4zu>g!EDnTI1zPIbH}%{*%zIEaeY9y+0vyk`Um3 z>~(76TX!d`uG2gp)UC8%_wk)yb#p%bg-|eR5pGwey{F4 z4PqxB9*Z3UI!@N!M=u=fvJ|%TsTz<^Jxqh9spzUb!JTY~pVYspGVN8OW2mB969^+G zn2m$ku5QB5jyUZq$h8oYlsC{nC@T#KR{bXRHb$*iTDP%W%pzTI~tBwN?B_h-_sN4IqcCiiX$9*LkP)ch&#oAqPS!>Rbss`|!Y?6jGeJ zQ^MNrdmW+Cl_Xchre|rFArI9rQwm@idn@Ej9-a!WFqF`+v#ZMA8&R7>1i@1G)1%0u zG#IdemcOOI?$LBAUt=1r^cOX&cyR7KVHRa(ATN5%qd(zMpEO)_OEz2;dSpTf5QUe( z7lOCILeNvNq3#v^4y-*0=ZeeBuJcKqBN@((e{bW&>CEu_u9EPFKtMUql*JH_3ANHc zS{pxiVLXa=d&ZdDc+8&O(+z*yGaZTS5d+KtY`SX4{`9V^%;o2+7bwJ z{8N|=PenOqxP06^CK+U)FWjMWp2fivv_}ZpFkJ|iv!;u#9J4kU5PmP43g2Q%XEbfyBhdW#+*1vwT(}6GDFa%8 zHN1BlhRhXVn|La`ZWj#MgO2W|f2U{xTsfj3v6g#?*o)JnS`#!+`tqi#>bn**ZDxc> zSqJO&_Up>7(lc!^<;dq?I4&_nwbr=DOe}Vr0dtAt$?U;X^pLuU(9voE0Z)N)p2W5W z2Yx)=>`|;yXijHsP7oKEF(Zu ziC@anK4!DESsRf$Qbd~Q!`0u%xmi**M}JjqL?Po=-+dQ2Og$m+nqQ`tnRU6TZ|%@J zz+dHNOj8{r)Yv5yVh_EKc!m=bsjzz?$>dJjRV)|%LVP-^(O@*uSafpBxc=_>VSeQ2 zh;i}<^iq@JbC(R%^RM6BYJ7AL0fP+6-3Gqjdyi3N?ZV`24TrSVvq@cs^_rGvp<=+j zhCSS38&Wno)}Se!EuHCVBYV#)!@B~Yz70CKj@lXls)M{@r(Ya*)-W}dV-AYS@e%wKrzGXlS3X1 zzcA|X{ei=Azqw3Wa~jXR%wuf%cim%nRd14&;si4peF6N$98L5&|EX`^^hfZu3({o+ zf2ibAk1z>5SP!a}@ZntSN|?yMP0|s2py=J6cA!`mwDtv=cnbG){vkB{W($&?+1f}f zVz(Y8J70#@)YPU-c^n4;s6b>T{156gyD|5_Nw) z=rK_~Sl_8I^HnEjEAP;Qn^4vx%EiaNGV|d`hr-2ZfQLC8qr*=JbGIjxGhZGj(Rrj z4C6lE6R&u!mz3i-1b8|6mRnSn=(Il76L{BKbm!hlDHtQ=Ta|{VvDDt!?xE}06;_l= zz0Jr*MA3p+pfKc!ri6?zPN+|tFU`c`>Gj{EzWm%&cv}?1(qcZGxR-3iAE;$G>rWG3 zy=x4sa(l+Hfh^G)wPvADQodf#aW;jcf5!w1G3yWsQY1*;Y|!+Y%&+jGC^z6;%W8Y8 z`E{e>jiAF-b$jY7&*F_+0G`v1FS5N7J;vqOGg;rBL}>Z5YJq*VYkc{_0O8z8 zW-T)o%UG}`(=B`h>>-XHJxG*S-DizB#yvS~5Glg!Ff{o~N<#3W5!7lrlg?}{QP^4SAxFi0&W8T8kAPQ zSkyQHwHf8Bl!?~QNK-neSBTd6+eSU{yWos}*DZCF@fpZZ_j%3?%!6A`RdAXYooem6Vojku(_|F;vp58RCHa|)}_h?#a@%XT@*?np2&;T3)4RXDBh`g3C z>B8{>aR{?{s&KU!|Gm*~SkG3W7I1csu#q4bgp}r6qm2jzpn~69vAm90Kpq)8SiSU< zc6Mw ze0IT)I}8nu>hMSF({#%*KWVgU1n~EIln;62%C|cobcWj?#oA*aMPR>+n2;DBmg-|g zBx}IPPP^pL?XM|`jJ6Aa)LhhLze6fVEA|EIU-c#q1%5N1;(R!xb$%B zb{g~GDL-&4P}115fabejybnNhDnS(A+{OAu7IK61V|rfE3EWe_!}jIQkwV+JI_UEa z?yF>QeAH({+$Rd>MC|u3;Q`x~MhMu<;tD0O-5S|d6_n)nhJBv{X<#c5#4~USh|>y- zD~9}rl#te88jkQkLyLXp01{NJz9&zyh`^TRbs?cgAyQO94wOPcyDqMMz_m7 z)8GxKySK>q(%{@>keNg^>R}dUK0$1tdJHb;4dSq8FxnizztfxGfssM#!jNGVGEWC_ z(k5=%NjI5EhVFT!cR6F=3E+TPpzhFJgeMYH#m0*(2MJNd9~koTfCcUJ5ZF!_CI<4b zw&uoWm0+5<eENMh- zqFX;DjYWxk0~WHOsVD4o`}?f!;fj6M5VucLDlDIU4~}R)vB)@apZ*fctwm+|DaVRP zJs1`EQonJ7z63k(4LE`jq4d~J{Ih7N6v*C7mknc!F<$#&iY_#Z_ypPx=Ln&Fnpf8~ zmg)2bzA_<=jPs;?XQqUr{-*eQ;yVv4BM}O(2q-B0=s`wleBd5Oj@xNFDNCmIJG=4* zYz#D0>XQm)mygM?Rxoit7dork^J_ad6}^&g!|z^9njIa3Vc>wl8`?^WOYN7R1$^;e z7ROo;E$m0lJjSM@S&P%p*S!;qY-#IXvL~V-DvzC0ao4oA-598CofEoKA7ajs6F(Bk<5jCoQN?uG#JQ(W+h1tGmQtRg71P5r5gxa~)?nzy zS4`pII|N43fP5h

7T%Z!2`qmGkpI3Xny{vc#`X5dhA9T=eq6@rZJ0A>}lbF8-U{ zn%ouCT{n1p3Zy|UVHhZKEw@_&L=N zo~mH1TUhREzFmr1+*tY$4t| zIOxY@3G0ef0L$eu%96R!M=YyB%Zypv4ug%YkrC$O3m9)bVYTv1v$o5YBr1I-p7gR5 z@`Yd~@ul1FW|7%j#)3Xq+#pgs!{6Y})S&c`;y6BaK*#0FaLb#rCuO5c`Iv`S` zDSjfu*>T52Z!?POTG_{w^PTs1J-r~yH6K4cAj4-dksz(!idJ7$IaS>#(Iua-wZ@u< zNnDoC0^n{;t8-s^4eZAJk;M+9JPxGOM5w#O3v}*y(NZmLr%+6h?ETChj|2-WLETv? zZc07s7+OpIV!OYmSA3n`?v9-WOmZKXoK>9Cu4i}~Ts)U;%-qmYEE+xx2DKXwzW9x} zJ~(y#qgXdr9L6=bUtE0HGvi5TGamg{BX_g3J)W<+n5QyxC!*1}gwMiJ-6O(6fb$ZiT z-6!hMvG=jxSbN&>sz~7H@4&@jT!35nGx&nCrjgM8HbU%Q7ffFMS<*^^j4^rsXFdnH z&w{j-gz4M$o8z04>o~r~cmGLKZU=5*#^E3MS&q>yhpeS&ZXS1NCoZk75AKE<7DF@u z6-TnZa0<_dkpr2ROVA7_~(`5ib1W z>8O44EsdBDZFx>7=Y~vdXC-!#8hMp;Khe%}E&^JOesBDWDy>bQPT=^NK<``~Hx|YK z&b__cWJiZh#!+(p=c}sM=>E#jLIyMA)=o{l%Xl?KvzUHIBQY`aO>@6*yC5@;vUbEM z_M9$%JX-8~m^cUG+#-!Z;B7R9;3GYc26Zq7(fOtz2VXDU1T$lxa00@tJ2(CbSiX`D z*KN=&?MM9-H)$Pd2S^%t-U0+)PmH`*=154zlTPA`bb`(to0kD@V9jMS+KRZ7*4n%6 z>TFhM)faNc{~LYRXr1S>7Y)eyX(3^JOnL|7Zh`Yl$eSJDLYxXb_4SY+DTqM(ZFL9- zX?a0#+wCCjWr&$HX*T6C9V*${;mCJ>5Ze7fYYbB>5l{^f--fcT@vw`DOR z)2+hLuSWr{5a|?-hd*)k4j?Q^b@H&Iyu!e~{j@rMELh>Fv(pp~W)VN9BFiSPt#`8_ z%{=(w*6N|qKH&;vJ#un$dfzjaJz%omr}ZG=2TbV%d>ckG`H_bOk8jNzb|bw3OJ|=# zncIt~AA=8X9tI^x--OB962Hu;$FK=8zK~AgOdOwPNjt%8-xX?iV9zgLs;=iK&)cGC zK3nP1tk%9QjyBP6GHBf;{mB{6hD_{FST9^8Av~IvC6WX{Q!v}z-+RFm0fXZNv3Zr< zU`Nlj|K$uu!SVcoCTa_yF|TAcH-kzNes>Ri+`balEG{IW;XQEO3Uibidb0%C>smLMD!qqbD%2X*wQc-HYINvBI|&) zXu8QSg8G4@`>Nu3eS);7g0{t`3c>Ka)i`U^T_t)wGL1mDYDLm}elUV964i62hpbdxA++ zOftn^n^{p*m4>;nD;dg&NPG#sKgf81v&S6^AjNZ&cO~WB3z@rGIX68kUR?_$F(^kiy|X)~oc!g2D3q8BL8$n(7F>IrX}guzS|6`?d{QQQ5NZQq zG7?S(#QQUfZXUNW_?xZOo!q>?jeo6g({NFdVSl;{DmGUfSD?-ac2rW35q5YE2Y-rX zl+7Kgg{A%kTec7b(3}q6C%YR-Et?r$XJ?A-Hh4PD7SA1uUx5s>sSU~_O1~)yaf}E~ws|f^K4Kf=l=7}Oo|Lyy2I!!8k@a@mfnPh~RHQ^T9@}8{AfIbUT^R5SW zp6u7nw5kt$EH@7;dsr_U)uMtLg$rj5hw3pYVmpV`%K)kZ@M^w5xW@1^@>Kly1W@mT zUPS-5FCR15!c_2kWW`D8mfbqtV~yu>Ysc#EUzUKCd)63dCMQ+_yMC3ofe{Z((DyK$ zROSJJtez$eoPy||B3LY^)H%I8iv5dSs`H?^!)rKGB`$x&l2Gg_nwPKVb*|{$4)NK6 zvz*7Eyo+iJAZd0=edM-_Y9Z7XdklXR#>k+IXW;=PTT6>i*nzC6qd=ZrAj2RPL zw(W<&MS^j&AeGW0qOXlJUt+dt~OQiL2&$oL>Zxq`RQ zbyz9bPW*k<7MWi?pxWtpqZ_`5i;oVxx3N;d^)}&B5E8jypr#Q$7Q5f1oczSY`K8i` z{YJ+J2ynt_BDvtG$27YZ{^m>D^u!21!>x9C3HhsC$16Kd2krE|jd~>GCSYbS!}`Rb z9IWq=jXC{U213^Fh8E{;3wwcRA6C=^nKml__Q*b5>PX}BV0d>GE&T(zOctWaaVug6 z`o^!iM3$^b){l$5ACVEX->8)&t(}>ZW-gbZ0mg2pn92i9d1Rc(!gqDYI$5YHKBAPp zI|%9FzL>e#cIPhIPFtKQ%Ajb`Ta$@IfQqj8nc}*iCmbIVjVK)nM7?&&8wguL0hfzs zMw`F)r>D59z$k@P#J8H9+WsT}X&_dr=NC($5=}z#p=YqJz~l-eDJ|ZYgoMYL7|F~| z!1~(L+e7s@i`|2>VU~fj6?d>NrV|vwZLdOur*DtO?G{!ARN?a467?m(y-g|HiN3;J zVzv=naI~YE^_67TVeSOWzdjHbcJZ*01y)+lts!HU<+YA`6tK|h>!X&!HhZeI)78Ga;;b_{Ap9>Y#KJkBMyzRxWK1_b&H4MDXZdt`t00zzPW1XVF4kRnoO{>4Sr zH-RfuMeHZzDT&ozwU@y|2_*BaCNK8N9b9YW>B>iIV*w+pnbVh#Tem(}w~|Eb8E%=Z z>nWO05;G#LmTbzoZ0kkU<1^Ibp#xHG8f$B>dVR5&5*UYQ&=k}3EtoP~YP5ww$xl#i ziB)-2!(Xxi&a3E9ci-Bx#bWMEV&%l_L%4lK zP;iQ6_KS?ddToIx+izlhFm3l_m4%C@#YR^n+Ej1do9TRmykrN-Mtm26BK zma3Li-SR$K+H)?7tNZD~=WSR-^WMBGu2|8K&=cK4ATzEiqgYpp=PAFLvhKcKi1Hn{ zvN=QL(sY($=(3-I!Cs!+x^r}Ejp|DKaG6`f&Zeu=A9=7-53@Tw7ESql)mEG6Zy_+zv5#$a z+Sh99pKgQa|+ znKWv`dMjk|WOL>Onyhfpe(^r#xoEEQd_)ToXUaH!4aXvb^IA6_Mx-YR)2+cZ7SYEi zh3Y^PfRvvxqapSHM7i8jIM1T#dLvb;@p{tUB(ZJrAA!!c1uW82F?O*Ap=bRi2%U;}nh3h$ij9FS7vb`*@d>jG$0K+#`N z9D3fj#gyIrRM@b@B?TfP@yYo~TK6(Ndgw^#ItsGnmW*W*zrQfU!VLHl8hOt(-MDet2qVG)0UFVe1|n zyx1I&zU_T=d!(Xy)Bi9ooz%<~_m-2-I-YJdO|u&q>DGrxRp&hlOAg>@9{sE?HfKV6Wnw>4*F z?{V6lQke$>lsEB<=5an+Lvp*gCO();h>~Zs`8mdj?A+at@k4?DxsUIr17G&;V7Tf2 zfSY0opTrEmImtQ^iq>*K{L=e>bF0QwTdq$ecOpTl!tVNTNjTn-gehz{1c4tgM?f~r zjq#MCdiO1->65)%5B4pA3(Zb*OQ{UTXQRpLYQ}Fz@_~o&DeV|zstdQ4XjV5yPtJ}? z9Zpy|uBtWLtqp5`G*97>u6E_l&dflN%FHGpr>94Dm z>Nie<0!4D@5U8cTYto)<>;=5QD5t15f33?Hck?(&#+uD^M61Z=ru6K4p+?ypOc`W& zc5)b20s)cxKsi1kvT29h`+(g61ZMH=EjW`V>EH{jPsLyA*`eU*!P%p#M0coo_Ee(; zLzt77-uilgPX;5ZhWqCY$zCIDA;K=&CRRDSVJ@Nby00*qoH+z3c~9?MPXX+5l3u zEQ0g1AmEWR(u=3po~%uQ^BNZoy@j;)Lz`EfvrMAZrn{?$`F@g|5MsTh7V}@nS01jl z?pv=yn$buox{UlsH-jfK32P{vwY_IH!=GZ0Df~P-8J+`(n?Nkm_6j?Twb-@Z8IS@j zCfv-p!@O+Uh_!E<*Q`HGGpQLC_88 z5|!x7_gt$6dx1HiX~~b}Ta=qXO7ISJFo6b2=BF5($v|FAYC5z=+7cx_40-6MiRks8 zLPdsPaF8v+d0$CiG6u8b7-EFLk*v@4kzGWJZ~0u8E&o!O6JL7cSa7!>1T;gRztdeX z9I_Z(FT^xCu9lXvdHrG!TKmfA@8sh-vdr{=U-eMhZ3xLg>3$eOmPYtm0SqtY#zHY{ zMf+mQm#W@(zly922kEUY7Fs75T!B=fRRlI7eW%mgR|F&FA0}+GjzuGOOSiV{tCV*p z3R~1PY=$RF0%*KZ$LTQ-H#S6cIrDinkHjCS1h1wPseg{QE`NhpsCFB+14T)H&%11< z*?yag6a)hh^!F~L0Em)a`}#=`d|Ul_H639F89Dm;!|^F;zxcRLmUV{8q7(0gRo>BQ z@9xI_=JGFt-N+*-6q2O+fGhvGtG{fkm*MFHic1porD`xEf1q;M{Myha1*H^Fl#N;z z<JlMHC!|1i zSeoQB-0ki0xw)khZ1^g3{T5EN)=S%yhf|Y3_=Fp%Tvr;P5U{K)^Vcs#P{yPmcbX1> zV`H~r3Z!YW5|zlS;?b+B#W>E@-lx2xEsIlI&$ODUgCIf>V}J4E;^+P-wU>NnZ9WDf zmupR_KWc$B1;R`05`^3S7C*nDOpEo(66DJU)LHy=H3_Jz_?n9aCRK|!tQWzfu(QDPDWrj8(K?EHeoeicc&TqHK7@wZZL zfS~Z^!I}OTxnjK0Z_JX00{r>MUAYC_*v}0fk53DOTYSLO?~fIaJ86eIkByS<6NH5v zJ&@|qPeW?xO&Bf4D3=P1p!nA97gUP6l$R#tvM%c87#nnPOtRm zna?k+y)%{vr-sh@1U89F83iIEG5XhGQ{lqpjIbv&<4ZFqEZ%F|R(tI@QBx$ht@UTo zlODj;$aZZiY#hgM0qlgng?^1ICaJw6A?NY~5kHk|>hgMv<(|fo5CgYnK+vwl2uk5- zb&Dsf09|)TuTT;c7W7*u!iE=MvbZ_V5mK&bAk$%pnkc;ZgNG}#U2Ea>mB4oT-kKmwcDuHeAZxC> z00g4xdZs?o{_aVTbs@;_yKG;>K^x_Id+l)QU~h1mr2E93eh~oaNFNVS3x$uwCWrYk zD7(*FYV4#B{U7|r{lEB2Q}}%SG-bB3-=7(=M{%=>t?yrcx-Ua06w*4QHJ4)EY0_fS&)X9d)rODnz0tsJjHD7WaX*LL15m$6HtSH=N zAi+q_$d<+V8@~1&a}v6blibfWC zTaG)zH2(J1KiaJ%;7mAaG<_8wyeuUtgl}aj3IWjfxp=~}ALm&d)Y&Ld^)W$U2RuX; z4Qz$$ls~R{xTCWg+^P0=4iRo{3J`lreY%`g{_niEyH6IX4#_qr)yILzVho-2K`57c z?sqHr6o7kT6);z6h+#Z_$Q#z#8yQUUY|gW77*2|}JSGCb3}PU!K%~uFMDGNL^(oqlX=g*JIPOBBT03=dY4?d7Bkv0B8$r>2Qr<|U#`U~VDn!)g z;;-(snDq7#A#=j0(PIYGZ%<6dYXr=o9u@m)4q=~ejyfUxf{oUdE#fzA*=1( zL_4dm46XqN{I!joBlorYj(x6Q(2?EqAOqNEwuVR7g306WLwlYYMlVKtmWM|LiZ*ra zO!XZxw$pxyi|}=Ex4=N5&c>QEP7Y#qDE^i5g1V`36XepNq6hf-7CZ8i zqS9XSE-kUBONbcOI>Z@o2r zp3(>i_06Pthlt6X65-Vxdm(BYcd^}}aj9-!6{JlUCu!@K5|=~;tZd%wJjy=IGV<2kFKs3*sy|!YnILfaeJ^NYC8rh3z$^qaw|5G(eLwz#O!DdK zvGN0ZJ4dQLghFLwv(SvT95wu4uzN)#yR04HEzapSqrLt<@L^`zcj%?0qA?7GYLlcJ z&|Y57e^jDE`7GU?U6Q7%ou7x>M{yVSDo`NN>OHU8wqI8EONFu}UV4aO>m*`t?fvaS}wLc*i| z@Jc{2P0Po@E}OBzHjQo%P$nlDsR^nMqqI&a4ADy}JJ|u!L&`*#fm&$6o3W<;-cW6N zxeCFCQ54B+|8`dAG4PUza~tNqW(P_#eYimhjO6!~A_k2ITsr=|=}tL_@bGvPsBP|} z7}4di8+Z0&$)Q-@h=kdAjWQ4f5OCkwa&iYby`@i&XhI-MKe+?rT9|ZZGSV`3kLE`> ztQo^O)HQHI(CX0JI5t{X-YSZ0VUOs^x1d=ivRqBMX=w&8N&_YYz5uFX%BuP6a1ohr ztTH;iP~DS1voe`*h^sSpoRrm_}`qslf z_2AT)L?xqiWr%x>a9-P{rcUaC0+w740iQx6owWc=(++g5#i99ji)H)gU&58`$uq%X zi!=VzyJT3?$-RzyyWf>%g5~f0F(WO^_RRLDpieCRdPd5XwUfFTJSivPQACMCA)QS$ z5QfCZj^@^tf*`@5J4hwl?vZlrHYe>JZ{6rNaoc>lkknooK-q%Zur{c`uF_Z>5oV6k*853itYHR3oN|Ui%p{wT5SPa z>{PQ9pCW3#mcM0HjU9jEpDzf3BsPJl_OI5?d2p^Pi~M*y+SblZuB?mtoG&grw*D^@ z(L6tztm{+Dg?;S58{1j60;*3OpjZ!GlHCMLTQ5Dvxs}i+(68oLOIv!L!BYIXc^R44 zKQ6&wi5Q5g2*K6SpBqf=*2r0x+KoZeTJ6(IZ6!A8tCj3Pk8eYeD0CW-(hZG#+usZchm$^zCU5sS)o56-RCBZZ;5q%uRDF}nPoUx zbQ$_6gyqMu+s;j^^m?`=iP~)q$2vm@^xhQPYl@?*S6B6Tm^wHb5LIagz0`#Ci0#NfaP3ERtE8^B93GdyakY-;Kw=k0w)0jprZB3iIdxk9kg<# zA9jC!D7!1hJ9J%qu2M=+6$9pSmW^k>mcdzyg+!}s%d-kYHFOK!9BUD(f01|t|EMQDSLJHzN<5} z2L91NJ}Xdr15WHp=HwH;c2G5fX>IbQ2n{}1bW=$b zrSHp*o*!tG(I{9zr~85C15Iw#9^(p6ku?j1V+a6Gz)Sb{bpu_>=g-Zmbv^98ukX%_n*+aE-fYI~Tg$xJ zDzVBD;uyR5EJ8Bc*ux`aA0})3?4UW&^EyWl(9%U(D$1xYS~hxY8(bKVpZi*-N|JgL zIQ9JHa#M|*V%{KW^pmUr^6f8iP_Blal}LPNqaifx?Y z(E0&@T=e#Wu;TkD|1=gA@8dmte35Z@r5U2f!0Vf%(LOH&!T)jbw`uMZsXB<=H=!$k zb2d3FmI2@QGX!-mN)%5={VYNvT)?xyOaCMWp7mEgu0`u^NbJ-HWy zSCQ{Fli>`Eqq=3G zs>s^%HP|sOaHieenWZESO2_q6wrc@R)N`IiF3TSIRMum?sEnx#mmb==SFghgWhePcc$9;F^eoE@_zuX*iPF)kIe~{mzJxc7bH6{pF|L?2 zXWG-3QGcP9LIEVm+A*b9Sab}+(t_Tg6l(Up?vrgkwe{YU`wrxrV#S%0RVi2hPpyC* zjFd)MPQ&NXw5}-LEvD%&6AJ3a!*D}E%@|0|CK5Ls`=?jfPBQ#Vm5^#03}&I9F(L}K zLV!1m9UzqJS;)iu@S4n#NN^U(I_qD*tp$Yw0wi z_bK~_v$}{8$*LZIN;A`CQZunty&d1941r?%@bnggK_5wAgNuVU2<}Dd_F*5UDmxiW zzaeUAV;}48Z?@Td9p!+)GynWCy_J(4#LS8Z2PgCK|J5p>KfwUW<{ZzYUk!Dw4gF>y zwfu>(wr5I|259Do zxLReZ{L{s0+w+0^H}&{e1=OmI1#cbylnv{tvo{rKc&tSZu+!)IbEa|6NVJR>>r?;A z9XYuL$;vv-)`}H%-XSrq_zAWTvP5E`^J@4s-DB68`q(-=TAM7NRw}b@K7{S1;JEp| zD*ESk6O<}@p)$)+rIx6{Nd#jnHs?er+PLfT@C)#Hat#4zb^>?vX(vtRx(zdig5l_Go_$vDgnzW_%l8n3KlbD`&+jUq2$Y<*t4R-^P?Qbsk+5qd6l zQCy6uSsPGnRQ#Rhr`tUQ9utX|&*5HP9h})D0io!kOzZqUab>+78lz~Ai;MeeqpbX0 z`>L9iecOB4cBxtL#0B0R*=oMyEH)|do z#}a!Y{XeN9|G!cN>NFDXyFqZQLf{2^z;n3uZM^9I_a9rdFrHsYM@1>6PcM$K5#s}m zJB_>L!4xZy(4lZd$Ym;6za^XV{3rv^49TIb@I%uh;4CgyAh0%&S@>je>AnFYgb$*oAx;eM$(h9gHM%*iKN(@sD%Bi1ZGX`i~z!;Q z0RgoZ_FqxPE3ED3UD7RCxjr<08<_8jxe^@Qdp^bHpT@x!s=9gw;dD;He>}-+As#y(;R~d`C5V#z7^NNk~)1O@YiK3b3P` zdY71_yyB~RrM%`bVw~-MjM$6~OgzV4L%p^B5QGgM7wb2M{n1$bGE|`8Sp!*170xr| zBI%p&>FuSllaoL@Wstz&sC-3NWoY7u&&^wk@KK}{!&FqQ2`dAq#XqWBJyrJgcU<2{ z`qJsbQ_Imhc|#8$hL~^-FvH>4Xv14Lrv)vXgtqd&xo=*@Stk3k1*?`J$zQNJ-}4oJ z$`4o9>?{sM zB!j$pU!*V!&)+A{35X^SNJULUENYho#?3N}y)0NV!&WN4$JZzEC1sg?nm;H~wx;5v zbe1GDc}?A)yEJ>Rx8fh$=&Z-ycF#YUTkRb``W$S2sBPbXk7MyaKt!YrWGZBUqf|)$ zD&ps8@EnIq|2|u>KlwX;((e|+4s>J1(M)^w^K;^M5Q2yYy8B!g-OZK1zn*ZZ(erL! zOELzVf5NLv_G$j7IH$<7M`5@KH2e^^7|yYXde?&%A-Y|UQgs%qIf|IihfS2=GyEB4ow!t^i!q8sQHLD`h|6-V5pm14QNi#xWpxwrO zg;OmY025QYNboy@xtWo_>u$OkRbiSnb1tA$%k+OhOd{`5%y$e^qQ@c$?-B;6A!=26 zfRA+ddURIdIZ9Y&T20FHi1_$RDWYRV*XEHt2s%Q6<~s++^wK}=Ess2C%6N=yAm;m>or zq||Z!`go4a(7$^U`NMkwR?D6+DnpCv%I>OhV>i%Ih-IsJZMtsbmUwlAp~?H*0c2=` zro1cium`BVrU&vSzS+n&y<{z~$TndG{M^Zw_G8Tw`@`aPVZVaV^dnoq;F*%^k%Hs$NA_D$?f5CY{{83 zk+-X3iO27N+ksNi$LXG5O;we*cuDgyHa0R+G# zMm-5~@0T$cG#c?#dSP6ggG?}d-{Y+BG1CA$)LXChWD9en#h#h z#HjcA-Aq4`-=z!lQH;p)STX4eeCsV(_)zi5O<|CegS&R|{)Oy%+>^(!K^F}|W-VM` z0vjbo;hk6A$^RVT%YXtEP&x4B#Q8s#up+5H0S$gVIMh5k{#xlnmgM3GsEKvNUx;NK z?X-~b8_$>m<~=WIQpEfBuKKI{Ntdfr(iM42^|c+`m{e{ae@;3Qqq{W_VLb#;tvpcP zXepBMgsUU*!V60Nr&%CEqW;=S^(EbfZEePqK@_d*jo?h81iHZzN@UM}#SXZd&Z59t;caWipCZ}m(s}bIU8^1bp(4Sb~NhYY5Lz%VEhQ;h6$@O1>3O|h?<2w zh8o=gr?6@1*X=aUcI@ltfAYoH`Gj#2CZX)KJl&t6=iI+a-*`VCWTdi#=>wecw*8tZ ze$m5k^*xU`T6?WIJLRls(Iy2a5;Czk?LJ}>lMo53h9aZ^UQo;JBF(f!J`HM7+s zl$W<9advR$`;~5c^O)Xt3ykpY~gI4HD)d{f(D3bOP)Y` zGtPr6CEv}^iI@x`vAUSb^J>=vN{&@fnNUadZobZp30(D3+_g0AL_>m^-CeaDl70bq z+P0~@payOQBqL}Q+lG5x-5ay7K5c4b2@Cqx8B{S|^E zP8^bGiHDh^b){Euxa}yqxQr;LKT~43ZGJA{mF#JFxNYDCMNXAhBBp*+O%%SCE_MUz zZ;Ot3x+IcO%^!I+X3;T8=}d@ZL{**X4zw_3hCH!*gCEZ}p!}kODe?u=_89<^K15q# zw*p%G?2cR%{otA<>})aY)RGPxx~_FOZ}Ptx3Yu_ zr_w6QdX>Si*4RVaHkKlwtKpXl;js4+8RvFw;bF0>vs3LtJO64slS{3YxZBw2T3l`6 z?_tUV^IrzS&{;jMb02C7D^*uPJxbQYBn2(8m_=Z&_D-d_C>574ePxBe2uUmFR8|qB znY%se+~cMf&iA$mUu$u5p3M4P+Z|F5P(u#{Ol^$*pmh4(z+Hs_AsAdZr5XB4YAo3! z7Lr#_>q@;@zihqaJ!n){B~&?kK2CotrB_|m$XtmloTg^4@iC?$&7z+>`#baC&^c$P zLyTj`!(;zUw* zEXBU3rup_=U;DxWn2G-39(!25w6(Ar5Wo8&Id$_TF2c4e(G7%($W|Qo3;AKRvwhfB zLSse6f1wgeGaAJ{ioS+OY* z6!Tz3l7M2naOXPqtND8|5dNQUZ{w*vwIAm5Sixw}eUQ%%!wHk;@=WgUX{l6#f5ouh z;H+-(Ob*q?&`4qSgH<<{{P^LKzI$&35DY36AS@t%flrrt(v92Rq-4mGivlPc7v7$J zOf`z$+seFUETn7&w%Rq0Zhsc%c{KZ^Hn*%Z;WqDEv-5K;wi86Q zyMH1!_0ov!{`+C5*}b zl(D|{-11&PzDMSXEv4(`+JMsxeLeOwo`5(VSBTy%f*b~SIx#j;Do;p9WLgJg59OSj zzg>waUG$&uJ_?ty`xZ=n>XZjq9ASdex@izp2$eU8p)3{jSGbb9Z4O-=0}Lv>YFCGk zah~8aLPnYIbZuwasPH$!ta`d-;dh~tYnz4AOYu+&`{9TU$Zsg z?+Wm{1iZF>Z{hvy0x3UWm`)82^Phx?8?{p+-V_mqfIrR#>XeX!`d9I7X}Xy*Sl3 z05bR9`}}DyrSu`FLUc&uQH}3)Q4Yc^)TTlGj;&m{*iuHn z<)fj?O&d7;^*Mh(6i~)to>nU$(_P?&Y!dhqKqX&cy$d3M)#LvZkwwxfk192Yjg_DK zWJ>As6je{GMu7xpUaTl1;t*Aq0RjqT*9a@IpP)V+t^vIQ)??v#-0& zth;)%rJDLzb<$s%1&TUXx!?Q8!pBaFYXw2iVU>c%K-%j)u7iiI-%K8?p9usOsg9j? z<4vi@m-HDx-e)&s2L8%Los2v*qTR^@kI!0=Mp^1DjmEn;NdNpuAP}Ie()t(Sp!irp zzO9lBh7q>!?c^oI;Y`BchRhQGv%oedpuHA=y=5_3wo6&iWy}vx3&K`}DOsB67XCYyMU4y)D zuj^GusK2xy+P9bIr#|rc8{V0;yWe|#JZn)#>ni#JQx+i~@HjVg@Gs zo5L-;&(aB%_BGb^RNbh$*h2q3TN^2J*|8 zn}QT+%I(tQrdI7~ZkR5m+SeGvCz&(#H`29;^h9mXb_k6XVki$LWaepk6S+(>g6U^y z3WWcia<|dw;tORJ)?HrRW|)qs21L@>fCqNqMtZKU5lB*#U?y@A&b!^6>#|rwHer+( ze}iU{Z|<$`D|S*P!^HOtGzTYPvQhi@OT}D_%BC;$ei~s^O@3oW5|ilPZ}2n4LB_X* z#-qa1n79cvii~5Ht+Ga@U^#p$FoNa7N32D*lCiX-pWv!mD5gBmtYSeL1qQi4@d}W` zfBIE&BSrwp1~Eg;`Eka$D$`J?6l$AuEkjDdZ6fpnwglQU3CghR3IaVm76RfNx37nv zP={HK*{&ym`&v%Y%VF|ME5uawwILP&)?-O6kLd*L8i!hOf>&6yF1P2_P z+gcyaMKszasDUNGJFK6d$W7R2}njn9y44QYu$I2 zX(#-_-{o{~5%d#gB*=4OcB>V1$lY&5Mvw^ldjlawqotaIY|XjNZ-ru)n*hHaj28~e zqo~e?nt6x;MTBziVnT&X0Sj%J^0#V?J&9$UtoH<;IS{iLJ^3?QbWd6rhrz%Y-p9O| zE#F)`f=@{E2#RrX>A-LGjdIA%1W^2ixzlwYk5NCmR5_Fp>c|8y2C9O=M!7Gv$e^N~ zX0S6#eD{eVOCAE03f)LgI-FNkOb4uFKn#d-T{tSZ~ZYw0Ti<^I!={h40-^ z^6qi(KjB0DMCnr;RM;Pec!K0Lsls3tz3cOYL0{{Cgl66V&4yAqpkjqYD`ZQ?L;a{R z1`j$c6rK(_0m297*CAboT}55{Oe6jY<*1lEBYPF&ej(mUaJ9&HBXe&Vh8KOReUluuEmelOWkQWBvaT^^L)Oec#uy z@rkXbNn_h;(%3edG`4YLqp|JAw$<3S)!2UW{rz7&@6O!0Gk0d~v+vnwW3BKbFswRT zral-x0IXrs=r5yu;oB$sbUAgR&Fb~rYdDd9hst-I>&i}dsPAImF|EQFdvkDv74X{# z9=aAYtP-JEh5;ya&emDw!++Xw1(2l|3k(aUJRlw24r**J}|j~o}a zPcGV?RnsW#Gj8xl6WLx(l=Jgh`R<2gb=E9{R$%o23k43dG@aSLrib>wHFYxpxU~cTlOBU+`?FI?wX9x7M~E~ zTf`g@rWzZC?bz7ke-Ng|Tr^e&Gej?0{`MkU&qwzM}cQT(Lr%0uxW;{3X0|R@}AHmKTJqOV3f!H#}{BR9BnkflM zem`Pp$C&JFqCl)>^+|?T;&7i@!iESV!QjwMQpO>ES#3Yv+%%kev`X2@?r$U|wB7t6 zqJbgn4XgX-uVfkqaZA0zs<==3ZX0%_LFofe1E%*Bj&$m13Ce{k)mzb^vmek^#^qlJ zx4kDuk|YVkgSDz21qY!vnL+MvZTE;xXD6nF0PfmN9#NEq8TvkLLV}g)63Z5UhH~vy z0wKa9-cDeKLzs(6O_Z>#I(_EmF|VI48z5E!atXEtOX?U9C$Ij>J1cB#*Xx(mEE|SL zU^JQ=cnDoatQs{P6`MM)WH(^4mTOH%$?l&mc+Leyi%~*EVV~B0`xIFZkwNqYOjNfG zL>bJBYwyBsYO6zy^$MQSdqPlzM3EAJ#J;{3-Qe!0s1Y{5lzPf4?mI1IiB|ao7l0nP zx>3fg7DXF1b4`z8Pp#+)CY*zS_ZtiS*$j^RJ8o+?&8O!w53GAjk}9h2Tap735W4E1 z-vVpL8<@xKZohhZxpv>oRGyW9;@L6V*K1znsGHEym*`a48MkWmGUJ~SP^8~${jE6j zh8I{>5SWc%g*?70|cwm~@c%pjI%d>v{vDAl0+rQyE4~klGe5bu;2^ zE1kVPcRc{WFQxD$ zONJF}xn=hUK9XpUOY|sEgaf z73~eprRkwrZpU0L)&f!z`N4@TujbVl!rg!RC=zo_8#$hGH?Por283UJgno;u3VBF< zGrqqUuUkxBU#%tj8^J-8;#45uh{2zR-9*kpi0IF)&p{qZk7T1b7?q0jfX(vZZb6n% zkZ*VMW!2AP-OLHcMgflkmMwjDGO@A!uH_Yd%o0?(`S2 z0cA|C@-e@>-iXN7RsKnD;k3XaKFR?%QF5zYF&?oiN=#*NUV=w6uA2PGVe$7kPsL9v zuWvNS0y{DWy{ImccA?c7k#~4Oh#A0xOLQ@sy)}Jzt&(MoJ&=*;_EcWab$LkL7Ynwv z({m;F{=2L!^kW0s5Lb#cv_%T(XC&MiB0mOG?!G|0e1OdUeyJ_*VndI018W$mkKwS@ zZx301J{(-?P2GpOW%5Q(633T{t^0Rr3jeCfikd==8IR3q8rmAr3DoyQYg^fl)k_7l zHm@l!Vv~L!TVSfAfitZ5etQ2Qm?y|#8^1{t1AJoyxc!SwN;HDVoFRx^AI2`;ihKMn zS72-mZ@#OGX%QsBGw)N{F^8&mtNGl%NK3p~e6M7*8Y^cA(BtELGk%(a_w^D~`(`hZ zmngssW?T}Hd(IfbqrxDT$~ei-H@8?X2R|M%e-N>k zz%VtWQvdIh0tGkpe^|#Zsd_4kM;v(h=6+5rDH~25>tSV|p6N9%Gqxu_e0-e?q6Xov zkuqgz2BA|sD49L}x@DI7Q1eLWXGnP?KsoX9%u5WY8< z5NZSlgbvz3UmiV-`02E6PJyEIAI;(Bb<=c09lguCS%g&>#E)V&-%<-Xhj;R^UXC+& z&LaMGTJc_*M{Bh;XDTWV&X3U{<%U95o7u_7fqZ=kcHCBS!JxqqK;e0RDkNN|A@Cnj zybzMw@_6hR#F4yK5xw9y6G1(T7&n%`xc307#*$azU0V!pNO_p)54K>DVej;&& z9LK!puQS7P^GTzO@hWTq^G_ljnjMj?wXJRjdR*$Zls@{Q=~;0} z@t{R8QZ9d?jHq>)ZrSy<8{H%cqnK6}=6~M$OWNpP!}3dh6WXDS;jot%yY^v((5NuC z)pI3bQrwD;N!Y<9Lk;Z0(O~}I_7sPs{%VtO7-*3ojcPA$p@@wdiq-DHORgA0lAMkU z&JNrSTwqng3RENgEf3<9?u$$#5@fOJp`elz;AH-}EOGy?*3w^bE2F{kqK3B*awSdf z7oIR#r`7Sv`6boSA6*2W#E`gTP_cAyZPOcyfp`aoL_Qkxn$Ed;@;mBX_qeh+OGC8x*nYe?G|tBTuJLjPsVB zom(mU-~73If6^<7F;fko8rLif4? zSB~p|=|QVkqrRIYD#^rHzJS-duj|Ka#K*4I0SWm{w9~!UIzD(7n!MoQl}eBJ$s6@!w5dVN!)8+?0XPFV;QcdZEf3OjSxAZGg zll@c*de;ZT-~=x3kc2G~F9k~37Kq%2gX^ZeH2_ zqP_g(c;{I3t~!kac9W1NU$)N%n;Uv!(?kZQ;j;fP9=Ta$h9c=VQJv~Es*6y5JYpV3 zdBmNaLVmYjs4qHL477V&4fXp|rHT2aq;o$AeOaFRHW?PVo0^HhvBAL?lP8J6Il%Rs zU`W7O!9k}WNdlGNc#x#FB&mTbK$0v;3jXW!rCL&OU4Y~VOvKmzeR`Jv5^Fj5CEaMw zfzY%Pae~ix4+AoT7(49c@U07d?wlOdq2Nqli!}#ro)VBSpERw8x(K7YH}q}w2U8Xu zL0y+l(&WbVW{7SMD83+ry!lJPeyFa{0mdXFKY4!=jLStTrduKJ?19s0-ypm~idkP; z%=d=X8a00@-rEDIIMT0d!|lRS8~J`@LRyCqpS`^>~Pnw&}prQ zAca@=^^(e&PTY480$}2S;zV|9OMrY+>@I|!Fkn-o<2AEFiSzHw4t)(rR}`!h>%VaF zQLJd%gQ&DMkAQRY9o4p);?*NoZY1NSc&k&6{9%LXT(;UqJ@yZaKDX5=8XIAy41RIn>2k*fd0=JBWX+=DM`y9>gmD0$Q3Zr%_MlnpH z4gQW4VTMGfXqdh3)=7L{t8G|Z8N;n&7nW#}L6Z|es{*X~wfVJmD|J9rF{`?!yx3J( zeokk@fT3X|YAM<|`9+&u<;SDga46XMEkNj$34N)4oR1Ds*B-=dbYWapX=tB}xz$2P z6D;|Jf*I|z`Pa)`I$fxHR(nGPQtuoAw|3u463t*&$gqP|4rlv#=J;;bJJ;EzqY0QU zCoy9k2PRa{Ek=*ySfVilsWb$)LI$kZQFpKy8lY+`FuzZ9Q0lK(4TjTd|+)0=#xNRbZ8MC7%fiE>&yr$ zjoT+#?3J0QyI2`1DsMk-m2+ zToeSy-TwS||1!_LaZQ9O>=m~4TiP&{5(fMC{OO3X6-$?x;k$#i`Dz@Sn>V>tr27g z3wjy`5nV;>d_2i7ws$^2K`U2V;jLY^PG0Z>EE|7>E-T7k!Z&AmK_ljF!3hkd95wY9 zG0zTpK6=xg6QMZT{f(f83h`*l)t*e?HE|$x0o#Zo+hkVN?b^xptIYMzb-DKpA2C0C z=d2`2Qd0&WbOR^61fIrxw`4h%O~vi6c-iJ5d2kYigdb%kZ6R;*{5{MwAkr3@QRas1 zRr44GbA%KThev=D0S`eg+=+0`UDG!3e&*;in^kQtt$P@VP4h4f1qh z8g^ygXJtMRH;Kx)Cpm}|<5S5BQI-pr#s(q-#w6O!DvAxi7?lN$60+_H!an|!)p-KX zLNsDaawqIb+aX(?J2I~x4SX~h*LirRzkM9Gt?IMIhkH)L?j1_IwZ{|sW#I>j>Qs6^ zQNrAh;gUizsM(B?Vchy;;9p@>84rxwKO zADN9w>wOw!mB$()C&{t*=XeHtvicb{w{KE3+s8@`axn<%6blvY3G#9=539q(9UmJ` z)F(8`>kDPhG2ZvFPRy*-C5AK`(D(0cDYQZKEZ_(PYpBT5Yj1b#7BT{|ah7u_eCb?G zC4+n3-en6ZuUVUa*eSaJ&Q~)jnOI%fIeFTZxNn_i_`IaA&h)1I@u9jj5tGZ~%`{K7lJZZ75C68&n0|im z_QPVn(he2*F`mbClsCP@Sxo?{>;#>iSth{LQsH>C8TuhJ+$Bq>%zK)2^ady0qz9Z0ak`G zoV{r?9Aq11aK0-nORYiH6$wc_Sl4bw%YbBi6kqD(!ORx>%O072>-gsF9Mj8z%K&$r zM@`T=4l^Aemb~rl`!AK|XJ)i9)Ja%iC;)p$7|~D;7gZ}1mL954mhYD#2L%bLmd2UY zRZfs<^n1+9=00~gg)+-?i2fKiF6z?{-AbbAnc8S2>cEWI-J8n(SHklOLi6?kR zg^Aw~Tz3ChHV-rrA>g14jJDKvQ|>-~Es#uVU2^eYdOR=qx7=?!7<4P+N_DUTln>j} zHw}x_*?T`KMB`$HSNT1ie!DHLo+~lgoH=rVoVho25YVRCJdEfySP`5?XrxK)t{FGW zc`b#(tqqKIY4Q|{7LA*7C8(Ev%#~62ts*|i*;LBK_lZ;9&7GX5*S#{FQN9!R>y*xD zm#a&7>qshRTXhcdezpALT)Jp5GH7g%R431Ds-7i(=$w{>;S2 zA;>Jj(NRtms``mpmiMOS2&^`@66mbUf|-*e`fGCv)!tYy?o6B2u!E znQaf*LQAiUl<#8|BNUQRf)@4%Fm*OMXU)mh7Sbbb?+SM69=4;N1;prt~v) zkJ>U`8ZD7T(o(E1fE&jIauU0tup1{@<76*#D5{?)?IW=0$fO5ipy)Rf!vq~I9VGu= zj~i+3(x!wQyG509U%2PKU4~LrF)H~dZB|zDW(H)jOs1~CCqo;R71rFk>6KtD357t2 z5hq%TG9Sv>$9LHa_s|)!hnB*enWXVk&dji%*Y`3M<-oL_z9SX`>H!;f!)MOy*-FU| z19dn}!<2uTI(FymZvR%LbDHxubM4^VkzmBV-F{WmX^oa%B$LBUuH2n*W?JhnJZ*L& zO0Mj(JYK=yq;9-aAbnl1LD{E#>$@!IvUjtPlYd}{wjrh|jc-${RqXJ2+bGCpf(?;p zy==nYvIIZ0ohw@aVC>#gjlWdr?8<5Mg(1v&giC(JP`=skuk0QvY#pn&48DEq+!`K= z3lwt?I8=7KTmuAbbTc!s!=o1C`y*OTKXsv_8rz&IC|ubnjQ`m9>c|^^d&Ii!(4m6U zpcCVIU&6~^)J)mNS~CpncGiHz>|YOT$gx3w%^bFuPy*8fu3vT+^S_u+sdNgI>k-F~ zt{J{x^o%B+ETm>e+^R2@7k?ZaoX!V7xj-sWuz@tT<0ZT`{gsI3Y(`S&Hg5FZeqD5K z3Nj>-cxvlCO>1$_{7~rLL{Nqe37@1R>>T5~nFXcu?-1ahv z*4)#LsfUjRtj+7*_+fwsdjRWp0(WrD@Vq$W?kFjXguIfh3`P^_5Za90lBlFORh}LyAcMw^MIE zck0-+v@W>(Lrf1VU;0;En9fGrhZ2FZls zOyCTmKd@0)(mOowcC5?%F$SlM8YfNI4n3hss$OgS&7@YfO?k2QwZs+=FS8Z-o=u$( zkfLZgSudCn$8kMet~*$b3G4Im*q~uh8yYwPeT$5kx3A&Bwb?Op)+vvUnBT0|KsMMf zt0T-V<4owEL;|U3jF;CK0C1c+GP3)wU8vNUu7t4_rbpav@6Nd zCys1sCkqPu{hoZ{kbNaJRKV3d&)y@cwXKwb_{h8m8N6cM%yD73{cIlfTyM14 zELFmADW)ehTkg*en?;8BC#eos6n?Q{z&52^{-F6BSJboaY{}dsCFECjeAorgMvv*t z%Yu*le=VsS>*jnhl}E-WXYJXg$xXU>0-?A0Iuz=cMTyu#{*7*vs1DfRley5 z!L-|-H7NM~cAvth zNI&`YSgp+666eXtPNN?JpaLe9lV5ewVjQ ze0=|sq!}x|&3AfOAJ*bI1Ari3xQn#Gt@rH+{?{9>_+<0F8`eF9X;GHY@ol&{+S~6T z4V)jiC0rfB#Z(#EgXwX?7t@G{wlc-L>PlLC_17s$kVm5T!nVa#Ca6C4ITXD&meac(70 zw4``Kxsu=}$QsEp?t#5ZDD!&jPzCN3e+iYp)FXk~*kbnY5L4ks52*bNCC_G9d`gq! zf|$5es;2FR@(yGNHgB-~DgXV34i@&}e(#rQ8|$QPI+ABYCyO&*q|(;o64#0kB?`0T z1~7qf>uE9|-4>8};O#5ZjoEFs!)i18~3+Qby45mxL>&9MgU=w#s9(x{q#i_}CB4+-Psm+R1tQ zC(s=^VY?zy&*4y6>OiZ&Qdhus=eV$ zI(B1eVP^xL9U!nZS8lMOdyXUh1Hxn+?c(pcFpIlBTYyTb)70kmh>L=PkRpb!p)bsD zXxOL8wUTO>G8JqI=(-^>?d2k*@Adx0Py>cNLl^H8)uasGo`ggQdfw8T34cE?pWS6W zS-2w|-|(l)E{~*0Y-1RtheBN0T;-qplDCyDFD}cboPqC}yc2|#zOvwV2iU!FnoiKR z7QRG1G&3+l3jnHOXvSzS9dmND0fY!8Os?Et>L~2c(CKqDj}12uvz0R?9#^$y!Ucx5 zeeoKPHc!Icr4iY;o|T1%3}eKc2hW zLO3gK-vJ6d9a~PafW!k_ICwfNkRq6FwjWXtQ8-I|fvzt7d3t{+T{b<&ZFXN}n<5ftn3b$RC;Yyq03_0!v#{gCNxY0n2r z&)=<5sFOzz(Fi4eCEZ{IzBv5E7TW|^uTN|hpNTefIyNE+Xp*iM-h6*9*;9KbDyO?e z50*}IE$D411%zE)s5a!7O4pX_fa8VJp(lqtan?3|&&JJ-Yqp98-%1$0;ssEsoZNM4 z;U`PK-5m2GM018}hDEeiQIZCB)f&uMIDbJ=T;ofI0E@1hZrzyJQ~5YDd)6j(dozSHJ> zn=!CeAE;Zq8=e^0P%X%*2}}LHHoc1u4+R*3=q7T4VPGn&N7EIg>s1KWz)1;FkbYyp zG1-U49af5OY+@qy5r-O^C^wUG|j;7nV85RG%h7K&Ea$j8~t*5ps$bxTn-6ilPS1}`ol zpjuy-mx8RymHo+WJy0UvD)sk*!W7u18uNv;)3B)rMmI^Sm}o15IMkq=U-^kQ%(5}! z4kgddA0zb+h-vnzRWH?wS;qAE$_~XVJ=fZ)*O6{qEQl>TsLI+JX4BV)Ue7eID@?0~ zkw2JYCsBv8o4W~dQu;EO7?_5j4-A^a5XbEOxEYv$RfxI>vhf1~s_Lm4CBV;2rMe&P zUM6k&ebtioVag%_@h&;=N8v@MyNXane&m!^6f{x7@CLeb>>t|PauF4JL z=D)HPDQv&4uH{HZF5kFz$p!{PDMnxyc*0s{?jOW=8BU0g-#Fm zbHW%4+b^@kNZKb?8Qxg!m1$)S)mm`JGl}w>*Y`y+x4@fd9VEvsJHIJ$8e_D9YdA;r6bsLWaXg3Oa*_(;nFf; zC)B=)V21ME1Ft@$#@KLo=rTrHwz^!6feIJn^RvG@@1G|dh64W0=e#*l>BVcuFa|>~ zZm)sO0wyA<%hmFDL-nZezh4QF$$vUy^jTx9uTW?EWQkp z3aPAkrr>Fd=oV$o3^d)^Ctp7M2(JF^#FlX%o&QO?XBbThF)JyfWNLPg&r$?_0c~?X zC|YvK$QFV-#p5c|pBE32IHsA?E_1Q>SnBAR1$3=fOid5l=j(VLpEcX>+i6H~GCZUm zn&)5ds12LuO+7PDkE2SYH2)^ViTlr)z77TL{pU=>_GH`)Ux8JT+S_rBUSx+#FO|t9 zbO`a(%$MYU5i|v~2S?9={DSJOPxK^j7=NGP9g&)C27?Y3d@ml%-l9C_SHKno9c6$5 zXA@{nVNE+0vj2+$e;WNS3ItN!6a^NT{FcQpGKSGzgM&C>4Hka+0RI@hFEi&Gv2vB$Z+Lj`m%5t;fr`FCE=obhTsuyIE|C zwG>hF*Jq`8Zbw4PUsG%BM&mEYk`KZh9Lf~7(gg? z30-Z(UQs(xt(3$*`^$|ZpiK8BlrSrj6^1+URUS&@ItIW?6OtmRfquv z64{c#H~LV`Zb7(R9i_9DG8g!Y%;NkGuT7JgK1GJqcF8{`bscqGcLHg=3rbv|!+$Mi zY5;(XaY&W%9e#oDZ?G3zEJ`n)s+##(<~Zu@G^Qs7CR12<6oIyh?BRlV)c#LF$Dsh(N3{ z0!%d0q+hFSdv}>uTds1{Ro@2_MN^Sf7wEnTfOsfA)Oi<2q8R0To=S~cwO4pv%G9=cKTLhhiNL-jJ3Aj^=2+3 zPCW?kW-R1raDWP?6&^u$ z^ukoW%EHlm!F@HUr%c-;Q|@}tL$o2cN7iQ4cbea~8=xY&haw+AO1HP_n;i zTUKe@kjP^+=U#*nCc0zpYH+bySQgAH+7z{ssClaKg&k$Y_jg*&aXnaf z7^Dim$d?2mNYn#Ve4usjJC+y)w(~lK(5`>IiUbKe4KL%J$3f8&!I?RMr-rM$o1X%m z4lK@=0e|Wdx=1jrJZg~e$NghrN{6R+vy2{v^h+Q8L$!|3Ej1pOCNN5uZk*R^m|zZ# zIA;Lv&ic+C=bz-ai9YTI!g~`@ep-0Hvn^9!hDQFHfG*tOT74E05)#qZzrUf_s62U> zmj9x6`jl~y-ME^F@SO%RBG8R$`JDhls4(p%}|8u66XYIMv?Gi^@mPN zTOx%5dBohqP+{kK>cW0BawTA2@#e`x?x4d@ds1`734GrSx;V;{x2HA?!@;JsragB zn1}3H)A=Qy6tgd<24R&kBEtnQ4auh=qpN&Xn~gEn{7ncPV?f&0fe9OW0x$XtZG$OQ zm`{AqAjpa?`M?52 zsF-%{(TwcX;23aem+E)EIx?jQFZfS#jD>?+lp=wb2Mfi?N@MTHU_pmM1IhQ_!ISBv ztAjBg1vH>6^@!U&QEVZSK&1KLO`Qk3=`U=TUcQHy#aJTfbU2HZJ2CRfE#lw|r26VE zgNjOaIZ2Y`PnHaj$dC{?p>#cHQUU%~rU(+-qRFrl;OoFEzng6^m=UCHAQwmAYrAN5 zNQ$p=K5nK=i}ow#T{ad2++zxq^3!Lz{b;&CD2)zp-!QMC#WRg3*NH7ybc<<=>axX; z!9k0_X~H64eIidCL0vR5aSNASLbedZGczqv`LGyvOT-nLW%})sCw8(gz<*R!vbB5m zd*=qk1|^UJRY=GM0d+%l4)3+k%Vjg*_3#sdy*CyD>@};>Gb}2#VrXN)GId{HUyt!m zK<{N<#;{A%nyd1DH|^X4SZC_82q&av?ozn`anaZUtrMaWbpEPJ@CFkM>0e0CLGgi% z5&f(zj#1vl9GM+AjnMrq!x^u9n6{ zE|+#`X6Ic)w9ng0oqd-e+_yo?+Cr^(hx9$}81z_j2fHi$58hbE2@XM^mQp%?CLboE zEj;jzHh!syf4XXfnY96fvB4o;84zNnxyHGBAO(?4hsz0 zzoUlV?9zE>6zV&*a!CtXqHCuV0wgHqjvXPL2G%q5eC=!_RY8%R4%AO{#3)E)#r9i8 zid}erG0S7AKZS5%d@Xy{17hJ%(}-SEtr|hAVEiGESi}*Y1xv+Ht=NJ)97NwP+15Y-bU8OxnO3N{?f~F*Y(u{FnZ+Mm-R4RUwMx*`Jl8c#ZR&M7n)J6 zvMifOTeFSV5`7ksG%C0Py2YxDCJ@!Czid%2q0_q6l5VnZDs^mtHiVZ8aSxSh9Op%g zRZjQj+y#OT|JV)Ry{pXeRLHn){+VAxvDM08`0F@vGViYQ(rV;c2BKe?65IAUJR@&(U& z+QbEjrxxCv^9G&D*jm+G?67;>Y0V}Z-cQ|MOhW{8GdkHZJii6J!A-0(@~!a$$<`-+ z{IwfzyCoaudPkp6dENQCc=&zV1z9+Qh_VEK{X=s3!gUdJc9R}|7~k=ZOdDaslTDo= zC~mi5)#9DHwtC#Tc4JZMbT5|uvk1S(on+%WhF^<^=Pa8|D+;^Kx{x|1eA*n&e}2Vb zFru6qDZdW0&yX@o+|c|u?Y96h2*?p3`Vp|A&z=U#`u=1Q2dBl=4!cB7G>{Q%~n zC~|vY>SVT!x9+AAx3hq;-f}77D#Pp;Iz|4?Def{+eBB$wV<6a}*roN+lui)i+?MT= z3q-C$+x^kBX?o?-9SQ;O>bsdnHJv}!%b*OX2nDm;i+UtfV2asNtx0oXB6N= z49pSIv8sg~;}9O%>~{>penT35z5IqL9xA=mu2^KF3N~KGMsxSPINhEzGw}x-=nNcy zq^;xX2y9Kh4jCwe<~3+G0oh!Y$Yz0$H3yf_8D7V#(Y@mAJ)Yi3+dK4fcM;aguu@+) zKf1j=C?jHkqGQW=dcOg`Nl^}FxtU?g<)|{=ws^|nnez~r2Wj7aI+)LfnTfFHrlf={ zMS&`dvmsOJe2WY0Xs9`$LR$`*;K_;*G<_bLadCAYekc@?PzCvRje~pYU~~%FDuOkn zyyE8fuCWNTAA72ejIA{sEMb`j4Wj(a!&$#mqG;B1s&J+0IJ^S1viQ3KNS zWtN4na`mhed5HnL`#NX=;q}aV*Lw{0zNWs2zPGjWqwRkNVS62D=vi2lhtS3@E&@#D z*h95fNXntBK~bU~$hF;ww%OHUM~oEhVw8Jp6XAe@&!+kq2*+=5p_Wl*BjRRA^u

)HQ(l5I@BxScbmG=u82SQD2AM+4#jz${$u9ki&XgR@+IuiEU|sTC`_lxFF?dC` zS^o`~Ed4~6Fp*x`*>`wF>YnwuW~K11kW-*W#$pH>`*oDs|NfqMv@9X!Vqbe>+oW+J z*zo60pBIF6=b71~7HAUTy>9gb+m2+q-z1{uS4B#saRAWRv#uAYu&*dV5ThNpRE=T+ z>k1lMS+Byc8-mDPN8c8eHl4u|7c=kJRN>`E?7z!L|4u@w#JHY_nk z7`Kc$F}`|i%8gZR=iEGLi*Lan!u4i{ArBq%z(;DEH%pyZT)c-O6YV@3%CyPXdzAlZ z22W#1RRR)d9yoHjC-4~5bV8SAYw`k9kTqz?kr-wgGUpDHT5=3+xK+wSF|a6lu(6Sp zK8@EDja4VVDC?+Ru@@3#8w7)b7GEkzktXpt3%ZjcW1#l{qFU!RyZ zSdsS0!nT3hM@y?q1_>mZQg}mdc*WklXK%Ka0zkCo&$TuW9uRb(uRHCwXHJ}~D^@-& z6}U3mwNCDGs7+)#LOV|2Q2e@MIio|2oPA*s?GNt;iwsEQh8E5j-VQYHs~==uS{|kI zZ=>zI878M5(ES`dAn&0KmrS!6@F@o+Jq8#JT%*@~QC!L*D_0K|m)_J7kfZ6Y$X1M( z00=`X)zb){(P*(x=M_n^_pt**z|XBY_%ga~e|_mC(50WZ`RP-{{T&zkDB7hhgmh9Bk5s zt_uCpQ}na3+m&Z<{)Xe?r{4(onnh?ZHG4QSqhk>|lOM!p{8qUAp?Zeb9mn|!`k*YD z4ttFrK|(=U!TvN#J{w`R65yzS^ml#qA?B+Ag@uxD{G5`O9ChxrH!pKnbil-+Es@{1 z3}eVx3IkEjN`nbdqIUWBTzqrIyCHzyZa+1qKpAgziduu2!qksPeGpDk;RBI1H))bT zl|s2XB0o=GnR=--y-@~Fz;$*OnRlf_)~(~~zgzFRCzlG6xIkT*1kTess!muKGWd2) z+HzWF_A5<)o&;s^B1z=nRE#d{*vaP|mrU8G@oHg zzsx>V=kJ)8on$OyMG4mp4~U$~UrawX%$sN@P!TeVRcxEuZrErp%sgsuH}|O zjzNeu;fcX;9GUbpGh7)=J%&IKb^cNLzqvS;iO;-R>wS^eqh}>i)V>Ccjo5ZQEUK$5 zQE4|PxE^Q=WoAE5KqVtq`PX(H#>R=9>!4nOmPGO0I+172^RSiHhN_y9D?+@U?%=BV z=)4kx_RQ#gvk(wjNlv0Xvs9|-K*w=tvjJ`{Wva=@A`Dx@9#I8}eV~BuMf!17uh7`(r zW6(LqBeJW99wke)cF8U57#`e<#j0QXoH$RUA?tOn z+o;2@;Y(+!{o-GkQmX4z;(>4@PF(Wr)oCM8Tc-cay6vI}k^^^%AT}n8!ZMOs0+OXO zy+2*r!|R(7qdI3~p1ST|kGqD|wLZKfaE*F^b@!D|_<}g0yc187XIjcOrr(Co@h~dx z=Lgo4+N5YO?deD>_o+VQb=Ld4=>2%m19(+3#50%1o29r>oXN(Z1*s#i)85dIXvjeQ zQEW;+nbcm&fckPbEj?-v#0bWwm``F`gZ^!V_s_r5PxxlkV>)I##Y=?c05$Rr67A|X z+0OogfSzecfCG6K@D0_*-0WLL)0#T|PeMaQ=-!nYl?Nmdsv$UPHlIj-u}(O&qNpJp zvb@X0IndS&)fKTXs3r4xbySx;evZ*IrfR6ke3qgO0AlMB5?*3PSX6R7>Ti+gc(-NA zu0%Fn9`0STBu-c~PuRuBcUEs2J*B04uu}q4WbiW%S$Sz9xQ!nIm5#^g{??T5(x)~W zAVHK+|CzPujB6^mv<{662s3tSyp-+O-)dZ|TJ&jXwTsAR2=}hZMrsfJ)vDb;TsQKK zr$wm?@Zmj5L{N_j;cXkWTC7GP7uqdPGBLF!>t?m+kQBCONZ_~`<+1q^^+&<&Bc>Rf zVOngYdRu|uf_`wY%Li_n%229eVe;PHUHa~Kk!yeEMoX2xYF*~(=#0DJLvv22(1;BR z#Gz$Ywc7s5gvYe*gl3ThDmCkh@L)gIZ#MRC@>!!}8p(Pr%{qvRwL_FNHiSjhjD*Du z1{ja+KN%WoJ}xZC&lnUNaJCv!6|#0(Ogmd{S^awI)nqD*ifZiYU~((ZR%xALvpy$q zx9HwIlM~g!xd1P5(iMEfI~kNPUYE7TP3_)$3T7&kj(X)$M_WO(DCc0qm#XBPm zgifzedT`>v`4Vhi*8wBGr$81XyR`g9XM`BjqHi z`tOJaKEtUWX-t^Wm|DJwYF@2SgL`hxxcMrU=FRGXPzNU(bNu<3NV6Ud9&}iwLDhXE zn56s+!g09m5E+W+hW0Cuh-8{%z7#Fc*7;#m?swi4B|=jGe$wy0jku=EK)HQ#=}#@jGs$$NVe@URXF=AO?o)Yu zOmv;vrLAj$X;9d$2~ju$g>Q!TvR;UD*}l2nvLrA>uyuSuSoOg# zw(E|g{4ric7Q}(#6$1iq9B;U`Kwt$Um2&t~KaT+Wm)`Inpp5T;yD>)*Pv}oHnUa*+ zvbNXX0TCebJKAG&YX*GhuquC@ld2ln7wN|E-4{>%{oe`P6doXVXp1j=n4S-#U2Qw% zIs2e)MX1vpz_2Fw5EMI8rH|;^dfJlyuI+;I3_3yWPg{X`dGR+r=k6|8qvZbiz3akY zIi9|{WEkW2%Z6j=p?P51Fh4Bw*#KG3K?idW^X^>t$&Ot;?BbyN`N~$a6)j+x`n@CS zqbz?*)_qse%{Fq@sluOgcR#xHTHXyUAy+(S8GnbUf%kywmpFSLo};!y(5;F2UJE?eQ=8QvbY@ z9gB{We`CkdSm2&#rr1nY&rFA#Q%(&Nknx$K4?P{R(_L}%(HAWR$@l^|p3cR}gRiR0 zU`X`B&;z0F%nVz1!RQxBA^Z9*&s#31wKL$IHXO7>PUO=CML2!aI8c55G>E3rIujme z-8&ppRvi|wb79$&CI(b*xGR$AoI4l*gNFd+W!_LMF-<#TlszWmgOQ;3J!hd zIDqTjS}4E5)VH6G%sJb0ZR?};sf`z)QDc?E;5{B|EptsMUU0Ej?$zd8aK zsTPzPOI>@hKUIh*!AWu8^IXx$EMKSt8|E~KFH~)HQ-Xa0f1)7;!ETU9S*=)UR*qY* zS3PrkdVS7|kEufIFVa;I)_)WPCyI08Eynd0-VB~g*;Gy4nY*WZa{YAEPu`|SuaTO; z2ITrQjsufoyx&-`S$z=<%9WvpC|H4N_PV0cRG>;bN<+|YU>OJ@wa09Q5TXjy2u+N8 zg3_i9;k$||5}<^^uX3%H=ylyA=e|Np!TV2_R9yjte=DnJhBcAy5i4tDhQ04{&N$~Y z!?=IM;n*F*H9(!>(F4^@#o}* zi`3f~J+nl>6!`SmbC=l(U;brr&#PT=gTSIJ5roxht<3OQy<6@Mw@Nr6z|GCNT;Ds0 z#_28wf1pLVU~17}LUcuOULt3DIsy|EHwP&V7!HuETob}S4VyS9SP5)UGNTD@WblZf zgmI8;F(oNVZMq6WktKt_)aPy}8C+!H&0HW0hrrl#@2&ra1VCR1bln<;(O9{r#%w`f zRARw$#Gko^I62{*EB-_IS6D}=RYa8#oI^GJs?`7}Cxdpo#Fl|x5Bza``( z(?)VCrJ5#MK&Tx{sG@>vW{H^(fGCHr3(F1VN&{OxW0q$pRQ1H}cM-z?|FUsdTrH4|wl(7$*jJD&sSH{IF~s96$$V#h7(V0>&QjSL7BgBk_PhWw`Qc57qv9 z^Gaw6EdDFy3b=e$H|gAEzBMRkkB8;mU}j~JRlCV&>Vc9e48ZNEdIASLlY%*#ICrBm4;zZ8tnxbv^XX;QS zQ4p(G)M`E&SZWl znPWv_0g=CfFi_7Z>`N?=0SAJ2GKCv5*?bdroREvqnss<<2G&X>_q1g;uh;dNbr-}4 zPI%P&6t$u*>B_$|A2*xC@%iMJ1YrT*e}B=V3+J+ZZu|M#=&9b@XR4J*%KdBDZp zmd}jNO7gPtrkc%b-e{+?%4No1hBZNGAlw!Z77bP-4I#-$SXwdl zS)>eX>ga?4Fp$PT00Ep+TFQdHf1Y5(!A*q}cYL7ksoCWDm~jlOW`d@rgj6=@bYFP3 z<(~A)NB_tD@A8oCJCj8T3T#JFPr{c9kJyEhz3Sieu8wve?uhN2*^z!b*mA^{%+Url z(um}W@#*Y4HNugGLDa-7zI*CFEjAQn|DV0_j|XTwbPBXRlKB3Ie8!p7mtSK65r2LD z)8$;qdSBl{^TgFdgOYEJi_xY&H%k{O+zTMLYd%|yi!m<7xVUgJ|O`@JnkMMbeW&Ck*v*{1-qkxcU3t_`WIvtQKl#?U_?3f=htUX-x?RcQ)W?8jaru~ z4x?jSjBznEE-HV4wDF#IRJiiO#e?v;m_B@dd$@ea$|F&?{HS<0#-9g_zJE(4g0C-+YzfL7 zZn$AqTS7TEYE7gKI^k?X{F*l$@#*F+K5%$W(EV=UjI(#J?mb6*zB!;<&N;95^{sQx z4Ce|;O0;J?#9?^nd^9?}xIC@wJ-$lX-aFa56PeeCEqBgZJ5nmm5Iu~g)5`c!Cv*I^ zf<=c#yHXLm=6|2(nl~A( zxnW|n+Do4q94Q}dM~Jg=1hot}KAE_d z-yb`MD^01k6lZE0#)HqO0E1zbYPdd#eE9SUnPUZRz!NCOV~DmPPN*GVOKd#+OEWY5 zN)vz$RHIP8WmdpdhRA5b355dYp_G)UdA6Le$@uFA1)rpUCXy09l@Mh(hWqz`1_*lz z3!wqCf%8$^dtjJ_h|^5JQ3mz_t4A?-LE}Mqq28wwu$nAmgqrF1$uv&01Zob>5#ZZO z9csl10{8{DDydR@>U;+5&yGKk3>Ha<%Ufg+%)+D4nxM+Q<^*m!=zQdle*Jwh6CjzI zYgiL>t%viMHz5HNe+n(vT3T~xwcf&Cc)F#LG1{{QJUItI2pfJh{0}j~FJkeF1riKs z34Tn#UxT1U21-3GUUvj6%qT6H23(==uMNDwEyzexPJM-D;TC_7Q}-hD`S653d0uLc zE_+;`jCM}bkGcC+`n3M73B9)9jI5#tohdQOzlWk)uZdcDe=(zz63}FZ>{4v-OK~L^YL$Fo0d;LG$=*+mtAOfZe0TBs1DFW(D$EA=@}Ea{D)T9{<8Ug~ z(x4ghafhQo*rq66jVUh)v9OE5s4j3MC*pgH%IuR|}3y zH_IUyf6SO63}C)XPW#i%aDhE|!v7$6A@}fQ_kVWRpB(SMm%~tySed1cMk4AY&!_kQ zH7!CcVQX;65ru*$Db1_~v2bAV!7jKGN+T`r%$NTQ;9Kyf!`IAqTM*#{=6=i-AZI9x zAoqdz?%Sew5#1Mc#9?!{b=&0ESNnX>=xje%e+LH%&;1C6<$(Q&_{FN}_IWPB6EOhF zmKkfcyF+5R_IU~mT4A$(hzf^LWu#z&OsYjb_-4-UxF{|eSImTUq+|*M1^0D$ZFBOh zZI4e5c6RsNMtl9X-7&j+{Z${&0qr?1?h{H0unL^Ra40t ze{rzhF9fPeqMTHC1G#XlR1Ex*WQtMByk{9ivWW(|)|61HLd$^45mFliSG4e_l1@3p zj6fL!ZSgEaa6(wX>Qe3qr6AMC(w;C7e{>ewT$x#y6ZZF+*zYJ4_cP1Hyr#38YPBsF za(@e3M92eN++xGlcyXVSgwi;pbGmgkETQ#>M}_F{sGQAhRT`OYj?=rdZGZ)hR)PLx zcqEj=h{2N(*o?4!Rzyc7SvB?gEIJA_urF{F{3{>WNL!pPbSomJ(C8nBM%3X7e>)eo zl+sE|#8hJo0Y8gv=#s()mm1<#Xe3~c(85S6kUEqpC8j(#bqKS7&hc>6;uS-WzPST- zr}0cmW5l#m_s1M8j$nrh3fJiHlW*=!Dk_r}ASGQw)V^=7bZ^2j5ZpNg2dNc>7#12+ z=07@#ovB1&f3W2SBGqb33rQWPf0i*t7$FO`O)nnKW4)J5%nvFP^EzhY-DUG{Z($P% zd3uXmXvpF&;X@J*g{Yy}yF-~THP>ZyEY#XQBHQ(?m*+DOR(0tz=^%V~Jx8 zmta>Gt9M_IU;>5|WFi`6{~*0#jEPmL7S>xU!k#H+XehmPiiiFgJoK5@e*shm+|Sr_ z=DB!U_nCPb4ZBU+={#|X#Pd&P%n9X?>65AJeI&-04= zc=y@dTU*!&=03N@O*C#7f07J16sVG}s1RJZ+wELvs2Cj$6-rm{&cTTd~H*fp= zgvo?YL4}|p&9G_Ga>6Nrow_Pd={ie8U_yZSg-iG}g+l*26q=vcWj+!+t_(9MnHvEe ze59U4NsGCxP~MrH-?=9w?-rXQqG#@~b0JC^ZU5Kw$4zo$A>bPje*@`mgzL@8+-Kii z@%}za3rxYbg={Gttc5(kkIKhnc!}Vuth&S>g&8imhG$6Wf-Fu8hxNE`C+_DJ?{dbx z*q zVWPkU?r_eLEd?@H9Qd7fwH!UIHPUDa8443o$|mz}5C<~he?f2#u|PAS!tZbPE4iq`OH(5yqm~j84q)Qm zYV%hTY(Xf3X{9C->6v~=sUz^@#~65*De6nlbR9jW^Y^Rf+5XdI?zyn{KH{amzG!z6 z9@8m9G;fq4e^R@^;7>gFp#TWrZbj%!R2tR)ov8j%wT0ADaZMnDn)YN%pZmmARG!}v znV55*Sk4OOKfC46ef-zb=~JJ${6{j7P~f2t zvW!d+o$sm7O>`(kd-a>feT|PzuW;PV+WPVH_EJohe@THtKj_ehQlnriT9wX9r8wy0 z^>HKs9@Yq?LQ~Ua+D(7}v%ToT1_aGi-{p%gf&FDf}!-W&v2;fvssNS5`3t zrap^{{77;%g)~#@u=bZh>$!A#(!K8A?T<6%q8->uch?Ps8oAQN$=UN(rhM4mJ>9v^ z6?)sFq#-3KC|Q*%JUY)!wf6Es+nsS?-OaGwfB1j)`booGB=O#3VS|-N>pwei7u`pk zob?-b`}@6m-86RIpC9_egXf!M=S>t+BF92pQA`SMrU`Gj6wZWek|<(Pz&6-NB%*|@ z1O`_Xz<2Xy@2yL{S18sVc8ABEY-dkjJ=Kd-v|79O-HVI-O|e~<=hYFfU-9f^X0r|f ze}lS;gCOVMPMuPk3HRkvnu(ALrZf{N&BUr}{4?vyd=AejH3VV13!}U6Q7Jk;dJ*l$ zc{@Kk-7Y+5yXK|ayzSI~GCmUAQ3|$!wG6Uvrh+w95>QySNTMBnzMg`ke+C?-L=$t~ zTp|chpp^G_CDL*yWGD# zIK53e7-G~B6ct{ut3q1oonJWe5%^!f6s

0OWg}73)aGJImrVfxv#7-#}x=k5yQs<^IJ(7#64(!n4THHjB=KbouCIzxK!n zcNLR4KHt5#Y~TEtZuvKPkYRr?4}p|3Ww4g%m|l#Ckaif%1dS!tg{1+N8-F_y;@ncg zj7)e?!h=Sy5sWd2c?E{PT)4lUnjgpleR*nroDFmWsgV~Dj99_J>xDKi&_m5%n>o03 zpYD^O(_!E!7VEqZ=MM3xwL}?Bb!dIzkkS1jADD;%H!9RzlPfhp7fOG{-lAag_>Ddb z=C<>XX)yJkf69flZ*GeS>A-J4AO+2; zZ*u3toUAuFGTPCCa*FfD8skrnaELY5e zYq5C8&}f@O;Gs3K29IB$_{wBNi-qGXGXzUJXd3EBxdTsw1zQyObZ`h0@$t-u3$;x+ zh!q^1gVYKI(IQ0KL0u;uJRhT=f!1=&RV+5NSf`3&ePzN3nR9<5;r#AA*0!W#?xv_-}i z-XDu+H;<<)&V_JEjDzumr5Y;f^s@Ilt(aLOiAvVX5;FAp`U>hSB^ClVHW_vhR%3(4qQsG2Fr$G7eN`Fl2hxpUn)zi8FsE!_R%Tu4y|MOsiPA2-p; zsfMjiUI^wj7Bbb!d-H$7h5kk^6dcv1MqwRSh8dXYQRsicDDWf@JYggYR`IXNAN+_s zA#}HlSs6WUCjw$i2#+VWC!|J^u@LYC#6Ykc;eG*e`|PI+wr`YJU}awYyhu#HJ>E-1 zjo?HQuakex+bTLQ%6Bifs#~}FT(DxMxmnx4Ah}gn!3o<;Bpr+pC4(7Bm|W~=gkO$G zp?;_ZRzp#7hbrrFHUh4ZhCrmiv>a0Q8N~;Vn#RU01(6V=gcxZ`wE@!40UyaEG7<>e z4FpA8;bubkYm|JvF`N*pt2jg*X9id!=mYu@}*EqEls7K9=&7*rF9dL`?T z?9hL{awWjUBra2W`g9%Lr&uTdCG0l;A9B5PbQGznQ@Um(%pxdUK@5*^;{`);Dcum8TA=s0YBwSMGv0r~F56}fMszl~Ht(sM1G`r$)Q4c9=)6%7;LKil6u?_C|eRc~L^-r>XD-qYh_(M^OhExLbS zO1JFc<7IK@<*L11*|evt#*_pV^yh@7n(azzB;JxLy|tR{ZpxLi`x)_=;5IB>Zo(ZT z%}C+m>OHC&dVz+G4jSiMsh8AKsfcu=A^5y+AjYh9u^G5!5SaUxNi_~XbCrCbp#4&s?7N=Ii$ z`>m7`C3e)}n^$#xTYKz^E?aYUWURx7Q(GGM>5P?IZr2ji%p^$>CDds2N)#soK3u46 ziQ>fg3yI>y_|rsjVl5OWnD#wo$tZsw&x679RNvZ~Lz?uVtTMOFSDt&hAU)MdJsz6l zRi{Eq!VG}{mlV@M>%3xyJDRc1OW1LOgbw{RbSTlBSj^8SniGlUgy+rHV9_kmocIAy|&U?Fs$DM2?({CNuPHtbg52NCJN_SfI!X$6Q-6 z)v_3cCzy1UftjjdCW8@qq&qx>C!_`w0frv72d1}8&U!o5``kk>O`e(Ey)M5r-At$< z?(S%{cY8lLfrRJ~d0{2tK>@84gx;DmJ9%`{j@ zVE`)JIt62}$Q(uoi}Qa|@^s$4Nj>czAMd2?7|#-^&hUG{(X3Jvviwf&M6KL-r( zfEHZ8`$3Wz>htA0Qx^YrYG#VfMQj%QdR)n(Afz)u|AeG2PwYavqdDZbw#DU5X19FS zYwtdlEB%x0#@)*Aj0ry8?)?)dg;H-PxBft<44%0JxHH;6{96p?{6Xvs=d7c!QmPb8 zK}&?Y(8FjGAi?qvjD^$iXWxmkIj11~4QtgNwscHUg=L(C*OIwpym)+1fPuehHpsS$d%Nf73D~U(*!j+t7`~pGon`ak-Gbl$0l))u zhainhPrQFSjgEKq@{7Hwyxf#hxAmKs>$kUNk>uAK@2r)Mw7~hWSSK^a|D@|Gz#ZNI zHwuLv@JP@uLA$>e?WnNOKxU~Y+?_>-yT@$)j^1>-XVnUr$IbiB<}q!pJKVwSpj-*f zxm9*7EV`0#NAdJA#3wpz*LH$;3Eus+c!%3IER%o2YcFf&JUZNMp4SG?w!D9|nLoR% zeVtQ{8T*O_Sz38r>`$7j&MXPM-ZyDQG^>RXY+L^ z)g-|0SuFqTDpV9RqhpRDLR!U{;)=LbTwH6g5}YM`hMOfdgUK|rH~}CG-W1P{hTvTL zdcWB$Rvxae_N#Y$2hZv2w;S%pImMpx`^|s)u1R-J#p?;Z+~2C_5}aEJoJ%Q(6UHD6 zQ=A$i)RfenVlV-;RN7i;|BSu#}y7E5G6qHtEiGXf^-#ysbUxmD`FZ`hSI4U8cPA9 zEi(Xjdd?$`vv3*q_0Q%23`^)4Zp?pT&566e;vLR-=h~+sD1~-KI9tpTMrNuRgQ$bJ zj&9*=ZZjQWh{YYFV5gIJn;S#o1-N*@d<9O11~5$s6e-1`+g?mFJIA?Dohg`9TfWho zLWUoo^*7CPaqXEV#L{AD9ah1Gi!#m3@Z}Xu!_T8CoW*lG?x5WjO%JPs63u@FD&|hJ zOl>GG3WqL}BqVckaLy*K2%DVwxVV6$s3jML`?vlsfAN$zjlOjDxp|Fc?9d#~mO{xWHs^nJL1< zLhqpe#0^(O;CaT$y9wwpf)vwm?A-{h`xrcEBZ4*2eDZ!8LUh1RN}zv#fl)-T45nbp zF+4O0P&2vfl{*me1O0;k0jT9{zTD6hPKSLr6>Ozgk=cAmsVW5%Ey_{hp^>8Wr-pb+ zYBtqX0)|C%j*9E}afBNNnJJ7Vm^%<$$vBXq@I+c_G}8ns&Qi_Dq>jhjGc6TtreFyY z2GS}t1`);VQ=f*au%Le)gU6b>ArS`kPk_x+V2C=(kOY`2bug?^7(-YFbTdK(8Qg>O z16^ultrA9=8n7=rt@~<#>>9WoMjbLjS%P4D#bd;HC(eN68yK_*LPH~yh3V7EKj|>!Zf;@sOp>!zjYDG6@AXu=IOWR;A z(1B8cTLFp$K}{5UfZhQ|!?Z?bICVS8rBx8Eaw#c`P!}oKT;XHrR5S(!ji)e=qW}sn z#uyZ%0fv9++W7X>LiJHBLK&2wjDmU8puGaEhxx*_urpoA6(JfhR$^X03dO{8kpDk> z@3oxDl64E;e^0Su|2OAEG!^O1xsw<2-o=hk0771Xg!~u%?*Ev`6-5Z{L8N4oLIYQNr9=Jk<tp-xsII*1w6ZS#?U_! zX9BRoj=k2BVwvfw?7oq61ILRS{3Qi1ju(Y1qx#6J$Aw)D(AxQL{>TpOOk(#|`K`*R>!+zy&6*rOb9CZ#ReGs~AptGC{ zd{uZUBt}XeeY7`vPo;vt| z6m`ndpD(3$jeD3>Z4Desf8nyU6z^ZU#wE_8#*xQcOok?oDYa|w?l_mA5+ZfD)Z#V# z6=0HaRGE{CuW7Ywh5>3QoG1vH(nd?GU9$o}P0F&s^mOb`t6h_%Z-c>zM)*{C{qt(q zTw+rL18}E~rLj77d)eLjwZ_xYJ>PHKFTI={l$W<_{9$!|%-wk$e~iGBViyPf2VscZ z1M?pH5L}t`do>$f)P$N2%&T5+9tTTPC5M3r0uG>K?nu}GkS}ofh%kX4>fT$gB-fy{ z5NT;LW~Pr1mRf7))pq;7X7|som(+aWtdE7W4u=@j-4b5IxbtYv2-bvJ?!rBy?qlgS zxP6C{#1d&Vx(?~tf6tEw8_ONFRAFSfyS-5bqbdpdISfR4m{{PP!jggT!b1aOcM&Fd zqa-cm;XZPTL}cj+B;h+5ILpc@2MF-pv!gaJAS6VuC0_px<7o=AQ@d$$vb~AahIKM2 zpjc$BVeit1gJTO<(<-X(Hr=^Ysx&j8$kZZP*mUwrMSWOTe=Mn{_=M}uD`F3E%A~-b zCXa`wFD(zi{7D(iTis!;k?|;%fOlXdO^uaP%`3hur63K-dQu!fb`Qr~Cr9Qv+)_}t z3;{02$XAD3$tl`^MUjzH3zh>X5me3aN z2Ub&!^b9ece`b=FS<~fd<9nida7rnQ$A}!KhcKukn1Fqw&S}y~9*Ip!JPvvR2OHGV zi7el@-~3cSMV-{IgYslDo#dxHKNVPu$#bPJE?!GdU1EXpHRy0~XDPX+yYY&AQ;f(g zJ(djjjTjtcLQD)sDKa>k5dfrOI~+GSvy>xC1q2r0e_${w*teX%n$pqnm<3Z2)J)7| zC}v|6UBu#A%#f}McjJ|!C@_2|!ba*}nkDwgbO&D)6*}rjJdRPP1w}z4K&s79XPfV6 zl)|QHg~f=G4r>NGg*SDc0Y_8T-~l`*UJktp$mW<9w|(NBwXqq zka76Ee_j9wsGCiec76opFcR1;RApVFbw^ysLV*LGMzyU?w-~)r0ewpRZbT`fq zY24uKz}SvjMVjOvb4IZuW~nej(?7n_>R;(@obpcQ9j-jLQn221H&s1>N7yulfW1gTZbLaa*F7Ysix2R$ zI(LUvhU>JTQ1A@NeE{VLU1yO2rKT!VOSgs%tWTD}I-?}0gwL!%ew>L62&csoFM@+k zo<;_r6egb1P6D=ydd7DrEl4_AgL06fe<+#b3`B}Twh}~`m~A9JOfTXKF$jTq@~y@^;5 zK#aDQrK*%M8_!YQD0Nyfopg$bCQm)(0qM$*gMn1(eBT9~8XGG~K@P*}$at6)5Q8)u zm{IAzwZr<62%qL1+~ASXB%u(c%$1;`!wkcDy3WN(Fru?-BAW#q9}EH;fc(1jELCSb z>UvD~`+;sYy7#Ei56eL{M=U+ke@4R@YV3*iqx$tINDh2*^B)gi6?>$^^}Y3x=Js@l z&EfG%ypjhZNQ2WBa{o0AS@`}@Ob-Z#{L*d6kONJ7PTdpXGN4z15`e@Ol?KVP|; zdt9!bR#&ThWozu+A*$MEp26c0U^6|J>TE!lTRN?P1=HV^E~J*DnyRHhW3*B6U9G&+ zQiIXZ?N#l1oFQu7r@CG!e4&rQCdL;8f{_FJIoGx z4ew={U0s}O5(PaUfFO0~AZJ#L+RHDwMnb>= z#>RpV=gALFL_Nc)oi~+q_g*EY5Wj>onWiIIz}{rRUTDozaVl{qeaCnc4t$OZ_IQ3B9^WX0QD$b$3o$uoONU9>YJC; zP>{-?C;}G;d!%&?e^;D>dBTUAuYS@!NpT>l3f%ica4$oCP?CCtBNYUye(X+@QT2hv zrm_xJT`AHh&TtvW&}|?urBl=bv^(NhBF#n+MoJ(GrAd155U^hUr+EN&s6he5qVqMBI^MGVL=(-=gR-NG*PgKJpiY%$-@O?s-0>AJvnRHP(7t9Eg z1y{t2@DegrfzmSrvt*ogE<*M^GrAt;DDNd)264~Q`?3OOI+yvFimn2Dcq@d*-|O5A zN@oG@JC82Pe<-6|q_CM@_8k!$xKbp!ok1lgWsY<>9Ayn0iLQE;K}avkrLFNiX^UnPXj3tvYpY3L!41wCzd6h zXJ<+NuEpl`&gE=#YIA0OQ~6ST>TwvB6m3fPjVwtR5E;;2H}d`f53(l_-~(pxXp@Fy zB!8c$dlYz^r^sv%LsI13!fd2TfJ{|dvsZK5^{M*R&201L`SSHx>=q1Z{1_7HhSH4? zs(5u&Uz7nM6L-?L3^>GiA|M__ng+mK$D zakoNR2g(xv)}%on5^??PQBAeWibN8L<9v%1qCT3~P~0eT)VYX>PindvPCk-=sZrs@ z{76QVJf`KTg}H?h8ebzsS2h{lVWeoFj$A+*?bC1a>2Mzuc)TY;mI0fw{`}|3Lm;4w z@z$?LBcA44yuKe)aoiS zAeKa6K!%e^wlP?07QbymQ0%uqX~0*CKn=q{;*JK9}}P7eeu2Y6`= z7u4-0OL~$D%mtNfD%gT<4G@Y;z?lJQq9t)ML(>e>GcgZlI zHdK61#on5ve!HN9Wa$NY@Qm`1T4m@qN3tiR&!i~sWp$+c039SeJdl4yDFjt=Ws!z; z{Ot-B1u>Y9UV@TjfgP1p(UVDE6BXdQ8etTByI2)T#^AisyR5kEe5um^ajh5;;I>gp;x?(OoWcK!B7ueo(c)ygT721Z}wh4qi@KH+_iwf8) zV6T9^3}lZQcsgm~OV@7(z`bL>UAy1lt+n#ZT5bNcabZr+#vb=b0iPs)t+GO^h;9o3 zpA($ae1TdxuipZEBGA-G)^ld4r)0d3t3gINlb!ZHf`xw&_`M~!>Bxn-0`(>r^#(2A z>?n9*2a{mBX5cQ}Fhwn8@eb0SBdL@0{B>Z2_Y{IB0dW;UO&%~(?cj!L%_#JjMVACF zl%*sG$(acr3Em2l8q-XW7+Qu*5f7+|8igvork27H!GeLOCnz>b#79a^f`pO#@zH0I zK3u{f?hJpIVKRWBjywWZRPtzb;Gk>S|6!Fro)#r{sJC#IwZz};#PzvnBq19a?`<*P z`hb}XO$+;Pw!tTe(_oxql8!=0HkJ33Lk_s0<6yOYa?f6=seM{lYCB}L8`-UPdFkeU zYueeB^GA8JyLvAlPa5Shzk7jG7Id7%z8_9W}Fi1C(tue5Z!+*moEJv^SdzAcxp zw%yZqxVKno%kIn_v`){S7hi7HTC3|jGcV=Bw2y^pPuwY^f4XOf4FpxAefkH0PB5Hr z#zTKiTEjrs%no#mGw03a!^(WQ%%0Xu$B(VsjoYCL*M1P_BqI@5Eu|;X)3_drlLB*s zYDr+N(kj;qlq*o~FGM*<%9bXfRcvd3-ZEF^*#o|RyLEqj_VP5P)bjfFxXTCh1-Xt? zl;;xOttBHZKyETXuDjxOaAZl`XhV+o(|n9`M@p0N7YS~&Lsk8C{cNLowKl)MURrKHFW>IA zt}e$Ms)QGT@!C=$D0PtPmHEz>kvTo3=HgOiGN6{F6jYOnTH3~>%F;bgr8&Mx>Scd| z?T543J^OmuI-NgTm^MdqS2L$O1zJrYS`7>?$@}aZhMNR2lztI8E>uVOEtbRGWe3K` zTJ3aoeG6Rtb8)ehxK(oac&TTT4Mr+Q`}p`FBlFa; z-pSYyUOPK7zMSqXu0HJ7^nQ8vcxP$%uCcH^R2lt`dbct#M$!!=Wq7C?#TPOP?nw=q z8t9HJj+cat)Y^&KPEcu-$DF<}Ayi|4m#F&_wn!GU8pI?>*e9 zpYOk}G$G1ddVEPKNdPK+zMG9sbe@v$9 zU5vS%hXX|I{^Io@@3Y%^bN6(ppIi0g{hNnf*1YFO%503eolmJr@ZJO<03?=dJkz1x zo$``r1p>uzAFbyOq80*bE zWJkH?4S#x+<<+a#m-*H8nxDUwTYF=Uaw)mG$-y}4XvV>BQp>I;2IRgBP62WsKLyAQ z3v%E9)I&DD>gq8&$np8Th4#bBLSuf#ZXTUh+pXG4WwJr8BRfot-clQvQH8y~yC8u& zQl|%O>h`RnT4siC@U?$>b9!IxE$rC>(Sk z>FNG?RjzOEpN=^$rdA_}K#{-;+}lw)MkAJGEOiu7S#x2T#cZ( zvv@f}?!W8fMKOQE_!cA3hI3juK2{0|clFx+n@NkY^@{f?JygmiHeY(pZtNeXn`igy z^|jaM)y2}x?&GalI<1Ynv6n1>OY30ioxm}Rw5Y@gqyP=aSK%nLkfukEwWpT5r>eiL z?_~s^(IFEkI+N5Q4%XVbFFW_;24TOGqO_G7QzeD)9zTD`a_ywmsXZ!ZA5LCfV_wfK z94y^0x#bNm_wR=gqmz znbXzB4R6nnX7q+=jr(a(*kXoy=7IfcCVC2Vd>|3bL&&G6EE zMFTiSX2O3`e*+?~eGX?y#5&ai&FT-A`|FLdPxhw4f(<07 zC-qFzUa@2az#oMLV?hbIW2x0E1uPV>Ff1&9Z^3_|lG?@61(6*W>`ukx)eW(3sjPVB}?VV1uhi0Fgz|;=BXcBTy5Bb%nl28 z8DXNTaG=#>3~!3GzIq}rcHtjJSkpT$*G}avNJR^zsM+QOnWZ)9SQXi8Y7`97u3+nmg;$^$N({6vX zeD$b&xj6Q~U;{W8!ZM9#9==XD-pF8>LWLxBt{z`{#ry{&>dhqp$q zY+7ce0ERyZ7$TeE`+%*zV#@RbA8@Ox??)+5NFch7`^) zp3oo|mDsEF9tH(86woj{Glt5L@-l>pNRL=R2!oe?6fS zNTn;FOj}T=C@^HL#TXhGh$M1pC4kvk<&=u+K^p}Is#i2d^1_$+gK?phyfuF!pZ_+_ zAO-%ccd_zn3sc#V;c(L}Ts6hn_WA9?{p{|>+4{!vq$5MtYK)&n1}&VC%J_mY6v*(M z$iS$BD(G@-q1JSEWN65Hw&@$wdzYt2=BYU|vwnC!_63~M2Zn($Ij^)2WoLepGdTQl zW4V(`$rz!Y-m-4bB?*4=BH4fXrz1n`)`)!kyMRFpBdt>`Hf1@J9T%q9gJ|yVT;0v6 z?dtR8fxmm&a1)LTKf)LW#svjSVyGu}feQsLd>>&@)(GvGj&&tw2Pom3-ruS|+xf@M z(#`eJ<{e)+m~M|fFi>IwzLeyKM9+FM6ImHUhFg*G$RGkZG2n{QSu20M5F%dxfC|c( zwAL$*_l2|=zVxy@H5^LAit72<(xbbY-n%(?u6oxzf2?2M7FaPESdqL}a`<@fCQBQS z<@oWufG&JHvKQ!>*Crn4RtC8KE#_}Z^G8#U=P!HDt+S@y;zwiOlZ)BFa^|3>^Nxl*%|59Sy|l#X5SA@|;2?nrRWLpZ$oVFww~)r^Qj0 z@7jkOm%Hm5)w}jg8~@{IcKqo7bivsD!0_jM_L{TI~ zS?#glCIWRmum1diok)*0#v2QE<*n=*kOy2^%}8$!E*DcWlW>1apBZux5#<=?8dODF z#Zm{vC+OOVqVp=ev#d)9Oa{hkB?JSFsTJ0Gq=!H)Pi&Q%;RAIT4Twjlo~WSXTP303N+)Kp5#+U=3WVwoKlmIj#*{RK}Un zS{v0poQ4G!aAkic;($Zr{v)Asd>p1H<{yA_Txrgh9JhX-Onr&WdlaUz@)f|HJ#2Eu<}Bgl5pF()1xDZO>phfu+<0QUk4GE3mE$K>m zs#7RN2ZXkeQ<3rDSa?`HLlS9V02ziOo5zX0Y2i4FIKzet`5E09!2|Rerl$i1ey|FZqh1q+;~X$vi}lU4dY>3eKpTRQ%S!SsZ5S;p%REEtdy+nO4} zc*lS7mj}YNUR#&;@y>KeflwMe4!T%7+H^XP3uAeBXC!qe?P$-7R?}fu0L3`KQHhaO z6MKyTw5@a4P0I5T_Zpo9Qr0D}5;Jgoq?16W6pjFccSeDkZst7bDJ1|A)V$PEN^TVN zAn+pZ#acs%-R%<%jBK5GIS1Up2dwQ@#vFebb~}%ZE`E6O^K7>g=-@`-Z9Va17^j4V z?0Rm4+pNxR)6}TbNw}1%`=k$QQ9CCAKqyk$x8`2Pw2Ge;j!D&`yu3CxCFytM)9gKK{? za{6?gZMJKz*3RPX!}|5w*+jT_MlnSpWf2iH?WmV)4g1P)`~(}d+f9;sxeGe-=>S8C zKjcJAM4R3MLIRkRRDYm)+&kC}LkN&wG+g+1e~o_!=HMK4;D_<88Z}cy7{ePmj)FK$uu7q{lJsq`quqKsu3%a)YEs3`>$a zq6!$XFzWh>&p6u!`Xy>6Bb{|Hz;CJ0ECT|*w6^3+VKGg2!wwn1Epm8vigbUvInUz% zV875!6-F8~qT8%@Ud6OM!^`->Cf(NqO@P_Pb|H#FtJyW44h)Co1R;^wG%k|^Wa&N^ z#$yEDT6V9o31HbJ@dx`Bo69gD^HdOzFVmrpvU?laK%2L`1@;q|UAme%RuQzrF)2jn zlCbY~`br?X#J?PMRFdF38IFG*SPGpLxVe-kSCQe2=?HUE&XZ@^)j0licUg9dhDeyv zLTag7L^Y2UY-CD4&p? z2JFmEY54MVH%UkG9U$$DMj>Go>hzL<>(SE1_5&Un02e+7T9Qc#r|cwUD59RV99QL(^QMm7rzsJSHtu80+a?WgV*99@Oe zj`KuidcHec(`h0Cq!M&$m|>tk1J=F3iC|=srPc)AbrcKhPtX8nG;b+x;qwold{?Ik-N#&d|4)_tqz0PhjZ0v3M~&NTNu5^W~%4nzTn z2piy%b3+-5{_gK8jdrVY2j(1C70h8@JO!eZBC62qJcs}|?%`i}Pv9YXTEZDR*V3k5 zL{{zAa%1&Uu5U~?SMC-LTaEh@QTPrM=sQqg2FOYwX;}6Q6%8YPIv^|UvGu?uKw?5w zTl6CW>5K-^5MY1U^rj4WDpaTW2SJ^dMsyDs+3%wbm&MOw)Fwz$WJ*&DBR61Y`0puW zOh#@_W)}u7UR`q|J9MwG#@4gFsvq2)AKKH0lWFzRXpTK}3%En%!NQ~CapIcV5&Hnd zYc7*p){Tzb;ErI+;7y$vshCh%Qt^Iu+-uQ#DaJO#m%GB*?d$F>>3EGb%vWY$vgk;uhAb;%1|4CP8@${wDCF=nt4U>a7T$O%ro7Xu$+e& z6xHwR&-Zbtj&G`?zy74&fGi@P@lliQ0j^43T`b@0ZGKgon%ij$wslnAEB{o!^~)9v zg6kzXjDd2VnucO8Iv2S_4J%F=D@mOsscoZ<%Jg$2cP+CJcN=RsBVz{^H zy-XraVLum+rY6An#r|te9#?nG!F~CuvD`f0t}Y&Z14@7X#gn{!ReyP~5t}7A^G3>{ zY}RSBald`>+BvzV>$mfjn~Uq0uCvg=15B`acUEa!yjJcB4!T~Qy1qCgg!re1HLTxt zfyeztt#bYOhWloy0cH()!I31 zP-C_BJUxjnIxG|qS#nT9Z+mjKd5$Ms;INsQpd_r)>1o0r9BmR}4=%YT5RNQ-a2K!h zvzr~WFT7}+-W~4A?vM<`zr`G1UV>Y*eG<2ubY9(2y*yn?!dXQA595#s-iYJrQ z(W(L!CH6w79e)#fNPf#ZXnUuP^+u#chYQf2V9+ilZi5^?-uvocHe|Gqj~y@yLEY1} ziVe!{We3KMLs7Rc%Ue}*w7s{q&hDmEeQ(l%5hj!?Mpc}idvC`X7(42g(x+BS7rY|WCj{uXUfs6$*zWs8f^a~Yzca*i_ zkg<{-8L!)o+1*-c_O>Ephz&IVAhjf6)Q+%0gVMT=0O@sPL9;h zW1+E{9U7PC6nkv@iagj-m0C+5zBn`XfyOjwoS;CXAQ=*T8C|4c3TP~#F*`Jx=x>u# zfjxhJxEKxl#Ddx{jYI9F_Cgi@^q-83iCZOyj}H!QB~I!j($Vd5#;HBoh)|n0V6;kp z#4nula6OaHpj+4f`+mcS(Qh#7cg}gd9-te{I*<18@w3jxdrR7JvDWz{yLEPYhaDX( zF78xMOY3(tx6_wrrKxeZ&RzuCTSK?Q6cvA@MyzwbA)TcAVL5m$qzytcvuP4yg=wB- z)BK%I%VcVZ&b z40bJ5E}+1~0u%o>OnlRDhyg`mZK9L_b@0)ig_{e9V6l-M7W<21)i=PuaWUZNsk3dT zEKJjXRFCE?Ngf*s7>{R+1EJcNoXE%i`f$ zo-E#Hol;m88+#q9nH{M5tL=;_P;n+n>tA|p9QC#^UyIrU>Tg8ux zR89xpFb#C`c1W)Af0zf(q=Ho&{i__W9 z?#|13O}qJK{bBd%vAR`vQ%jA5e9vzF6vKEIkf{K@u!b`g$!cqF0^tl?BIe;@e4~z} zV{p1U^pg6o#3-xvs7M0&y`UysV@M|qzJd>L;UdV>`AJ&l$cHo8>7=91y-Eyx7;UNc zUctw?6N@w1&-z-qRBe=|FL-6&GAH zZIaKrRI;K{%2%TA2}vj#Egk3p7%H`jjp@-Tsd=pgC8wybV4|mf#bJ_@B856UQ10It zurs1_8gyR`_Hn@iJX+uBw%|2+e4SNP-q5zTp*R$Gij?9`p|}=zcXuuB8l2+A^~2pM z?(SCH-Q8WjpS{mHxBtzGjFDs|7fI$j=X@U|UE2Ue_lFP4J+p&$^r-vnpR{FPOc*og zpjOxf|2&l7RnOP>lwkI+nr6kQ-F_o}E%-HfmuTKTr1-j~SaltFK3N;$WOGywwL#tY zZ&A~MP&8I=QpFH0sjIxT=O^{gmVgwA&m>%deBsGf_$@T!J$^9MFhrn4vM3Y4`9|*a z+(GHv7cr!=K7dDIZEL05xM=nq@0>(g=l^=mAHSO8=*nMIU3=+ate zYNb6lnAJ02SjJ0EQM+~Q9txAl7{@cG)AgtK*vpT~iM@G*Ot>k}&SIumt^v_m5Wy}Z zist&aWh|K>Qh|(Jtke8u`40dXZkQ;XxQ}9-YnYf=@P#AxeeVY&pItw^Il1yQKK^B? zr_I9A8Ku^N4*UMIDA^P#F2Z8Ys^ySm#H7O54DFu4t?CD@g>O|sigLJgt! zhaS7sD%+_XD!R5`zS-D%zW>roP1$vf`9tzWl>Qh~+D6&P>HEzRWEl{T`kM#H$i<^< zR~F;e!z#R^lQD+e^Q|z!lJ4y*?o~YW$*Q*$L%3e3`xj|RLVRRbEPGN*c2s1}gfdi# z!6$DMccINSMzzIqyY1;(zFbPoUU=8jPtlqvU(0k>ad$IQ^xciO09xhy377d6O6mot zsk`6Cj;R%ZX*En~ z3QXM&DMiCtk6rpj*5ys-X}yVnR6LIqx6xmW#E0#kX7h0b;U-km+6=m*-w9m%pe$2J zzs@XMPpYUJB16p*#D#6kA=()JRf_V5Pf(R}5>>|u`d*6E=FtTNC5tII&d>ZVDRIMx zZ+Sf=Itp>$Yu%^%)FL5+%`%%lTWG#cA;;o_MEjGa8bSAIHWODoEgg~YlxLMljvJfV zxWudgoHqlB(26JX&#P&Ya&GKFUki$EvKZhCAtc&GfB^ z;}TuM!!t1JUqU}X^htOCgsjMh{M)>I{d(KXl|A3x_-admY2uuJVb=5`T{fYc=3p+2 z=&iY#;8=#$mVD@AT>%x!P})6Na5F55xP!(J0PIv;Q`X-%eH8(aNuO`ecr&SAIi}8h zP|lZqJhLWP5d2Q>u|w_o1=@^(Eie$HF9ClJ{NNocPZi%KY{QtLfIA+IxxVCv19>M)ITb<_5j$>l1M z>L@-QT?9Clg8m}IBvRXs{#9s(VPmo;Hqp#EB_lLvqzj9j7Zm}}@9`}3r__Q5>%a;BSDr(xg zjCMzOX82~al=XPP?tD+h^oobdlHks;wjFv4+AjWQ>q_ekbk;VN9azm>kGxu1mbA3E z{!4MEO|ZMBk_7&eCGW<-H8|#ow%OYL40;#)c8gO9)5k5E`>T*Ajo15}D(BihXjT4~ z=`P-$@Ad)5uXC!SC*<@ONv)6e{^wyEb`OCHZ`_-776C3$P@BBfx&jNV7GF9d1&uw>dI695PKy z?QL{xZa6#((DR&5W~zEakbg zZ~%g726TP_#Ng`O-mI&KkKM(4-w&(j=C{nY5@2UVHcX zn?jab!Y)_ELf+ffO+wz^OuK}m?F?3*z`JL*;I4sukJ1DGneD(C$(_ zw{cFd#-GNh14SPvAD_V8#teQGIW@pk@YVP&e`_qv_dz=DHB3|+c)McFx1Z`ewS~b zKX*p5ohC0Kzs$Us(vDvcG0MqSG%uN}PQCx--Va%W;;>)~Hcs=r?;nwuk%E<=g<<>^ zj-_A-%nSH_%d(?K3-ctH@&X^6{Mr#wh&}}t)BIxZYE9c>AT=wN(X=0nW%3Zm^1YgE z<*9ClzHa$nP_vm+>AGl;>s(Yhmtq_T&%V+m@9@o<<6exRlyI563b7pHx%9#~eC_?k zRMv0sOT2iT3VaoMw$M`7=45ssAM>lV zK~0U=V!i@i_CGGP4a5zxZ@l^wye~It+{!Z*Z~Z$_B}WDEqf0tA!23b732$*>zCAo2 z^ojPuPt6(OYL^=rE7EF2ld^X-^!*rpIm@w z@W=n{-;Fc zPWlgo^upcDiycJ4)l+b0GxXhU;;IltHc`C4|?)#6h zbWe!|R8lwT6e@tr>Ftxpshm)A93oI4D#&IhC$+^B{nm(1@KI7@u%&_tYu&Y+><d{BN{NSyyoU<*JQanrFldBAEW zpo2b@qTjGI6}bEm3zEF za-v>z7PF^6Xv9mM4Cd;p=z-jb??~hZHo$NG&xH(`QX=U(Vrm62hHMoOE^$VyFA4b3V= z=m>OTgp;jEd98c$TIuPk%Gm3+=87!IDZFpZv`+fG_LElPD@ar-!K3sGOWgJDx7in< zz*y}v-49`__@&~yVG^6hTxTtPYbmcV5)?<^M;m!Z+ITzqS3#3w&;Gk2gKF{W37MxE zIb8BAJ)CfS?G1d{SfbMwh%f&JFHPg^Og?$Ts9ri|vsEKr{0hlvL*pPY zEk7yuN^lPJfC*tso}DpprC9J$yo3Lgf{02A_j1;jES7HymR)>0TvhdSRLYEFR8|!; z<=iO>OtwbTE(Aqg{%HCCwj9UPS-TLXWwx=sDr$nGK~)`hCdJ0)rbDc9IClXi3s7l^ zd&DuNhyd0P$D|Rycd_hGay0ut8rmEQEc!JM!xwqvt}YMWVGX2KeQsxJFJSu$@(sKs z9!eV@vRLMi7w54}Gl>#Vmdp|vNPg^AZh+Fb+?!I@v?p;BI<^A17SSE3^ zhts>djm;-mILCE4(OgE__t=1`4Vsva1E@b(sGl=@M>mt=%?hKNLn%!KF|Wi}X+u7X zmhsoS{eD9ro>mBF;%>2htOb=lrB3^p-qq;o>U!=Kj9*^yacfzgsh~#NW=%ApmNFF( zxv>Gyd2FKD^jaZ!Cg>&LN60PI$SsK32}~oM|0oO9TTxUP0cT@PQ2Tt%2|TEC}=Hp)=o~L|W=BC5v56%nQ=J|K|{P8_Y$@ z9X@OwBphlY0h-CM>IuQ0{H=<7J(z5{OvYq$e6*BxMU@j3N~!{PlZ zS`6oljAsYQL4!4z$xrN{_`4JqeQ&aUEZw3D6_AT6A5!Se!G{9jFB@m*`Gyj7>5irH zw*sq)4f9B9^t93UKN7@*y*>RsG|ACc8wq=9I~<-yftXIK+Yhu9{6a{a3h`wvJ`1+x zfeW71uA!6*3mWZ$dT>*$AUSNWtLwWrDT+9A^lZdwzTO&#o10m`v5SZ0#de|d zmA8-WYJR-uXpLt3#bFu2){9O_`HHfS=W^Dp_{L4Dr8N0zP6U*s$!Yv79sM_o#TjTe zBqf32{En(9lB=EX3BcDTg1ei}k{Tw|HH7d1!=DeS{@qc?9z&3_rDZR$Jp&JBi2?Ze zDV%@)lt|R0M_SEu{tEdc4(2R}mzb5&a7@~^Mpv=(uis5WBvGaaK^?(vb?xx*K9^TN zi7BvgbFK4!{pifUVTuRR^zeYtp?)`gZ!hU{@XKUpR3r4OJZ>rl_^tLX%@-2zfZZU1 zL8dD83d~*)pj%w@?i`PXUn%#zaranqw{!<{PjiBN=gl(EccDI zIgmA*TLA(N-%cjl-%MFSu5^36B#X0PH3daKE_yI@p*=6D?xsxoxw^$wx1GN>VvsQs zwW^?3l&ig&yEeZ+cG-%Ta6zUxZxz(JFxWG zgw@nVz>AZ*Tk>3{AjGC+>0*9^~?V5pvCuHw$O2nIJ zA4V#J3EzKH-&Op+jdM|BiY9G7{Tz12KSsiM&VNBN>snc6og5V^XpR@sR_c@I7=BAQ5ePb= zsoAvbo2^sSH+*x`_1OZLMWHsn&86L|zD=s%g4;4O?VdjFUn>danDwLeIALAO(d z-J-AXbv8Pofiy&(S6f`?Hre?Wn)7eB@E(8O*?zQXy2(pC(8n%5~*h#oLCilYic`6J4x?9=Ct$dd;bQUQ7Q^wNVN>*#jtmp zUHotUlI_vs4T^njFCz>g~8?vDsq<1&XI zMm$9Nh%08iMBWrQ5H2eE;gBDc$DdwtID>E?JOG0+yXtP%yx$-{81?-( zssp4-HRavFub-js#N4wR&0lhmXjqryh0A2>4t*9G^JTjGgOXR*R_(o8{tQgoee99^ z?-(Zi>b3l5p99pErQR|6B!Sz~2`GZY59c$k?1wpL))k1XnK*j9 z>Woz|EnPyJ9*!TKa%d+>^lBRN+tGG&wj~I4`2<{P4@M!`Mv1#(1dk z1JexvdL3co7Tan2Q{#dyzc?!%dR5rcuTV4;I=*2PMcPhl_H+m~?K2Zrmca^|JydU$ z5{+q>U-N_by53oiZcg5$wytEp3KHOnTCm-CcD4Pyh?V1z^GTY4UiCcHcZA&W-*`BH1p=_|XXw?d#l*Olkb_jLNrV^;x6V+=9JXDU zlvA5qZ`WVqoT?njv^B3Gy)vLIJ~@=LNrv@9ZZa@|j`IfpkQwXY4J4oh9N)Fwdhs8UCI%mpm> zKCfU1UQOB@LM!M!e#bGP<^n^ZAZSlI|MI!~<;vn*-RYvmqm@4W`m46XYT|Ju14yxF z`62m4^1ALeN`NDCXlE{D2dQmPu1rpA(y}w$YYt$PqKXf__o<0TE8bK2`u3UuahV&{ zOIi8Y?|j2qt7h>JGb3)_J82%`X8_5em;8NXik<8qq_Tfo3faTS^R`EW4*t&M(sVDL z9`BtOPDN;oD;MmrHeMNj&owNFOGVl=#3NK<7RJGFc-|CU)SY&y@+kr(N6Rn>6qvY2 z`s2#s71=X)qjV&Z<@aM22%&V~xak$FC2;HVDkW2ijaBF@HV;D8y6dfgkO1YJDC=g{ zvt-w_N$b5kOQ-4vPmcP_LHmN7kG?L=l52ZM#TMJldTG*@7vZ;c%=hO;X@yG>1jGz9 z8hd!7z~P%E|LymDRbSc*!nN~_=aR(v*}P7WWlS@e9IL(o>oT$aE6IweS1aq6KaZ7- zoSl)ay9SORNk$Lgg626h15kB0Z2T-CNnp{IpnX@;pWM46s>w2AUS-cwY8ZS4>=)Wf zN5p8;*&e(XcsF}Ht9i9+rDJ)d39JIND(*-11Kv~9tNcHFC2v~7yG4GLRCwsk_m zZYgeH`Nyn4<>%cD_%)vyy#c4^;L{9WY4(MAlu=yVT643i8jst50IzrP2P{1qrFGP6 z#9WDqVlZCRU0&Y0WB(=o`OwP|d#k{wvQ7pW8Y{y$j>{*f`^(L_%wo!_h#a|?SpBBj zqCJfZ{1@C>V`J0j*AfSf1MSn}l6Bst7T*pufsiO+STTxt|4kj9A`mVq>my2(8eDee z{Fi-$s&+h@^(hW!AiNVA_SXs6g;R0qi3G@W2BIsprx&e-$O5@VvH|2wP~^8 zucwms6OsMn6E2veZg}HCe#gc4XgcdAvGyo&lLu0nBhH5hdk>c*$;;i<+nJ&25lG1dLYY~-bHZKGON-CS zu0d^fEH}MWkG&^l=I`;YrLkS1CPtZOiR-iD?QK31B0DiwIeZz8;oN7akKtQ+8VZM~ zM*V;H00_us0kc#M7dg^M5aQ??o#r$=C7u6R$FFx(R2v!H%vXgiP2cb5WjITc<>0gs zWwAX%mS4%^o;Qfq`Ws<_6)06bYQEmZ%N$2ES&g-_`Wrj;Tf$T2ZVuJeqRca}SGQyk z5muG$weEZ=e4wLxp*wK|tWEXa7DY1*>EswRBxAp-;uq9WJ)=X4d+KV**B@?@(>8BA z&vunMWGkaomR}Am$wZAenc$2GkYlAlgmV0?bNBswkY)E;)(&dnTm1*e(+Pzl05*!J zDc(Mv?T?ta6hCZ2ws5qQpo8_G~wKDf)!rk?iU-`Y&Kmec#0 zADEkv@9dA;-61&X?b!L_zk$uq5SUwaEZvT~%f*y%$qk7X%i}uSOAqSL`Ci6lmzLD6 zAU__ct$tiI?_X7@gBP8>e`%AE$`EDC-+}w0QT*vpB8y@^=R;3Hb+xuyq7vG0An5my zfO#U0q35O~%&etN@V&0OM|EOWtB2O4(-Tya-gQWR)_Mi!SCZpE6~^x{L3e+ZB7*2R z%a&?NJ4L@Jmv4u|B&@p_;AVfDvaM2b4S;i>qm@<++NI5y>JDe6sIS*>XFN2TT>#Xd z9SMG>C%CDwlIO<iME6x4Mi6yE}b(czdX)BAW zt#r1lTT;wK7Nf%m*Q@y5-`oobRRL^ICB~e{%SQji2LF!=_x>r!tXc;tM0Wdt?ZJHL zP^ft%6~Z$5wlCt@N+UtP4c-OkQn>hhxmPj;cvxaiTrEdu8%kpk1Svk>Ac76Cb`80) zw88nRh=a9G0&>)JvUtPqh#9mLw&KrWwtcID;V&W&s73LLP2X_x=W7F1o`57Gz4W7! zxsvPAwHoZbFLW1!B>B)u!q(FoeVzuBVn3zeW}kzs58A6)xJG`k$fWu?2iLpFIqdB8 zTwbaY&4+mfgUHxUrs}Y@Jne&^Wmh(kl(q05K;E>hGLQv=5XEb_gkLyE>GQQOqm|g1 zQ|!gL5uKNVDMsE=5~NlmZ-JRwWH^zMe1#?~%Bv4|*#Lj2!K8Pa&-QuGR)z=rO)csx z6-x`tGuyX1C8jt1#gr8`m3aLItT3u#aj;=VQsPzm)WpoP&keA6u(@%kk5}ApWk6;% zt(<86GLnKl7t|U;N|(Dd-j$voBKVpWn9Ej zSJAQ)Rc~*I6{z*Pwb;RRjudsCPoB6xRlZyMT6w``S+Cd8KH$!sJg?CGxb@hpdAHkf zy40^||cT?c#IQe_J_8DmcqyI4xNa5(?{eb-j!` zus)!34VhGH=hkDom_tRK0PF@j`hLRseTGBxn{pWu&k#KMq_h$*)-`5791nGh?`({b z80-`m$lOCaDY86Q;{~=TJN?VeP*zdYS`yK|l>An~jG1a>7jaj=V%bc8pNUe$#1u^u z^EjEriMOLE!CX!4@c2k`oD|Wr_wn&@85Lb~{P_6%cd6LOTLQR@PE*3kauvPP=kWX@ zmFtWL&199AB@=nPIFqKsE&QsQAdWeArOcSI#xPS3TO0}80Prf-lkck_!>l9l1hYRs~mFptK) zefnF>%XaRINC<>7Ogk*n_YJ@#%1UnKJtud`ohJtM7XaRQ3YCF#Y|+nne$SkfMu>=B zE{ES zk~{e}OP+ryJ3+8;&Ri{}wVxgUUgxK|Z4T9&7Y{nkx3tVBcf-STDe+|eCGelxB)A@h zm&I)vG%ziAzw~o~ek9S)T)y;zE?=*DYyXtuLNdIsU7)xSq?hZ#bc|ED(KgiGFuyEi zIZayo+8#Kjtr4acr1_vbzFDT!PLg%T&z4C+QpJ;$YXQtf>o>MusBNqPy;F@>6O)q~ zmU~2~VYQz#ic(18vm68o-Dcxfdc-S6>~|1fGV2~c2kXHK~e#N3rWY=p|+8`lHaP|A0B?7HLRd!R_ z4Na7NFh&JG#YL)8YGNtHJ_TPzFjN+!bP3Y>x&Ti5CD(tOSA9EvRkFntxfTu(m*>M5 zQ!yblOQ4}+msEbM?m^PhUMSJ4-hfjZfRo~^N>R?JYy|LQ(A2j0{Jur(z+hqqstQ?B z7L57F?nbN3Q*)`HUcJVKJ5`on<)@I64*?g!KKRV*lIs$I9DxTVmx2J4%75N|M{B>I z0MbM`IRXzuWC^!6?=u(I;uancG+f;94G??3aPw=Onyr9r44;Z6CTD3mx)Nt8ZrC;L zIaD5fLs?gA3g!mYg4wUH2~?2Z_v<561-F%82$*_)PA`5FdYGmiIJ_>KF{Wm)JY?)? z^1~*shi3TKW5LU`grs(x4}!3~RPyNFL(ngpQL7QU!WJNg3F6#8R zLUN`4qdsB ze{tbZMWt7um(Bvdz6C>v!A&dJE?6Bm39FXtlE5t!j3|`h!AL($(E3odR!zyr6r2${ZsH zSM4=s5U?(NyvnjXO@QZl9_&72Aq&!8s3ce|{{N)D|C9MnM{|(F6-Y6!`JQLyDpXg! zH=oHQH;*&P{xDgU*@v&ayiVjMl<)4h=Um+*wMjy&^aMnhW42w9F30e$p8C)mi#fl= zO_NzBcEM0QTT@RJ1s-sraIxW^ej4h2Yn8{H)r5UNYb6>W<^6|>tI5Jxa$ITM=7x&@ zyDZ~DtZ?1(h)K17&5626vO(tF)#El->gi{ zMXaTZkVYS>IHFSbN5ZR0r>DAm-}70&8AC-Bz+$s(wPNhxl5ETIG@&!zC0YCoc_(K1 zi2CW;z1*fbx4Ir`F9Y4c@%XaWk20yna>MCRh^W9iQmiEP&YFN3A|qv+2{`LqV8P)} zVh@J_3cp>*)pOHDdsQ@N=fh(FbLq?h8K|;=xAWmrT)aAXsx-2t?_vtSq_~qju@9xL z7j_b2kMDmJgVY3NVA8J8g3@7{F zX?uZG2jV1JDAhmy2^c7yL0~CB$o#)@fx~6S+%#g&UugMf**`(W#QK#jA!~Hgr=KlMv&F+$fJ;RI4s7 zeKq2!gj_Srh-Oq-<%4rlH{iQtSKuO)QyTpk=a5tI7DYS{)pLPD5pZ|7bk3^3#am z%rSY}+Tj<=c>OwcV2nY)!(hTW8^$F;L5HQtM<%jZoh0REqE9tow;y*w6Ki{!Sf}2~ z{QfxKrxjSx&`(8-&slc#I_h|G@3W?wajQ~3phLc|z8|bE$bk;J&^*djqMJ)|yHomo z@g7NR*h2z-ue4-b0=Cz^I0Mg55JGZ#Ob5f$2NHPcCiybr+3JY^tiZs6=33(HSVEci zx2PEdnhIR4f@XzLPq*4#Typ}q<9(|dPu>TOH8ev7>Wj+y-DL!U@-=;;wQ`2B3B9$1 z9=nuIJ`dhB0ar&oUfUYw_Tqb#2H-PW5P4`;oC2e_93n~Cjk2>E9e0^2e)VCwnzNd8 zXnJm~*6cU~cNsFkp*5vx^FL9z@V|GFJuaz3e3;u9(>J6Kb4>mDgt5P(PwSoA5i?9{ z=&~*o!ks1Xw9&tfSK&WFi--uKiP&X;*S&UBU{qBgg9G#(LY;)Nhf2qEyv|4$q9>ly z)2icW`P~xvyv71PX zO^aN*7Xf8_~pqiYxLy2quko$CcC2YWL)l?1yt&$1#WU1O_{wv z-~r2h{vpPkNoSuvZUeYA&ELe2qE44~?IVRKyDv)td^Q~GD!Dtd9*xh>CVIp?pppLm zshj@!?#woQmj=o%H$iYL-DOXGnTQEAhx@WPh4ZL+p=PpE zfNQR&e5<}7hsw&b;8n4cwbvYo88l}g_8`@vNC3at0aSbP+qL{z(a<3OD@{|VT5TzO z#Lq#`W{uBNu`_xPw1J>&Ka-L6xCwy=tF`Nqc)})Xz+y|2w?@`qBDfx&6PU0o-~pM{ zCJ1nqpS4~0P~gAwS#YUC+%>IKdb>f-y`)Q{=1AcT6=F3xjVNtt?=NSOZuywMtnqm! z+VSV}tk8IAdUEr`H2T}T{tCCcylzsY4irh<-nX8Ms@#N_VL3E6+#r$)oLLhf{#k%` zP#^*e+*ZCVZ?ya=on@D_Ei1c`?{DAEp(Hwo_3P10BI+P4l&*8~otVtjlaHums6L0k zT6t2z5Rw%tMrTY3Qiw;h;#?&soh1)S3sP8M3!>FDAna1ghM$+(XbF4&?4tE$Jn;B# z-S@!v;@bAo`TkD__pkGEj-yZ;dWiC3LXeO-;2mtOLvxBZkw1%Y1b|mIB%kBImQEIt z`J3Cvo+OAFhfC8$-J_;{&J8@66MgT;+U-h;Nsp8~KWUgZyb3AR+92Z zz>I80+H~e=%;|nx$2BO`Y1Hed0I#7CQ^;VENf2bWl zF@}8F@FUnqLW&l;kC=dk1IFbr=n5%DfRjaLBkT=EaH$el<2MP)MyJ5&$AM)XZ@0EV zWCUbQO-DP_;w(bb5bN3{L2)Y7$*uR3HYGcHZg~{^w-}XSa93X>v^RzN7j`i~v5U|F zDPI|{@*K>dLUa+gE^tuH?2(jF9aC)Yu8pdhrc(ne5^NfF5_vUYL%JiG5jwJf=_IFb zx(477!|AP{FGi`kN!sUDKU#mGy%0#E{cfi9Sx-fQ$q%**0RgW_Xs3-&UjAjqxBH7N zDd-#lgx^pEu;9OFu|CF7bSTwMP8k}P)o8AI(XVEiAv2xX^7COeL|om^l+-ym8V4hr zCK^ZfL9vS{O0}aXj%c{6OAkN;nV)x!!o^kk!7`{+iJDP~qx@UsKMA9JoFQ_4Q22UU zoyYr;nCD|F!>Zc*eBVx=*tSXE%2{Ll!9LtuzuY>-6iLDd-qD-B0rd-`vq>4~j#Pz# zCSe?#V@Vkm%y#Pjv{(u_OUb+KncYn)*Q*AIUmg_BKBJ!gmaBcch7-5};Qs73EWZS< zt3r)lE{MMrlq+J5@rN&YqRTy<(&9ln-XX{%ye~rV8cThj{=HfNXOu}A-u#$ z7U|i=A+vztlGPE!P^AI9(g&y&7ypffrda3*sS2rKS*o(44WM z_F%)i$s^CUWwN<_;eBiUXhzL4uO{obqYt9^6FnXbkGYPk@6vam!1bYFw#5sE+OqMJ z!7s~h3h;)WYegoDKkukf$Ta-^NoKo9C~EWFkO-T$cgJx1=|c=sVdvbU)>%I251xL{ z=TH7%8g&)(Tc2S^P4reW}!cB8_}JEj@|TJx+@S!;E(*|FG4fqprLk=64lyFr+*_{?eZ+anoCG|TrzHi_0AMFa~l_dhw9%0Rph z{-^U_>?So;Rm99j+2Ilb^6oJoZ28{(GHxz96T2@j;&Z)Q;~s`?PW>)kLI#SO_VUBj z&J-}Q-MM^#KukDdgzg8PK3-PvJ7hnepo7X#pZD7f9{~|o)m%JZUApMEG~^|EHaYI+ z($@8C2|_ZMJt4%viYPTaEVkM-1f$+>!3flp*(rWTSPFf5Dk=m5;{kj)MA-83UQ{$U zw~lwYTFLdG>9wb+_j9d0qcO$Ff}Y%Nly;H0K7TpD;Jbf6o`IsDmxY7!Q}?$Rl!&`g znFpEm40Y6@vNm5vwW=2NjU?$zT%3x)!K;+nIBBxB`T=Wf4G|fWSu4=L|G`Q^;?``n zs?Ks$Q|I<>XDfM0T%6&4*$v;l=2PaiUaemsz*(TKmZ;B{c-GAj_}LGQjj56$ux5m{ z2SA{W$p3JW7aQy!4_x0@1|sx!=k|{z!}-n%t{vMQ9DIx-glZKNMFPSRXeo;y?+1gu zEuJYkcBFAsofW)W+*iH4JJwo&MYeygIQzaO5pM4k30nK>+q~L3}IsR_^!^c0PSfnG_9?~r-)8`94K|E z&-z(J3rY!GtMBH7T*}R!gt)N5BUbY+YvI- z$A2*0-_5a(XAp#&qx;;ptR0*{F@=h-q4X#xpPL z5L%Rm--QN20uf|wKTkuV$ldGNGp5LwAy!=>&%q&jubM=Q2U0kuz;8p+3`S z>gFtywc6tOjJKY`M&(?crb4;whjPtST>gE~7?={T=Hb)7bDdwS^mTpkR7Ws2@}Q}v zNNaqPxHg(tZ?|6e$|aXvSlwC$GT<-wK_q?+OV`ltPPa}VQjGZuzlqg1{9 z$j!l)?}9+|^pxhIEsJNlz4Jhv zZo=q?0|4ReKR_K-bMXDAFQoQ7nlS$Ho$^FrV5QDw96UmEG(b7et`mvaP3~Y__jrTn zF+EfiW?Rr;BfVBMy~0zGT%JDotG>!BCUqNW7-V*)yK_pfJXD8CTuZ=9dGt5Yc`4k! zJAYJd+LVsaHjYtSGPxpubiT!P>5~fl?rjFtHGsLLFYZ79nqH7oMpkW^AOWfAAuYs! z{8xR}bgZSSQlX+5_u?dJ_Y&B@bIgSoCls|rt(6hzE#=hjZr5<87}pEs1pR% zC~zehGK%R5CwAh8KC41qNZpd`KZHj*|6LVM6OyD0N0)$Ztx226HynjUR8~Ac)$l6n zG?hl(YsD*d`cAWbUBF78f4MfxuXj@awaPlSvx>y_BnH>p+zD)7HNgINX;qiv<}${M zgT6SS&HgJ}i_-PcE%WiTN*op7_T>vb%h8QsuO^MI?t1rw=`pLGCaQfyER+h(mNgDx{`ykM zJ1)*VX9Nh~+pk+vMm{dTB0Us7t*&}kc3_~lTFWLsf_IK8gRclbK}{R{NO56P2VQQb zbfq~z7ejs4L?}>9b=%$tAj6RKoF3COY*?=|1mXUz?K=Mb9-Sa%wV|BcTybdN>^j*G z%Qbhv(b`VC##jpl^3kw?`=hD<;;vDT9!|8LG_#( zhK-UlBGC*9 zC3s)sO{jgl29ybku>wu=Hi@#&4rZmN!WU+n@2C?P{-Ehp15Epbs1pOV*%8iWP{24mNxEHN} z$m?5Piw-+BArnEz7RG6~A>YrRtFk&tkA0IN$5`5*q%-trwvJAUYJX4kg?+Hrc!XAD zhz6B^T=1$b^d9^BXo2}ZSDDP(m!hz|4MBi<1>}F8RI=$5oM&AGl-Ajc)Re2?ATruYa8#<%QEazrO80pLgPtD zsW)}jphn0B(kTem+&{p0u$r~;(tyJSp0fiH3U+lHTi9uH)$nutJ{xQdNYjvS#~1}$ z$EXDHzG`ZV#y+~^^D4~zCmLpi%)b4;bfhR*PS`OXxElyx3K%*ZE7ijI@P1-okUL3b z43!r9hPQBA*K{V7;|2%b!?X6{-=AR+l&~7;GbHBbLUQS;g1ufsjgf{WdPrX_=M zwUe6q)Mc9Trgwpbc}1)S?A|zUhPJhz%~;U`W(#?ao&}or2Y0IQIEvC0M!aqCoTUG4 zdvQMdz)G%i?7Q%rKb-P|f3$%Ws2mK+S!>#x!k9hK960TlFjNn$KLQy-k>NIc3+vgu%Bjz{WTKqL z-kSvP2{!*2@)k2Hn=%8GD!-40UVFPXYU8^D7vPGlDv@KNHC-CI%i?KB-P zyRAsk7ko`!SoGSk96;OQjaQ6Mq5FWB7+=UQ-IWf9gynn6bl>q(u;749bu?!U&<%`iH6<; zk_RC%nI5kcUdEp%!^!@E%e~6|bs?gGuzQ}svTir+J356ki;bTX6 z_{QCiOh-I>*Z{yBjiSbJAftOX6QxmBxe&9Um0rWOIta1cp_nN8Nilew+}6TMjGHUr zw>=8xgHk$wd^K*+CurOc9%Y=YHO4u-9QcFw(xvEadg{nCb>^AluE;3x*XTVJJ5$3= z!0kg7)39k}9Fi!&?pNki9C4pyDA#-rHHOKQ`zsKp2?o4<$l<%%Rdg_W2eW^j@5;-> z?j0q@(#5}qQ5Z76EsbZrUS+LhjlA`-r9FfOQ?x3PUg?~EG|!ZffDhQ+j;R=5HIQks zQl7r2Y$vWhc)QzjaAR7b#E8092^8zxDHZLX?%uU2Y2U36%%uJ!F!eQf$AT%urp$=_ zm)#i(+YSU=Tt_(dPZI!X;K`u%|L!%Qz1&P8&DzE(-$xq8zb&xHdmLu8L26Xr}lXy z)?|X5E=^@Dwt6!P9;4>bh$}tq{D7yi^_%dV&2xvlyMo2u+7D`w(w(~MuDVy%;8IyH zp@2YzEtnwlNAkXG0kF7? z+WDp;(XcqS;B2A2d(OeBX`#fnOAY(&-Tw;~cW;!_IyJ~d{zCh~lgf*8k+En21`FfE zS34V{J*;Y!!V{AeSLT-TV?*@7oeydhkU72*0ElTIP+|fcJ3Mt>rk17}Y>Q;?hwrBg zRPsE?uP5K&>gP{?(}ngZ&4zb#D`-VVStouPO~ACQMz+#0;UfKL!Qqm+r7Ub~{#y^Vh4pbFz5&0xtx1 zMPrZS+(jt$usEqg1d@Yyl=HM;D1L-{rG3d7d!q#by|B%olQj{0qvJb_?lAp?S4n89 z{gF4c%?ufW{qz^Eu!-R4FQL6E=Ti z`*QEz((uiRm9-pvaJQYoh7_w6J-)f<0Q#jnd58g4*K0&rv;P3#KBhsvWy>%uIm>yV=BP>^n+W)UK?oJ(C2=TW@9DWNtRVgIJIMnU8bB$y8VGL_G*wJ z)z?V28kXSv`IsFAjMS?qXR8u>G^|A!eKz>drwX=kCwLU_+jTwv|D)@zg5qePb#2_;U4py26Wkqw zI|O%!#t9zW-F*n|GDw0u1eXB8-GUvyy-(HoZ~m*Ux#{ky(e=Et`o+KKaY^NX#&}*| zva$YkdUu+s)|^ERSjA+tuLZZkl?{CD^7p4h!WVeW1XkBHWh+j0>t4KW`z0|dqv3Ib%DrNwXq#-$xrFn45Tj-baH7c31h4)LzyVRxCah{bZy& z0&&$$iGUWNTx8%rd<*2!4uY$$vPMO*L=eV>&F@aPwN4cgAwE{mWp;(HLy7-KIJm`_%n zDx+0kK%y6ythf#=BV5r{Ahx5$BZ|UBc*fO1T^xKykU2^TiD8T4o%Q0i|4EAMi3k#m4R*drH+0{)qcy}2P!w;WS{L^+?{6goB zFd_vZO^@{CD_7AUQDPQ_P^;!DQs6rFg}A3&b86!6KHdB&#w3ofoK{G$Rz7W zx|u8oTKEKM-@EM;Vk}M}%PmMsQeZg~aPw2#>d(eXNV79tg=F*%UuVu#2$5c@L}o4J zGa-Dq>(AZ&?JyP+?n;)>F^EZ|R0VU9hzW`IFvkj~LUw=|-wN93zd$dOo_FRx7)ONf zHf4eMPHh!Aj!@>IdCs$0!(rnQ9?H}lu(O;URMKe797=X2X>y1L1&UyRW1ZwrNt{Jf zy-blEl&E6+oLWQ@9o~io*;=gTmRd!cRy;?)n1xcJCtl8-pK)cFAhfM&t8~}@_hZu; zR*-;8J^}$rp=eCUE=9=+L%WgiUkjXTTNfvA%IPd2Le#waLE-tZK?>>|h4KzvV!vau zPwt${l@4sp$T@l?GdvsdX&3AdOykh_Gjdese_jJ|X*; zBRr!qQB|m!1t>>(nS6%AHJKe{#kg^NbwYdLGkQ$JAbfn@tl02ppZvWuPCdwZ8@#`C zw$h=GKmR^HFk~Fq`n5HXBn1#s)vwO68NZCAyw6brDShD1NZ1;~G7d!Ged9$WRF0h; zsX2q7Zjg*&k9~w8lFsxD8z=Vr&T#5NBZ*6>xsLXrQar<|5RMBr*q^}7VnW6hV#bz9 zI2Iy3kFdciqzzFgVUU$ZQk~RJwjwbR+GGLg6h{Hs?SKB1IrTsXw_VaNP`t_2?=IY^^_Xh6 zvQa|8>LaX9#HB>Odm1}+$Yk*hWhc{pqzZ!j}LwEz{J1*<06BL zB%t?re|54Zpr*~c`9}X&)&_DHu6?xJOWgvHI)G(=8O*GQ(^fkEv)7`82kAT=>LLA# z!HqUnr^W36gXWv~tVqNiV+w81kIFPRrEWDcodrLwjWJy*e1NOBq`r0qTu0 z5!FQF2HvutRy0s8}El4J+TjwxbF#%ST&i z&-*xOXlW#M6{WnLoFr@J!gp#O>Y!ysJ2~t3+jp0Dcdsczz0aXD)&i~q60BpsqTpAcbh6p-?F=V*jLCiR`ITN@z~Mn!3HpQlaajpn=lN zG)cB1Y%sh7Ypi1=mFs`5X5GE~apC+1Iv(o!6B-_Bc~p6g&(}S-BB03d5-vw*Kg2X^ zISwO-YjqYC}e5XjKtF~A{O83vP~WT--l zVb^#t*8N-8Z+{I5&b`NEB&KcJS1Uw&t#+*)rD@{5EHMq-)fX61aUlR=G^II>mZ zj?lY1*lzZ)yJ?6JW&wV5S@@?`d*^THh%8&mvV~a-q}X@Im~ps&YITEtfL|ScR(U%9 zwjY}{e)^mDLg%`t#{`W0cKj)sVgjOpue~~ z=gDoAp5ufZA`1zN+E0?x+Q=5Z@+4XuJ&ey0PzBf>yqcj@={J}y61iS8h)Q6bEwz8V2`Pj4CRXd~moE{p7qYwCZao87FpBObZKY!Wj zd!Ng270CL~)sVsV%)0Jcx5pPzH|_nFM^H)3ZmO^L4K_2&%Q>eEN~X)-z;2@_J>LZg zl0Z*k1BQ;A+5? zbihTV;*MQM(xGXrcwwDn^dswRbH+2JOs~;)_H5J$+NSHtc&WDF-KN11jN`>DIbAV>9*GZw zXW@Y@O$9WLw|94J^Q1##1cEPp)z)WF9Dr2hLe$QP=U6Ecy`d$;-7$-5!Iur|Z)EN<0rg@Y9Q$a7vvtVC7nT!;M>nfH`4`SYoDPl#*$r#Kx3@sVj=`e-Io?x2~Q5E`p65feL zWTkB9G)V$f=u7W93bh%xzEq_e& z-~E+9TNL8p;=;9v^WW780pHN#(yXJry>E=%HH4&n4T4>UYMKK#p>GDTU4Ur@LWmw>4n^E3W?EOgM zmCtxQRPp*4_Fz_iW0JmY)X{*B=mA-NLy^~@442_6A-&sti{4F`nMvz>{O5mTSvGoE z;n1JoIh9yX*0U*dHNWC|RRd4YJt<}>bE6rb{ftHQd{1ggs9MTHIl`>mEtUi}eN<+u zKzc|cI1`i>yoiS{*7My;4OSctdl^s6aqNn6Ghcptd1$TsZ`O+D%`}}@3*5}m{4qBe zukn-})@uS3rKDrsA|;QgQ&WP?p<+sOD`BENzGB4}u!uu4nDzuIxdJ9KqeDWPD?J$C zd_S`6=lkFCbsAOq6JgOI#o=kZ^{aZga;3bL;-TgRFmip@V^|vXq~LGT@pv@MNfuN& z@&HU3vX!!m`6ppN_@mAiBw!33i!Q4O@^Jod@V_YMLDtKmg=O~w)!Q&xyjRmIm9~w_ zP2n=TvYZO92O9CG65vanZ=1MqC%I-&(C>c|xjz`_Xw%r0xSny%JseGN1D`i%mS3Nz z&R%u&)4GJhMm<{Ze~>bjeHpxuh(E%>L8H;J9VB@6Ln@KcN)?pEQXZ--3C~}OW*mfL zZ6adIpyOjt8N^hQlP(QbK57f0YY9V0$bq3L?KOiZj!#tXDg_eKS=ONaOE)eywcdqO z^~=^~5#IZ~lz3{w>~6&B^t--PdA$p7i7dXKI+46Ev@ins3T?ocv)0Jd<}2Bn>7Ha1 zpEj+SkITt^0vLLN{bh8kecDaby4p{R`LEjXqJ<3nKoztTT7H6hIMRt7GUv4qcOmpJ zFT?_)!xs#PO<-V2r!G4NO>=)3#PDq)*ZpaU;IF-4FGZ*jQrZ;#z3{G-a%Mmb=iYV( z?4t-5o zg0c$6qT-(4qtUdIPu@QNEA;AV^YwW9kx?(~i1UL9T}x6h9I=oAWL&muoV%M1-BVZ@ zCsCHPz=~c`*_?puR!V?UGnmXac$=m+(wno5{Lxu!Pk8f--XcWAVIUZEm-s1dNCw_r zfaSxOj|B)nJZ9(Kt*8yy3cejSL?Xfnb+jvB8&-agPe6LTR=MB4?RCA@CvLtzTb_Km zQtS>LQ!HXzQlCKZ+1}QI_Q6qwYV9v=(DOp$82 zs3ae&bx0>D1_T3a9n15kicI$0yhEUumoxcj$F9$7ht1qNi9_2O``sBt%p-8T_LS@Gf-iJZh*4@*r4V>!!E!|8==Nhaq7*Ua1v-Xa{o9I=0R;3();npYgN+&-$`JrejFN1k0OsM5urOFvz z#{aad1Z~ML(BbN4B}WJwN99wj_jo!n*eE!r-sG68GZO}yy#HVM3i$ukuaLAhAViQR z*fmj`3lNX}TW?L_I`(QL8Q$mC1#q+86pfaC2(hItRA+32Us5@>fTM@*&x!Ct$;f}# z!c(zgjU;1L{yS^(Ik6IqD3X9n4e#p<|s*Kyz)>N~VB z;w}Y6nV_D-J^y6{otWYXPrA}=8rnJxa+q!l5FnhQz>YRhzr0et;kYisd%xdiQD;$6Syx1z`HR!tbY3n_v8xt@i=njic)v?!e-TY)pp@8Nk*0!RY zqu08-^GVuN)qu2mDjlP^FA^hA(7QdT@u+I~HFu-!*+UHV5gr2gZfxUv?E3kq-DOcfwHT}) ziudl;?Y?Q`IUIl<|Dx`D;nL1fBUDlB9dNy>Kwd9EY2N=3U!L2)o3ujXFCo)B@rZF5 zc!}tfEUNf-W|V2DL-E7aZb)cd8Z(5k`Kns%0(SYdpcnaP19BKzDDDg4M&PJE6q@mm zwu{%UFlLx_NDfdhm7#OY^M{oubk9GLjU9F*W&oA#-wUt_CO0)NrQm0ZRk`x_h(xa6 zA=D5oVFgc=i=6Kay>{>BO=aR6O!!lt_YetX*TV5&?E!CvGI|HFOIvO9ev$LUfggSj z-}*+fEo+;W1cFw{K97^Cg?oJ~$Y{W^DXeE}N*hpz{I!uaC?0Nxl~R zlv)O514SCfkaS4MU*ufGqdD=IwPC9JNv8zbUr2=Y>`fDWx6`Rs^`XzB{}8qC;FD1J z%;Np0XrXgs@30hW{;#A3V#a>1!!NAlIk-_`U+C~(b4`@$_4T($dZtu$kowOlMy_KzA)v%{RA!+wGD#H11KB5M3dL^ z8-Wth_f=!g9_VZFH8q>n#9p6CCoXJ<+vj5Z6CE19z#%MNQ?nlo)zVqNzTPEKLjdm@ zuF5FnVLv*s#W|!iDwbvIm7wU;O9yUk_yDM%fD^#@j=gNVNsfniZq9`vjqk4q82lT3 z@0iSci$)gH2}6Rl21*Y=N@=$uy8@rZ>USMmvc`=(>|A=gV_rCMNW$evEs?$7= z8YICo1N$4$DgC`LlXTwE@7JU12hOy|h?Voj96FYG)H5{lYr4i@Fgf8!iBCQ?ze!d4r3wuhJ+Q~Rv&LjePXET9JTm~*}%L$K!S)4xBJr-PY0fj zC1=PLDbId0_7C~G$}6FB4<8)T8nn*k!>S;!3)hD0QuG3HHmz8^gFEB)e}IS_JmrS}|EGNly{LWvwu4FA2J~jMV}$WrdckI&D%Ng=$239s)@5 znZK71f=J^sLm)Bb2i~vs*qH;&=zVMvs$b@8!O>5CTIPtTF1(i-JzQg^K>zW;A5wmq z$na%{oq%d}pat3@oaiEe6LlOOg$G0=EJ4Oli0DnNrbFhWtx?wfDIe~>fV77)L`9mO zA*YkFAG-p}LZ<&G4;}MME#K2@Lm!(pRI3hj*PSih)RoI7A2HlJ1WGdo^3;Y95jz1P z3bb5`q3u`Y!bNjr;CSC!X2hof@A?mkRvqrju5`a45TQDB8(sF-NC9L46%?<(y&795 z1SK>DP?x=dZ+EYQ`9y6tPb{xF-H}!q@?YA+HZ7Xwq!n42CoB0@V z$6fhLu3+Ze;r7I*A~ZA=El=gnl$M}W;DxJzGy>|VyNksG0{6M_1#YRGo13{HhyBfD z^05L72!`!D-$S1Ww~7sVkD3$pQsAQ-#> zxb3YYvYu*Zo!M6ZBE-+8C!*Rr$Kw3+D@j@W&<{IlP%aCGpvBK;h}ROBMRuO@*w@=B zIxMkmG=l2PEA+jffsGrTk{?a3d5$KQa)%UwK(Wcq^Kcr>#0S-h*$iR@$>{EP?lv2a zIVM}{+nl@KiFj|{Py58|-Q)pua70uj(`nj_T8iiZZ?8}V_gjstRca_<4iXM~g}9IQ z_s}OZQNi=|b%$Iv)Uvd#=$wM6r+ zbF;nPdYbX~&UnOnVT0vG)#Ot4wW2vd8tm)HEy>8U2W?P9!7|KRuAq;plbPi5@$x*S zu-AP=19CEAuwDxP<{r{vj!k0eM z8i~_(cydeh8F<1#S>UhLFCP8B95&9Zxo(pez8<(7mS>s8Q?=|`qT*#!vG8Sbjvk+1 zJ=VgIqd^-XDWSZ){}*!s9&49CR@94T40r!#oKl@8_CIqioBmc{)7|{#n;^$$jFx~@ zx1s22__e~z#P+E@qXbdc0J}bY$R_2{Asm_Z>NmA0F&dwI0B`j4#{Emq;b`Xwf zQ0iS>kx1gyV}buRZ|)fiGPnmiFx&UoBx_WAIVgYXaR5RfT^$5L>Pn-!09qpnOMGV z8K9#knB9p1atHyWR~Vc{bW~!xGM?|w!ZtEqYx>}s4`T|-Yr-zj3jBiHj{F!xHHF>| z(Z$(gY%h0Hojp&iJj64NZ@Y`#7?7;U5oTy`lsG1|Cq$776o^}DgVZ~4E>W{!oLFmH zu!PGY6kvnkc(gQJ#M`rNOCcX4i|x&h&L4Rnb&YAz}rs38o zlxK^8nZieRAKbH`plzy`YW?Ycio%9Wb%6%Tw|cg zV6wlU{2s)XLUxJ+#B1J;&sxba`#Do62amWoEN)NAPHlcRwIhySIAuXAzc-QV;WOeQJ;^9 zT@K)4sb4sCl+$QTwDsFc7s&s8+sfHAeRNyT*TmNG{c5tCN|J1w#3;;sG*$a&AA>H6 z+pZip{@*>sEqXTw!4N+YpHp&Ytn?mIk~7hnlhutKdDkAq)CDyBk`(Nf4r7?um0EEV ztdag5sA7ED@$Z)v;bMW^hdwm?CL@%^aTY z2Rl=^$jW{`#Fkb~A^D*-x!s;$u)$FaF`-4VGpP2fCH@x!kkHK^?dOfd<@Y_(2;y*5 z)Bz6p+B{v8iJr`qJx10+YV!uu6QYUp275#6gf<5(7}p=7L=k0*5PW2CzsFZsxUFU?quGm|PLIQ(nRyJV3YFR0S^7U@9Q#b_9l@sKSbs7nqlD)3teiM#b@DV zgRJtl-jbZIqq>WxoW3K+{y%S8%WJ?&B({6vc3<6@qhVmxUgY<*ZN&i|c{!R6%7qNp z4XFx6-MqaMvyxulTCy)`qGHB~Zf(bOf}j5;@1Q|IGHXmVgY48hnuvw|huy~JG;;&|ci6^x zSF%`tjKqGpiSZW9SRmvp@4Jg{R^p1G!wAgMq!Dztpr&Bv z-G+|o6gtcv2pO|zk_yS!RQWJ88#8=lS zS`EsQ3Pe!yXSZX(++n6WFXIiQHDf~%4x_821uflXODUCGX0}Jdh89tZflcxTF3CyK zdA-S09nXAa%X#H1e)w+adxF`_xG+`{4LJ+ly-rOJ^{p~Zmu(pt_RQc#u)zfcZ;8vY zcuWkdSej{!J@*AVvSMtRq+RFA zN09hh@on1i{6)j?u@TFXfxkz}j7NTZYN0K~kVWvzkG9tvEq}H}P3?M4n+$GyJ)53i zbAtOBINyCJEi+AB2UD@iZ?F7RMIqpbLy(fkh(Y;cJveFrNr$-KuQng|h&jdormh~G zkEu(U4fbQ|vds8@QVaHv^6=Kbw>ZbIU= zQCIJ00dN^1X?l}b3}dGbwmz30%;BAQ ztfehzGVJgE+A3i`xB-i;mW2>S945VbjvUYKSnSan3D@l(<5xK`u^F%Z`Q#1i*cHuK z7?jYahQvTh>}Q&X{<&j22sB&DxQrOq_2_bm#`o|#_>{nT>92_qSra?>bh|Ezt#fZE z?>mLQPUj1r81WI^$%w7>QT=FYTI;ELAp*&Dv!dT9aP#%DX4pD~8?w)?%W?DJ} z=-bndyq^kw{#b|ru`*n6ZY_6-Z`=kq{X6g3(5yt?&S6Wtm6dEc8xS)SUmGkAnVi^$ zg!4BMBmXf{O#4a8R@+1}AM5(|N&$xNe;tDZ@gI)CP~s2AU?{OYWjjX%^VjIt@#qHO zFI0lMo!x{BL`O^`N2YE0eVd}JygpWo9m$w_{}g0;N;10+4-Gh|+ZjO+rhMQ?bzVIz zKblZwoJt`cnJA#_5xY0_vMf=zxUG=@Q|^`*s|R%}woXFCvbc>Sp7rX(-$!%!ZRo*> z^pj!uQBdUi+d$;XkHg{d!<@4)%|^gg=a*vxpBbmzNLBfEh0AF|Cxw~5ornDPRr4hp z5u$;@%G@Xu=DHjVAJzcsR;Jmf_9O(SZmx=cuWGDx5gyLx(Rco~n07CC@3UzcV@;g#Qqh{v0&gvxoh*T}UG~S<97ctdgT)9WtvNAS zQ}#E8xIsbZ!KH&;zxI$pGJv}Z>g{QFU%VA9!*xKv%n~M)?w}0>dT;M#B(a-pjd@ww5jE(^ks8I&}s z_aIi^ZwtW`A`hYz;S=&@Wz2|G_g7U${A75RkEL?Qnu&#?>P1Mv7WZD7k2TU>xjBp_>a4x$zdYP|_ zh%rnG^#cV^5?QFArznX#!kX|Wg8?O_L_9t7>?Dpq zl3|=?v|3H_&Zj@#FT?IHEHwUkwV^6Mo=z$zP8l3Pon#zMb52kX8k!sgAnCvOhz1Pt zVr-fPV2N88HX+J$W3E)K5EVOyBiluVT8xxMo=u{VvhnI_xi6%e>l6-}hJWjVi&C*r zQcL*MXx+*aYQpyyPfnSdX59izkbcC02IdJ5YmzHLr8_uLkA?*%h!o?!WeDvCR@GTT z;6MQN4sJPr0Yn`P89SA!d{4$aC;-MvpV%Yi)4u9<0t}{J;7^)NT-DSJ!WF>lHqsI# z_X)*$HPRH13^uYdVw>nus{JqQ|AG%mM12FCQ=`8--OjudJP-u7lz6!xeaWWmoCI)i zN_hJE*tRVzg9UyaSxFq5H4(xB@Ztyn`>frgn8Q%#$`DiqbTf<)txSbxS)4|Ukktm} ziW%JAF_BBepqS%d2;HK=p-WREv#CkBo6(Hh2W$S$ZXkzrQ@6AD*2TzDHtcM7*gbGk zUaTKw5oZ~#R<@QK(ehQ>DCPVbQ*24>Eem~#eB!TBRWb$Vy{}i6DXajxwx2v8_ufGJ zswvPPYVzQUXdT)l-S@7^LaJoCtTq*~Fxba`!64}2HJ`=Qn$Tng$*rhLMk!>j7MrR%JpDbbwoPDjzl|Vm#mTkE{ zAqAmE_<8K9Ps{BBy=SYP70;VNC9`518@>Yb9aM}=Y!E#% zbm5N52nJYX%Eiqe9SKrjQ|KK(Iug`ZsTFdhzAp1BC_-B$Z;SXiO+3neg`X7w%3M5h z$w*c#z9_nvd*y%ZFr6IGcMp;Wk@MBsL$}It^bT_9+i`#Xl{s@ygLwG9m@9@j_wOTK z=miJ=HG=g02HuMiwKvp*)YFyn(B0#Y126o?x}w;{n}x|eGmdF#`;)b6gBu+%)`#I( z3K|Vgr<&tW>H4gA$^bk^a!3n`)Rc5svyW3SqDv$}et9fT5wO2R#3FBdbP`nFJ}<~G zAi{j-92J$g?-=;+M_;nq(^IS{j$ij9I2R+!*}1VltF;}QW}`#x+?7K8)&u>3mLRON zxd$nQz6l_JNiSpRy|S@&SUm1sehqwqGcJmF0ME$g^lAsXW&b88K|%U`kV3QU$=BYU z&dQlKDRW==%FgfnMt>YIss`Oxj9P3%wdQ`o_7rIAQy!JRGnSD-+dlvN1Yk z^lo}`AHtpJ#Tq5#kKdN~fju(MV8y=2VJIcavr`6eIC8Lu>^5uS(BqG=9rgd%)&b)9 zQ(dELyLONz@PEta))1+>EMUc#nlxyu`leN8&c?BgF!4Wits8i)q zmA;6?kzX#Sp-&Tsf}3}`+2UL;Kn!5y_tD>Y`RSE4kQMwrc;VezNuC_U727q?YAusT z4T@L&zqI4zYp9Wl88rQ_6?@h1u52a8)0FI_w8AL-XXD1{LI1@hwt>q?AzjoLvQZ-(aAfAgECV<6EBS0JpeN?J-lb@-^-W{9J;$J6)9_+Ak%9N4|- zmqRfHd6%B<5j2e2yP*vfc^&UcqPb^tUH8f(WmHKtGbJg>S;&p1>NxOLK8Y zn_rW7d1$Tepr-;YIA(z=8iX+UR4&r_kS_M2VhgnL8ami*31M-Z-boIQ9(>VmB7V^u z#hO#FJAmiunO{7;;qSrLorrI@-h`r5b-pJh;_PrY{TY)&W5)x4o%VV~pc14!Iv0L^ zRQ|4d^=^@RWwT}M`}MT~t;Zg}7)M<))zO4=?9Y@Nx%Z@f9XJ!}>@aY7 z7VUa6aDi7kSG@za6CC+DyqVwEvR$6V+B$MvM&T%HBr>3^MB{%@oga^$L3b}2*(RLZ5uG$vXH1~WzS28?Bw z5Z?8VnB_T0ZBG{C&=IT*!(R!)?AZv^tw3#ie>`vmld62ow;u=oVX^rrq2B+iFw^kt zCVXWZ>e023O<6Qm31QiXiSi_xiM^JSwowT~5gFsYoy|*Q@tfUZMm71FU9pdI$>_os zEEwON_6A7?=)Fo2^1&BEp8v56PExA~7gT=dE~K&(A&8XCMkLd_6pWT6jM+~!o#1}4 zPX+aHNt23Kb%`ln*nZAXFgnna!jkFrbQ0H{@Cw zLPo<#ECh%3AM9R!)K%~0bkjWCrGkSsF@$YU5twWMB?YDPCzmxIE5WqS@v!6Q=^7y| zXf5*`V*d*?>`E;cG(HUqsH`hG{!#_)MlQByXpJMu)#ggMN(l)ygU(mIxtZF@de z>BA#eG3H`ftTptQjOO>Bsd0K}@jw|-pr5%>*PFM0TxJ*;LWr@FQe##|0n8u8jLGE@ z02ejfWtbOsww1{|(-;Onkscp+D=ei(YMOGft|x4zH}_}Fr?PgLn>P@sT92``JXWN( zkEQ3&`}%+QAkSdQ+NmTsLcqt^8_#(ouKsf@@lQuwR>b*PH<59DXIUxIbn3JMJ(xpdZ8C~kuM(tGVyTH z=C>OeBzRDy&FD-`c7|PxrEuLulz>Q#vK~zhdux>&o3!q+6YJyp#=Do(0}0*H3h>;M zN(GakH|&?*UO@qclsj_`IKGmuTD#wa=6OzC$$pF#hDuNVe})5s9_fgA^k_IP{^*CZ z-mZL0ARAtrJhuPZ;1S?yi8l5CeDr2VkT^~5RbAgZZsV>lU5J>#++@7$V(?i?yQq+{JwUwDtT~f#nqMJ zC-Ngc4Jvl%EGD{^I)?asoF<0&BNBV) zWZvJ;)<)ydo2|{iY;)vkU;S#WG$&)IkXi>lzFX6r-yIR5-guqpgb$Z2LGE#WZ42uy z^_$ZKhOCklUnpDpHz(?1;v41j>=-AdJw-{gCuW*nA}a%~=FXpIBuO_8Wtz;l6Vk3V z9;Pa)y18tKpGZJ`xvq==Os%T8 zkH5Tbe4TwPmUB72BF{TE;za6I9TgwSW)Pa~Dl{Q@CjBqo06tDF=fQ`yfw~1UEAC4A z`#*f6wOWgKEb!!0TS-&-HOS4)+k2*0Yzts+o+qY5zq=oZX)2!?qdl^%Hj{uZ81!01 z{!zYP?Zj@zz-xuBxgqyWQ!-c7IQm$oxRYbJmbRMsBO9r;k(q89dS`n@UDmKOEyeeO z-yrGDb`4D0oe3|VW6uXEtgTiP2SJ~p9$=$WxiBsX^_A9|i)W-HA0+nCM2e|zJm%kO z6n7?7Iw={*A=mwo^0e@DQ_NN5PgEnKm!?9X^LjpE{O1hZW9lVDk^VQUj!rvd&c8{a|gRWJonUzhz|W1Z;F zOqFn9MT37U?t^mzr1)Sk6%2^(Ll zG6HE8;51HZN)3Pm4tUsp^K<_(h`XDe+pr%4xF{{ zj-K$QbzqKf_0+| zAj#(PB(6r!4eWLWu_ZCK3pqreoxVtxv6Q7@|H zd>g#?pM|WQMrN@?ZdUI*Gc-0?B-eipHS~l4?-CWU_%O+ENsszNx}h+-qWEbR-97f} zp!PFU5a3DF@&wb&QuL{^5ekG3PHyACRL3)1qCxUhvN@4VZu5HTXT4EqcCR^>qFry4 z=&sy z*tJ{y3uE#JzSx)J1HTy}hoq(#N7v_^uwUtrQHt9ZyYmb&`#IYt#I%5{DZFqN4^W_{3k+8C{(gsLpqi>%BjBs$3Ih4E@t7aN!-T* zgiUtQDsFOon;*dpQV@h(OBjw+hH63}U&4%4tPk|jKnKqYRu_)>V%E6MItCjtM{xbY zT57T!x;bV zq#>l%I5H!Uy7Vvek!UWkjB>$q@CA*K=wXaIc;4==|Mvdoz6D+UwE`$w*T73=1y?q` zzlC0SU$1Cf{Q#$s`4ZR=D+p|ILuZ4Q#T+|F!3y&C3HS>1gOhqGISl;g?OS%Al^_k; z)HgoOe^q!v0}am@Z(03zvls7b>3Z$SaoA=Wa1bG7RzWj9SfoU4oq4Q1zr3gI@`Ma* z@lVcbG_Q?j_?@$5IifT|M{B6dW8(Rg#v(?-=-7Y3O#{VtxViKR7#EpD^l1~2$kP1* znidfrR(BQDF^&6lD*DUI2qI8K27v5?}xR5RwR9Bg{-Y$Yr7&u)l|{3Ge_Nml`9*d7-Th z+tKyV2p*!-3WQvnRlJ#y#Uq!$u#?O4PX!nj@zdj)f8<>W2A87e*l)b7Q7rBO2pIFkRzz z1D`xEnd{8b%`NbpMk}O=x7%gn9CFi`2XQ+-UkM}0e#LYg1&@p8%hIJs%!1l7(b$Yf zuvL+!vCIhRe^9A5r}7UDRzop=v>Ke&qM=g^;=#Iagjubmd( z2qWnQtNAVAs%)yAP5&LXS8PGd`k*Rn%)DsMDVUB(aZ! zMoRBTuH&Hn5Q&TW15%-XlzeuBD9+Y*F2!VrW{-EX;82D;VSs98WDhFYsDkl) zh$AriE(r2wpnwxbhbTfogn$4fnAe*IU@c&8XoWMO6SW3Zupb>tY6&RP$1s|w_GnH} ztnpP*221>Fo>8~RheE92S;-m!JquHp!+0Z1^nYd(o-m<1dsHrBw#g_1o!U%2$k{ty zIN<~As1Q~@mFWWCGO)bp);W`f8dom)ArLe}!S$o7zO5^JC3@j(ICJVe3iy8L;RV#AH+POL(!um zC=zEyR1XFj4gDY=tYm77_sqL0U171iF>?Z$4_0Lgr`BU#_bWKGXNpf*k&2=ejZafW9g)Il=el08nPdZCY(Iw z@BPDt9^ZB!V^=;C3~{sQSX3|J6({F2f$dgkrtk5ov+Y-4%R=lJ z)rvttqsheUVFCN>R|}X(++Q^)RMX?G>Cab(M0{E4N#oxz^iUpg2sQ}UC{<2ZUAnj& z70kFx!g679$%O?8ixMa|NAE=Qer|6);sHM~ch3)3wDZAO^$ zz*_~mm1Ac~2~U=PLsR2;hU0SRzkyeKW{foSV?3+8fkAFtcxf{DKLCzTCJgTO&r`MZ@bS%_ z6Off_R%=g7$jL2l^vh1~aS@CjOk0f3N#9z8i|FvdHZ~~H&&^$-cFLkho93cFm(b5Q z@_uHuV+4u`f~${GK3?>IKmC99-n1!|ZrK+8zJJAv=lybTf5f5Q**70S5m6BZTjGf@ z=tU5e#%{;??>CdBQa}||K;c4Hx$oZVTrG-fW{w=$%#jc^GQ|ndehz`)TASAWRS_pw zHQAx%swMu03#%knS42?X!LZ%vmTQ#LOL?EK-`ZhSq{?5sdmKC7;+8DD_Q9<3I}!D=}Ks#u7jl+D4kKmkSL?s|@4 z`r~BZ1*RcnXJhGWg0(_RBl~b-IenwZ569>iK!sppf8C(MBO}w<1 z;2D{N#SI}D)=dPP7w{5VFpc#f)QV?eQd$NgJ+3grz_~R-%$(6$hQ%8pq@r4dDJUBT z6x=F}e;o#T?v~-@7ALfhF0Q4jO|K4z$E=O3c_0TMi{WFIe@cYK(4-%xso|D<<|GM>e_`cG2Fq3v&%7i<4URE55N>w-!Nq;!5n0$ zf9d9Stj!CI!b+^h&Rm}{0*qE#i*QB4C@7AfpQ3;rida6o+ia}KYz;Q#pcY67WJWB* z4Zwhu1RvM*3x*d300vJ&X&gSWlwzy7J zPBWeBqU;^6q;vI^+!ouH7UUc>{St0Fe>v?$-(i-^g7c6J3@qld-w>?pm&u=A!QzwTu%K^B&G_D@M7?r*qDzVj%UT(6&cbLPl0F!{Lq8x?tf5fD6 zcuYDO9$pTMmGe=mARfDySNU|dP~3ViW<%>l|CZH zmGGF9KCZt#iXF>~Jbl|gf95X-*Jj%>34%9i7hn>LGI;ar73GdcgUNVufU=6?mX2`} zZWg4d!p5waIelxCTJmUzd1R-Ee`BmQ5_5cn3#vnC4LL^7OdFL{q6D3#Tx!8+2>l~0 z=t;$9&V!puaEp=xW3o1Q?;msKPO1DCP#lRBfLP!ZAf8AI-S@GE( z<`A#r3q7WS3?1}E5iRHo;lY+1nevE<2kv{ z$gKM+Kl~>#3fqc(w6KU7kJnkGGT@6Jk^>8t)p487zizN4=@~hxZR2qE5nZSe}>=@w?e_=Tp>oW=$IREbL z98V+S+FF2RrPdzfI4kk;S!r?L>nX#L0N~=m@lL+T)m6lQ?}9K4B@o11C5AFag!YA= z37F7wpUI~|rtrXHRPjFj)L``PRf+r5vu{Z?>$|D_Va z$LH4AQY>k`Pe+xNe^>~0f}+Z{x2E20c&M{oK4?A#1Y>=)k3`+pMZ!W0M$ZV(vHtU`$tIjJ*zH2N5&e=9voVi(N* z4F`3;J<-a+f7zXcQ6+>?#;gK$s1a?oc74_x>0%(;Vj%Nf2oZcdu^tw!`SCx~O(a~! zwApADpkCqZE>Div2@iZCx0B4$n`H6Piv9FX@%BY_U$!0iG)Jvn+|H;d<7#FWhET)- z*fY2%NeDo{4RJi}P=Epe1qek^)z+iCXaNm;2R;SMe_c@>I2R)ZzU>9Rgzrj-;Nyw; zHMAV^t@-&s1%18>4=4sqahj$V^4*6=zG~-6?U9SLVB|WNY+Q9)rm^h<(wMRiE*12U zoN_ijR|A31Xe)4Fmllkz+uH31e9YmN01zBOAkM~aCg7%S?)fguBe6$a znHcuINH6Ry36jK7R7egu2j+_!*3-M;i9;2tU0NJViW2%E<|8EY1QiOToIN9i z6cRVeb3!%BrH42pwJ3`R#0p-$osp==KbJ8X0X2W|#qSla2mW9gkXZ|FmWCNMJAP!? zf=f`Gd~RaOvXAWjt#XN5>6x%(_N_9?A?`pfiG!TUx>vaT!V7q(Xd9@X0AyBEi$g!Q zX_ntAc^g8ob(eW>W$%V};_YtX!Hi5Pt)F{6-N+r3Pg|pHcjAllHd>5F5OHvk;2#(C zb#8w_+J>Us$atoG?8m>YACL1k^GB}jm0mKByNBS0{sY4oQt7vd!aAR+;|^u9XKrwsrX-B>;Ekj+pN}&)YhK}|GB=7r5F^K8pWBqV@td216NP*u z7)HT*Fwpbx;srvN$lV->nc zFP>n=g3W-}VGyViaIyY9HzDSx4EyEo;Gx_HPdD$$t#Bv>`@{*x67^R-T>0eMKlj5~ zgR}fx_v!7t_n-ST)2kei?qTaOUrE&($E|_8p>RO&ip|V*`E0-Nk{&*snMZy2x&iP0 z`HlZ|E%T3&c}F^XK6sL~Orom}hFuYPynl1_kJ}z*cAtO#<$wQYmvb8do)N!(&f}?q zjnw;7@Ey&-9`EnBA{+rO0e^h{ugiIv^*+9R(5bhr#k7@PI-r=?o*G+ z0`C>2`g z@Wf6N9y|M`=i2M2aaTOvf7~gv=N`nir@=DqL2`!E0&Dp;IeI zQ$eVaH~?kx#osR1Ik!$80TuxP$CqUv0X6|2x11jVGXW6e5J?+UhLaFUTS*{bcYhw2 z-yi{K0mqj}Apu=#e~=6oNr=l^WDv~4qd+xKfg|b&3s#OKfAr(;ijs^^_3@*dE6qd*5TXt#9q1Ac|f8pttM#gB*7VzX803pCctKol$ z34RfaUo6D}p9DW9;M_Kkg9_ECpuke*Tw`A_0mA{cZC)xnAFwAtM3wf9rZz zXB~*n#{*00xPvz^ce?oDQR-NX0F4FyU~~v>8t`^02l}IcOADOAXslRv&e$9z1${md z`4uIierAb?-|76KT5rh(T;I|b5%2()x7eU}yga6CLv~8~XQvpE+$ic+w|7&h^Ch$f z@)yT1uQF*Gr^m@;*P(Ye_`>pb`aZMSzV1h4s!jU4*Ag zr`J#Sh1S{i-u^|iew@uTe>+#Xt1YKX$~aOGqG0`i9~QIKJcw7g)DpSDfo@4 z^Sy`HfX4zrO!2^0jm6>r>e0XF)qNx<&}-vZ-u0f{@7#$dgb8jee+KevzTD634h|nR zT+8JK6)&G|iu!UErb?E7TnjTf%f8EK*V)2LTiOT~KDXsfG-?Rh4!)#jfBm`R0oMEY zVSDnW%kX?@KQk2lLcNn3O4678`-@cPc*}P@1o0(;LoS77niyC>RTy5{x0Cn%VLWy|1(*L{BP`IGTh1%hv7-BDss>JCt#E6lN1JTIJ$?%KfTBcNMcqB@ zpX>>ak%j=tWm=A@{oGD_R7g|6^y2c|`|o1*6ox(FZb-v$(+>pG)9^_k{x?(r+)-Rt zCRFm@7)}V)e^zOTF4eSf6@`T^B*d^p84JEF1exFt=UiyQ!BBA%;4~m}#A9ou(KvmO zi7*+MMHh&hwBSK-&QKd#1WyuA%-@pxe9B=IrHu$!HpHk)mL}$HKG=ONc%90j#)9)F z*wPK&E7-S2`ly25B<`T3MoLC4B_f#SM7`7&ze%tKf1v>31qFA3LJ{92YvNmF0-^=n zR7)RKvQl`@Upi{$o{vsx?r~2&43EkWMzQBD_x#2>Qb{h5Rts(BJpZ>UGXY%%@RKG` znJjkwvFrc%`KU!el&ZKU5R6U3-O6>Qh?3Zg`#86z&J;;)V)3(Ez0TzQZvRx7DXOb^ ze^}UHe=HS})Ab(K-&SSver_vQnWDmv?Vw9y_Sc_ui3_2Xw!%A6QVCC&s&#r)xGJ%3 z<)wUbdc5CG_UQfhrb|&*nd-J)t$XaVkEDy4NkI)$@h-6U-^E-hY>^32*x-I>SmN%F zuTf+2X_8!{#^l+=xkWW5@9SH&#^m?>R;@Alf4$*9Q(}tjYNCEx(Z0+LRhS~Ogs3ew zYAD$TeGSWf^);xnnDEm+yr~wRH(lRcUL|&hsr|>nRr$H}{7_;n^;NuSHGK_>s$T+( zm7u(=b*T@1>T6iSfLK}7zM#@y#@Q%Sw`z5L4N9zo>SJKw3`~>o$qg+M*ie)cJUFPP zfAsQDYTNAo)u43JJ89HXh4Zt^b2k^-%OB{@fleOoR!Me89iBCtXT`sVO|7KB(d#!8 zt#UO{?e*&k7i0b!6%M~|k4lN7j6BZ^O>o8eq6yJTFbImh)r}iVpvjTWo)4a6EtBY~ zgJD-5@829niYB%4;IoiDa}4JY^9s%>gg7%?gn?ZX!_m6~8CfvT_>T`-fZuV>+~OqOMxM-Pb7}CJee#em z-R5t4YM6a5sw{g?>mhv$QT<3S7YpoK6ej0Y{mgBF6} zCLXjfo05+QEv$C7c+kQsNB_tD@A8~q(Ai&qaDI*tn;M_3#+~q-pPEtra8w^;UJgaB z`kbu2T_(&o=lp~@C}&6k95{BFZ}Y4L0R#dtF>tGK%=&*c>yKwGcpM!HJ$-AzT>Ec1 zFyJW+rQR8Tll$=K`P%E0PjaNzA<4(&?Vde4NIdLqcPSXR_BkAgx*TsVg@|YxJ+T(7 z83j6Jl_d~3`Im3jowcBVHn6cS711cu>#^I=qZDi;>eZ6K?S*?MH&>_0VIz}zYIXO` zS$>yx6Mqk4u2ktQ)~lmFuB55IY`(@j|Gk^9?t;^Q^}`1+3c;oH*^Ar_j}N_!JnVGq z_x6Ex3f-gqWc74dixeL=Q{1&g@-Z_3{xnl5VM;mNLcpad?sqrTf7ZhKy&}qiAO+rr zLApm>)5j-iRq04c1tx3+78B>vsz9POR^d!gpKV;-4X*Ac2#$M)U|UnlF+LHlIP1N- z%ban4nhk<1A*Ck9&fWV@AZ-3?6MyDb<&vbvAGJ91M=c^yN8XRtJcNg>s=BOf#Gkn}xg=!yX0fdC70knQyvEd=_q@=4c*K&|7b!u@Z&%ly&OuL^=ge;Z%L1|0 z(pY*tFVqTbphE#7kIJ>7m~*GN$=|r3U>30iWJGR+Q!rh133T8F_BiTaVM)d?mr*5u1-!1#m4JN;>Fzc9*^!u+g-ZWk~^A`F;zD} zuBWjR{0jPBE))bT79t#f>rPP`3vD&g8fwDF82j`Tg&(tY`m1Z!)8D!IdbMG`-GEdH4Fp#B+Pm-fkBjBU-j-K>v{sHZ64ft|zt81Sjbp*|B#lF9gkmL&c{cG?gWnfIYGZ{a~pRP^3X;bz!Q z^r~l%HMWZb90)4YC5p3~asQg?Lr zf}0qGJC*u@i_mj89#xw zWzg4aSPxKizLbSUKXuT*pY^sWTnW{i6aiyJyc zc<3zO*VOaDbNaM#V7v9)?atBuV{5xB)k=Zm=MXq(gG#u3rY41@Y7Uf&VEGtRd<)QX z&04i&4)8w$-klnMD`YsiZHYlKwKk|!-F!{$c6MIgN~y%n^LZC;Ywzv;?*Yt}O4Voe z^8MheYt=Jfx@omaMqR1`vy4hX3=Yf7n^BqYuy9^I*uSrceVZ&~GK!P?M*Tdu-HZxo zy>g6EOk&EKO6H|j$qWj^O3Z6-^PV3mq_sSF)Z?&R%Ie{NE=@E}&r)|cwZsEGEw~|| zwfk(&I+?e<`oZ06`SdLFC=B~C81d6dRh&kR)2Ja%7^hL=G-@#1#A(zxjT)y>ziS$m z8sB7qq(u|sMZb9? zy>c6Wz*cVlfgoH;#kf$4TI0%ze5zP#AQ12}i87cCqkQhEd>g*zzcleDF}Et0&8Z!-H1osnu+j@80sXkjv<-Io|1>m$w|Wtg#Lu5}rCG3^O=0 zprw>E-jjwuT)Ln?a?n!JLBz2{a1OB@nXo5+cO^)pZ9|00!4y2ALQYX8+_E5w^A~_t z6uW;Qc0tuYtKgA(ZvLUbK&dk04SSLcF?Z`fAjb4xnfNoeCYOXPU)>tx()^wq`7F3J zih0jmp~di!H9D>gk_k1e-S;Y^BF&u3RKNIDVc3ejfJ!?|1JBY#6T{VP6eb`x(n1q| zt_?F}!OQ^Guyr98BG%k7k=Ct+m6R(H$gqxYlZm0`XUW^k!~$A#?>CyWc* zabY_cZsNjrT-c5a+uyXXO)d4U&4BZN0jFjK^X_uLSV9sYYmRtF?hca4`=S}7N~MGT zmRGief&z+~01N{(fGjx3f96JoHCUyxI4YPuCfdq2WhkN*JS8X&3qF4LcZLOV>D%Mz zQ1I$o`ldwA{`v!64fe!P?mf|nUWG?j`gnVESvo$vqq%$1AHEEqT6>3Ig{~`q%Gz<} za0P4%s5iF|mdv6ncvA!H2v(6c0J8pjh(hFC7G{aLbOaL+GBF5sLQZM4KtzmokI?hR z(>v2{m(sbj!sW1b*)2DU)!W_U7*8ixwMt$5q~CKb#jh!fPk-mecNh`>g18m{uRf4b zT4H}uzRmK*%KqyE?;hT?()*WxWN^LRgbY@iV<053R6s-lbbSUg1a~OP&{7Ic2&kF= z=*B;urlrytxD_RWib`)U_k+<@?eZp>PCZ;y)2U3GE4TUIu#0-Bn%I5oHM@=TH{C8) zPEYJEY8!$dD;*sjPtZ{o;Db6;yi7fr;YQp-!xAP9>KSH1L!V)cy~Y5fm-;e zV0W+6OP3!;hcE5jo9sdADm^@--#aRx2BHE3Yye*Lc&LSMRPg81v_eTCNwCm#92I>0 z?(d8W;xw(t(V@`QU+c;ErfC&~6F@19cMofQo&KjTnpfG{@}W9mKMk-Dx%|7TWcV4b0vfqBx;o)L=pGS zTyH?_U5*mv%Awv9%@Sj;?5MNf(J`P-u45>yw>}y{kw;V-qurxTD7<5(vb9AXuD14Gj!jVV5_d zmT0LqxC1~q92g)c5MbgECC^=r!ZAbx&`AjOB!r=^T~zP9j2Vbytd>EFabE}m8`vWd zlP#~K6aH%mf96-ul8nS3U9@Y$*4(CPt#N3R@$S}t2oEpE`IofF>)nIL+Fs|Rd6chT zma5whFGf2?5=@_e0vV95VCy%&VB?O#U84f4EUx-{)bPTYW2LpqT86WwxbT7(=1?F= zMoI~Mn|YuMZi!?}u^^HXqsz}j7ylK6KXYqmNo-j#z}mOIj3aK8-w0N^#Qf^c-pEvk z<#SD82@GtZymv4-{;FtaMKK$ya6T2V7K>4hbd`|bOU%N5QJ4V-;IQ0i|CYZ$USU>T z3vH|j>iBy+yw5%-B+rxD-SHW{%so`fQ>x&tPGy+AcvjDiT=%$nQ@R=E?bJNhdQnz) zYo|B6kNMlPNlNwIC>QE436Vk?zwvb1p0Xe5ip>x)sB zG*3IckpHr#{uLE4A?R@ck$|2-^dq^N16Sq%s!|JouN#gr)IXd12Q~tsJAn7fgBo^P zrMLQ^J{T2Lb-%vbN>_Uax*enGKpoYM*99KdSZY;)D>!8MlC7T!oC6os4%`Tlh zCYgMH>x~AD*C*bSyE0vQa3g>zJUkz<*L(r^!_MoCc+%#$^!H%MPiJItrZ&#hhB#rI zsf{zW!Eh62YU508oT>e;nObW7_42{bQJiY-xfh5nF@ZEQydLh8(QPStaFEL64zlTk z)7x(z7EtS$u{?m1Msa`#->~41XKHb_G`A*yP$3`=3qF4LcZLOVqSoW+Q1H57T9I#} z77#>ZDad=)8(U&pQSGgL_43>~9@XANrac(8)Z;n(DtKKrS8HLl5Qv#1xL?M+a3Xpljw3 zr39B2Ye1Wv2olYHASE$YU@RzQ`-LbFckKW8{XoVn5b7nE#I)YJaBK;o-kYnZA${%j zpKFf?*{ebO=}^2Tw;o>%1zy6r0j9}+gfg>XpE8a$7!-3W1tb3RJGNs(5RsfSDRj_w z!x&zE9=!aS4MEI3s%)EkZp_5FUfk$o+g@|LU1K*+-! zO$4Tsn54|k>@{Re1KtbV?2U&|;a_MDF`#wsn21Fu1uB`dKzW(o$?;R?_B?-oyIY~7 zljBCY_R`yN`WyACwE?Vu=9ox->&Oajg0kRbLQML9H0h7a#2!b70#E-k@uGaJVFI&_ z-Z_&cR8-VnqIuq_s??J?Y&;&>&ROm;TKTsPl!*m(1m_Y~3sCG?L0&5z29Xjfs$sg; ze?L!%gvr8WtTGT3K@f%g|G0b8BWEJ!NBf{=N^pwgalg_k@1;tKzA`o+@pPsVZ>NR7 z2Q61C0GEg5f4e80^03kC-+y^6*yr1~C_Mo<0)JP3;E13S0fJ(MV?jgtIxZT3%ppu- zX#oJo2=3vcag31F7JRq>S4>?O`o6RQ@3<5+P;m868}v``@_WhR*)MRviBA2g-g)<- zgRk}CLDvu!@Aq)P6JQZy!A3w$U_DFXP5zfC;Iz9LdQ#eL-MtRZyK>ljE%$2CO2kK= zf`2rII!a(emXSiT+1!EzSOJfss6h@Q_ySn5npW9jSSibzX*4{WLD!%-pW6U6T%<8U z+W_l>$D_^xuU}vHWa~(u$ZR&(_(QM~h7fF@lNQ7*;2(r>E~)n1Rl9`N&ePFezHc(= z;V73(-XvAB+1}aTdLPXlYbhLvbN1XbtA9U?iE|Xrq6BLmWJ5lhNC)AJDyy{i&gKXD zXo|fO3YbLT#*Hnqrf=<}f5*A(54h&JZ~hX8EU9lFwFZng+7CjO;Q3{H&0cO#inM;M zQ!nl0UOVxW+ID};9HxN83!GCb&1@=;0KgC<8L`%C`19aF zK9m%Wra`qfy6}srmHPzuo(C7tFNwtMWQ7LA}?r;hL($UVs1fiz{Ut zxa=>90+ja6B;Yn=O_cW_h28MTLx;6oZ`7dK{%xmw`qHcNW0Hv!d7=*ju<0HmAc%s5 zHD*Sf3&JDEDur{liF@*86otJ=0{}`m)^h?;=Si5W^LFdzsrb@v=IZ?ZCY!u*GZI<1 z^%2SL-@HLgkvhBIJ!l_Y{C{bF&n#}V!hIOlZ5bQk_ni1=uc?(_Ce}N9oepm&@{nDz z;q}qs@jMtyg(=xu7eA3u%1kG2_eISr-#Cze|!8=%-+2|TqduQ zrTyWSdsr?Y`jiZutbb*e%`s8oFv_%o1!}N>ycz!*NkPlNZ;56+h>U)rseEhy`nT1q z?1BaoN{OJ}JJ|Na!^6d4;&SgO+o|Vz&Cz|Y^?XkAPuuNEg`$oIeyy~zgaLn@b){^) z#xM#bf-R8z`QybZ>>FngPSYTK*nh6v-O3Uy#Ji_Kvp77t&VTOh#IDrkN~N;Cmcp?A zLHQ(gvf*vz?dIj7snf@|kNnNba+|d?rNoxIQi*jSHQrwVuq*UztjZi^n1utBrCM#O zIV6Hwl!0iQkYG{IFEo`O;7Wf~rO8)EgZs~EvubP|%rlX7ute8Kp=8qi+ROFB??YMba6z#O1mUVS{)w!{_-7$FR66iG zk2;fbID!w#gAz^|^?-&2$9!z?1SVvZ3hwTfm)WDXX=Fs@w4OM;H_wUYrTALg=LS0! zSF!ycu7RQ0{ zs4;WR;C4{ZO~~mJa_~0It*0sRsy;*BB+?HNmnml*r)q zA{{H>$w+w1oB7P+-LEBgEpY5L_@;uxZ6f=3p>`tOcKKm=y!m zQW*kR4S^(^mMp}XDhdz_zL$+g0hcT$SVIbYA1s13FAv^5hc^LB2$0c$TVM0>&HXj- ze1PZh)e0dAmWyjw@yB16P)7kSAh#h5>;KM3&$Pr9r`XGliq@ zN0**Q0o{LmAG|k10I`8LLL3`He%>M2LrlP_QH)Ne+%5hU^`8|k2>3Gzrt$$-DA1!x zfizh%%ELr!bN4iLLg{D>hrnULQQ&g}UF5Vj=$zFCyPZX^6t0FCE5R{pj+#m#bflww zT<@F2}(I|1PJC)+!Of9cW~T_`R>aE zYJ?*N0Qfy!_Yxa3TaUeq*D}k$zPw&k2ZiB9Ig{;fx$maRfmf)l0emyFg>DAcLa|wW zJWQFbSLha`3P!i74836tK#&LajE#ypmA^baZI*Ygvv22`<*IkJFD}jz%qPaad(ETc z1bu&;pdbG^PSD2*`Zz%!C+OWLj1%+=PZuZX*F0aGp!ff4;Q8VN{pTO!1pVyM|8f7j zbeu02XvpFidW|xoUUB|W_%Od_P7lw-TRL5SeJt*j_=qM)Tc4uG`8^a@4$xX)Qj_p= z9O!cntQ?gF0WyH!_^0T@1p1py(ZjF6#HD`<9JLU~`9CPmk8|{Kj(*YU;vD^~NqoZ` zJ*UEdhYc|(BA~s+6OY6D?z0hX_39Uo-7Ex;J+3lceRsI!zMEPHh%Jy84w1bDq?>Wx z5}Y^DQsHDiuHAFrSCLLBR|t`t%F+Yl2h#zb5#YVsqqNB0WyR4cJ80Zo%0cHW^Ynk! z6?Q@=EkT@_|I{cKF-p|S^79j?>=FirC)fuI7`3g`Qj|S|6c>o7iZ}| z{}^ZKXOI4m``_gwedFJaCn<7wqdc?p`S6kc%k#y>`Kis{wRU>7m*b}%y&UwnJkn7yxOhI&P?%z+j8}G)UW$7hD}cg4s?tz#&k0Ebt}#6h0s$#r0G)ja#1;dCdZ96mP^-e zz$HfZeqP>xU2E7|q|LQ#)$Q&Fm&#V^Dfvb&c(HOF?!0qE$jx53 zrHIM^Z4;KbqWImSr#ENx(+YWGdxyZ%0V+i;#ywi`>1`x{aqw3NJpt<=%2Teg(5HZ# z0Q7}F8i)`TxMt6JATnALANI@L!9y7*N^FZ9<*G)0>TTrHtnx$23Zj26AiZi%_j8Q9 z($AU!s}*MunCMl^dBF-+1Uv;>Vg*kYuYXDxLZE;ZvB{ln+=Ew3g>&0x#pb2BEN5!f=5haQ^rt;|*T}~M+Pc3^ z)R=CSM%T&?<K(R0Rkc5~ygZuiqK^pA1708TZ_ z?H1ogG&FCq%bS6rX%kmQJK9K`8G|zSa)#nTNXNBCVE}(F1q5dESsE(g5G+k$vjR3~ zPErA%CQckI5pp1m1inIHgt&yw8)fQN1<<@oqf)Pb9nA|W?W}6?=Sx^TuriC&OQ?G( ze^|U)umgrm2H_Tu+T5+)yM#ln9V(4C53a+S5F@&fZM@Q7CYLsycqUX6iivrM-3Z}&`Z<6( z3wTNjr;=hrfS7v@lMrI6kmYxei-FN~j|64(gZVuSvn(+O3ivp;{uf14rei+pJV#*GR5A|xR z-0}Fr*}pCD3F_{oy|bUV8onJ~9Pa0KM-OKQOC;}&knpT9IWHKqv-5#rwK$fIXP83V zE^Hk7Z;%CEc>9DULVqdYB{CuBc2@j@^83DGhPVhcww8Ti@?M-j9@^Kl>Sb2gzIi&j zA-sQo{Ns}B-gg-$Br}FNOf#x*<`01vG;NofJL3(W;5@J!)g{*SX_(j%3V*|1Oom-1 zaYVL+EnY6i&j38FCqGlt*Xjh7(oo@2$c%=bN$l@miJpB#WEUqp|8|S@{!^=3|Fr{A zQNPz2Y(+@6*w@X5WC8aPO-!~Ji`I(CI5vN18{F+h2vr_+wDGtli4E&Oc5ny5yp2<- z9m6!&N=r$ZoU~EL5!sZ*Ux&ANjH`&ybJa8alkoSllrqEU4~@q3xT_W$W^pW+neK&O z@6(C-H5_z4f6E9w;T%EuGqK?~T_=HYD-BmkUG3c;v7tj;Ka6SjiB^vl2{%B~B~yQj zQsv$zG{-r^#fl3NdpcH>5VHYGWrV>+y0(-0+%gw5%q@qC6>*}XB-p}&LF%Hr{?@T# z_UXE5?y8miP?2mi->MW|l7rB(BJPK91h7rXB(YS@Q&IwK(?G<{459qXW5qCPC135W zHpNd%>z9cEVhFQzek3fu2A4eUj2nMbV0V;S7uVQ)qgSGvZk)H%S-m^TH6NSw?gdWw zdECazxpS^y&iSGQtzM>`Wr1;e-(`qc5g34RurjA0Xf!CCFm0IDI0id=nMH7SWq3Y$ zB&E3PMZkX~cttTu)2-N#6~YpKP^?&9B32{{+cSjq%Ft-(o6E;Z1-SJyYVv=G1JU(L zlS4mZ#bUiW>f^KAg77fFz0HP)^Oqh?M0lgCrP{5`?=(A!?9m{1EsLhOgqKyo(lDQ( zu;Ja#G-F}&rNL62Ld^{=TtQ>(W+ON4%KC0r;eG^o4_?utmJ4>q0Re|-QLNN~xtgE7 z%Vcv8yXBk5#_5TE*}uD$wOW7v3)-7P_*o?9%XAqmFi-Eh4CQAzZox++*0`B>n*Rz* z9L2QNf?C}4?bY_I9Zd+BHM8(>;W6Vq_OiaFSY5));uLF(bHBZ8&Y#*+$r(@}qoeM6 zmWEQXk~ZLnn?0@%pL_i_2HRWUXahXltfTe1_-I`1VsgJI`O4shI0S#StKbz8DcH2k z7WhubxO(2^y(~~Uhg%KNFr`K@=4H-Q0wz%4dlFnR?)-|AuinO8Tf(?0f~zLhYlD(> zm9#wCVU&ggR_bpKiUGNM`TmgvtVB%;aFSX|%PA!^x=$zO*KyGK{H-JKgmY{lvIK1C z#udyNqH>G1C{!aYs{Vht1+F~vk#s6!89D_kro=2z=gJr%3F?1gCe-q|C$nSt9!{=^#x?xAVw+XM8gq^-`Hs7xGLz1wIiSlNB7RC3#AS8h|YlU^Ct|mT9 zP=|6Vz%;4BFmvM9BJx>Z+^(}JpVe5xXN?sMHH6z9K8rKorfq+!sbW@g8Z{wZI-c5) z&q4%6g&Yn+6E^Ba_v!g%9O$xqjU(uM+v>5tsl!?vT`YE3cJ7{If3>o|T9B!nz!&my zU;MISEb8daTTcMg6%7W-JMDJG`9Y!clwIZ%anQTiyx#FdbqcRO%J_Tb^}ts@oqCcp~< z+(Eir)Q5^QatbY6bi!NR>CV`TQtRlnzPn=&R6m(b%e%@->P}(OtIK#hZMj;iBW|HJ zOeY3iTWbyR&*oAgwPDQN>^Cul+wg{vtGql`%IQo!byt6Eo@RGeGMeaz0O~k;802*Aez*L%XvMxUImG$mZ ztKaM5g(iPG^{0C07r3Nmeemo5@c;YI)X|?g$4nlPP@oVuym@(eJVHDjvgA`Cb(zg3^H06bS+l{*x7+P1fm>tA z(+aJ}8d_@BS4u|!&!ZB1Pnc_W!z#N)%CctM;b(uOz7m24My+)9V|wEQyWLCmcPqL3 zdvTeoJ!G#dk0kv!`AX}*ZxKT*_^&%pJ28a2@P?qTQvFgochx((KiNHFqSd~-xZ849 zNrfVg1;n)+<^PGRoA|dSP)A~LhlQfADjRsErDIJl>+x;cbjg42U*s$$<^H3x3{|KeEja?1#wVXP0dh==Q1 zOKt4`yV^**OH}Ozcx@(>r+BWJZ!Y~zU@)x}ldGv|EZnR?sB8Q73SFcp{oWloi~oO@ zD_8+IfBcO=v^5s$nH&;#?6_^ew}kCWVo=D^bCW+Xd0&sKgd)P2m3Buia$XkR?w{Y~ z@4p)HCo#7WC+C~<&tKmoL%_Alv7`=gRfbvv^WBZ1J7hkaCYEk*SqyWo>%}G%eEASt z0z3$-Q7v}vip6;H31!6KG)HZhy5NW!Q)a@ve=pn4e%5Y0JipzarxQKh6R*47+hKU= zGo~OehxNb(4tzr+o5E&TAP&V*vpD41z>5Cz7%5!mN5j@C-#p8^Y52>-$`xIlj^P`qcOm=cQ#nA%NhJaA($4eM z$x%nLH}(ZHD}ueQM4{qkb_Xx8PVc)6=XJ5SM2^+BEOn_-|K8nBxPz^m##jvef0&25 zQ|xwstznFV@NO4^5+Sgz<7sr%zgCP*RT?$UBKEsWFW`B)FRB5Xf4v<^I*#D+9>TtV)E|g7wGH<71|N+-@&pc zTVPR>C+J1I=Tgtp2sM*?4r1DiLxRnFV}fJGse#qS;b;%8jq}{K!ExDEf5I}0dK>>& zN5Px&#-s4w7^mr41#ia79aH6>@FFNfjX<+C#5-zt%u&#cYKAlBn2PSxbE`OvH}*D- zfYZg!I9g}CIC=_j#z8k7Qtte(b;kY%wSqHVbTWT~`buA1emT8(8OjTD-)Iyc`mA>~ z%D>M0;)OYB4KE+OvE{BAe`I5SY%~hQO9r?PF4=3+PMngC${9bcost&VImx(Z+YXx- zVf}E?5{D%kcTR2N3F({Us5N@te`SZy$4n1fuW#g{`31v{=WKC)rYpCaMKqMy`!459 z(=Q<{BvsTf+&eMdo?)e<71K$f!GHe@Za?vV_$uBjH)9`Od0;#?5oSMvt3TrYBGTEgo< zN-3iIbYgB52c6E}e>8&5H%Ah-BpRO2(teLq|b;-VQr+sW^ChgbY$Cw)|`UYxv1eY<~r0DVA$zdzU(PV6I7 zrWADqFj6fjHI};eVt=X-QG%1=z~{N5ky*Y_2R6)U5MQX;>ZSzy1b;+B3WD7rk+NE` z(ySb}UaxxQ_VoIk7avoF)?cKnAguo=2u>8|#9NH(ExZ{#m$Ipvx-)lA_vHHNrk}h` zk6t4+gAK^_X&eV8#dyE5V6*xn7?dkR4NnnPJ>N;&AK^;ToV$@#&Ni@FxdrzwqKD@Fce??_^W8b|@x}iRKUs370TrjohFd@34I4_YiJsp7wikpL!1`G#CR;~%*pN35w6s!a`D4Ed& zH!^rcP{KG!wwRI>r8ZrKp~#ZKU+Qx=lngGi@MbQMg+pNMx%bw8Ljs^L1iEew!)UBr zQ)9NEFDkKMIpWXULY$m%&K3Wm{41;@)GDG%2+koSbbn>sKJu^bk4B@Auo%x~E)m!{ z1M*F*R?<@8PI13qA#*GQh!R6Ah3e8~sVn~85(#_9z3Z1^r*!#zkbD}QzP%k>rOKfr zpx+X5l4&D3l~PR;Eg;m6B~($tHM7Lb2SAj=$A#sFa;1T_x!N+~2xv((=4(ellrnBL zz@z6_RDb5HXT=DZl_K^FB@&+4fz5XH)y^v$R+II;%4PDTzFedth;T`xtre+wUrmTe zg)w6sBXMq&AyT=X;MjhccHnmg_xEr+Pi73Dn`B@X+-QYUz~+r-sd>SFSCAr>2vSi0 z1!Z8o=!??6K?)F3rKTpdM?_x$Da~3z%5i4za(^2llK}TKHz;`OvZDz{iWlYcozg=o zT}s>~8~sA>MAPs&KnAPAF^m%fJeBboJ$_g=4i2CLvtrD;B>`g(_$zXYmXUZspfX%} zwTEhdy?G@x1s4C6as^yItDAK0GT$1Mv&X~oZgS_Yznlk@;IbpqJN3SrFdh>4)Zw zPk$1ksc_XKe!D;%?ZPO$7$XRsXOO@@1rw+OL=BhLZ5*)^3^p0HgcGC^VsRqpbxqMW z{4;eZk|>B(ENV3$jjU)bFIc=h*#;*V;DKhH;M7$|;{#c~b$5MsV-p9%QiiJ6u_KDYgRZS+*{?K9O%B;|fK zib*Cy7)~WTHoKAvlPd^vDQ^aJ2lo2Sa<}z1o(t&H92giPt=b;w{oPRwAjG4+@WZvC z!b7>zz&l{B)@&DiB*VkU-u?YvR#*4bX|eNA;(3;K7x3I4}2);Pz@{$+&zSR zW`DYzL8WyJDuPmt9a_eJj`zoAorM5W>A>&ip+mq+)mFd@;2eA4J(O>_cBrJnV7rTZLyyY{avy!}Qys2jMnm5|1ta6$0mtjp18VI)qghhkZNJB_6 z5|&m>{Vh@kHg$Bu02oMPAbLEs3+k|g-7f{$zJtudRIrg4|l|N&g@9P9c(#b zOXg^U8fipw#rSmgof_dt!ysy67T-PfpB5Vmvj4xm@s9^+J9G-PJ(BqThkVAF)R*;R z0TF+E{;$iqko7*kb+|||)2o zR?T8aj3F_G#0Vf!3kmDc63-%eCOjr)cG-n#vZu$>kvgrU>G^1wzy8*k_^mRFR&k}d zW^o7|<6?}95#XX=(lTjW0ip{R_rv32r?Hzkd%df7Y`XHOpU8eXv48Tdaq&B47U5!v zvF;Ai7#3q#jA3zQSY(7~ZUj@FF?4@6JT8`P>h1XD;YsCW@4D5<_s_4-p1w6Mey7Z$ zq#Cs@RUAggxESMNXk1kO0%_wt@2GI)g^LH_aWQ@P{PuA9kd;TGZuwF1vV3=Sx#hTM zsH2QfN*b$~vVW*`kt#=0sx{Vq;Qw%mT)DQY`1HwRWUbnjv}^OQ)6b zqfX}dZ3T-Yl>`1vFn6UQcFli3&oyr{W?3)h_+b$XBPh*{dIw&hcoZHKuZpdDH<{Xb zINv)?9G*6-Hg{#dH7G`0`P(2U8iFH!Y+Uw>F)_x(-@go$9MSXQu@j;w7`2>xCUJ7% zA@Q~Hl)AmCT-`kG-0!tV<;<{C>8=8abmsRP942Oobf~2Q=lg0UXNE|48{r6eaNNT4 zk%G-$*K)(eX0?|-GdNN>5O4t=0}=I+kQ5%h50WcN6!Xs6d=Yrz6|XeMz$Ns-LkoSd z#Gqd7J$&&5u=#J7NM`}G4?aFt_EwflPEnqiYVH0!mkVeC8h?Lw3|E>`Z7I&wG>iwI zQ2_?SD%Eg(5c%-w6EepN+<+%gjK>gdL!3}Mz?Rr}_?Kp8`jsXC8>mL1e#@+Ys|=CR zgcAw{%tI+DQS)p$VUzL44GKO7etGKl<_a#Y})?YOY~T(6t`UyRk_@41fW+ zjy2!iI~p*!GPn#Yv|MXx&7swL3xDD1mPW>C&ld3H9De{IZ1~aeKg0yTh{Z1!NHCx! z_%Q+B20@DqlzLjc?g&_zQCcz$xI*Dy8+d_RkddUE`U=g$E&d*-?nUVH;R${6ywn_B z_P9P7?VP3`bN8+EY5iLhdTqfOSw#&xQ(}~V4@I?J6SeYUMn8MZ=S+KFw(jnr@L^(; zaGX;PSAR)^6#HUE|D75ALI=O*$36J|QdqU_=l@Jz66v`gGE$%`oDuGw>o^GyjoC&* z6bt{p9CXde86%_74#6 z6tWbK#@SDTaiAAQc%(Z#q>zE1OKIG#2i|CSpMQGZ+pFH~iqkVTD(&Y}Z>^^N6KMGP zjsJD6@ed{3#8c_MrCELd;PFiE?>;}J-)jH3jbRj|8n)gkhZcHV4 z_FJP$pw1}1yLA15O!%S-v;MvOr{O_mv4nOMpi(OjZX+&tDC>;1)fJes(P{=(sB*BJ zMSp;h3XXXbUswq-Y+@m-5Jy-mlz`w2LJi4XEjX^ZSq?#G#tdOV^IhY#KVgQ8|Ht0D zHMgm(?V|VlSFD=*k`;4q=)JFykc5Od2mwOe%;G441OfyIs9OJhHFh#$CwA;)c+4+j z4pS9J2WU0@o}Q=s?UykJk9mF}_@~^%SAVx|{|sX04hbLG1q~R$jb(YiyZQeD`1Z2WjmLND_LB(bMeavE z3XtEGEJEA|#rJ1Z^o+OrqBFBP&XfI--q{j;J)9?HcwPSH+>aoUIFLS$_yvNe>3{Py zi#!p9fHI_b2)V}@62F!{Pa=T^)c1afWbOzO@GL_y#Qkj1Gx+8Q=R7KLNzs7fU&~1O zw7mkf5ypf~D@CfzELxL6YFr zX+UttupG~$79qNnC7(FMPt5oj0}hUB84OJj)T`Y?j08~uR{d2v8 zcgSlH00lLYqA3Qvx^VO3!6V5##BdNMf{*~?MARE5J%1=&lD=aAKumv}+J9qs6m)({ zxjudGa$dXs)4TWR(|eEEr+1d=_e%BWRPL4j{j^2AGJrpCv9HPa=Y7iWFf~q*KgibQ zkO<-P@M!yXc;ruKLU8zWnbD-HPY^6PBwONI=~&9K*9DGnNje0AQYYZt{+xAVTNk;wT(je0AxYzC(7$jcZce7%}0K{!w@1 zKk*%qu@@X;J|W#M1L{t)tK_*p<~C) zR053o!I0)rr22EBMWl`a#B8Z<%oBsK5{;qxb^v(nI>7C{H>3y~A$KCsB6L@9x ze%?Y~5$-Sekl!2%kvuu(?vT{8rMb+vW1(as6O&kI%Y&w@ilMc_shj-XScr$j9pq^i z*%cgT@4gPfJs1LriGOh8WB(Anp(u*^v!xdP+PR`JXNuyeRxElRxhS!gY`>*r% zXM6W$T44;zDAd0mS$;Tn53?Q|qW@!x%t*oiq;UV3ml>Zm%zx8}*#DGn{rp7Hdw1uD zlN>)kTtA$H`B_=Mub%y|Yd>uSKODE8H_`WYA-@M4dhsdgfMgh&d7N(d2n|_pM?+iB z?)`z7rlK;PIGsc*6#JX+f_eoFanzVJ32A~R38bliwod6^IW>e#2qAvv(SuJvpwK@Z z3jLVZefmu7Xn(*{{P@V+H=u*h)RO=#9Jwq5zTLC)z&#OphhuWY+nGDkTofgF4*u__ zKX=cK83x?}!6Ul+hW38I+`s?!PxkNg)B**N+9I~}I#_#U{65co+;3hYMydQ+5r3YT zp&6P(V@Q%eS;gt6!}@!7=e@`4eZ~3C%J$B-@ZPri?tk9ow}3^D3K4u;zkQr4Bwl!~ zh5dF|WKx`H)13J4Bw_U)lyi01{_fRnewV}8~@xC(YWCkKt#nz zf`wpA!~Y%@p>tRs!5-wJ*n7bKeSI5x+)xKTmdrkI(U$|czH#R>PmLS=5CeYd7zsq$ z`LT!zK!1^nLoeSlA zzfWB)J$hQmvpmNlhC(rKnKt=R2gePWXdq}B#R86E!0Y|{{+1rM2ks~Y7>IG#A@ZN> zPc9dHZ_=*^rXPqC+>ty)VI74*fI{)BLHM1A>VGv!j=QBvo@FT#k_7WQfO&6K`>`aE zEiix>X(dOnV|k{($yCRSD?dDszNG;9Y%~`o!^bPG*oROY?^O#Oj zBbw&{Pq5r0F!*;|_aPA=K)q#N-4pc@)&DtB{qw9XqLzT>2*jYCda_?$_j#vDKJT(t@Z+)j^>v@;W&1z1?DJl|`8-%-sxAvg-1+AQ>z}sj^ZdB|@~Y2!`H$ZN z3B9=JGgcY7M|97w`Z#ZgLSzv;hkr-(z!%%~aSG#gIr*hZmA?xV`Wr3!kR%U~DnjtF zSLy=?eLg-f2_O&4Gh-<<@N^pa*B5_a3eH73N>Gu@!KGT!^}p*i^`F8-zgEoxY0VwdHN-QB5#TKVf8ztnvkRc1Qd@<{d-*WT#+1(L^PA-UQ2(uCZ(q;mtEyb!zbT@R~TI8 zkAcu(<{64!3ZMK{I#yG{vh_{sj8Qy^Lz6q5>cW%h~f&MScc}G z7QCTZ=I*}MBmoFGKEU>6AMsmEAp>R%uHc1wH(%{NF}cOoica%-eV(2doSnzkld@X# ze_sqkbF4IGH(^7^Ha#^z{bwD*7}UXg6v+8!Q>TwI6OWtwC^PX&gCAukK7Yzg{8<_Q zJ?E9_AJiEod18d^k1+ZpeB`|yAGJ(+*rZycPPXOr!nc>>{v7|E@exDc0f5v1LJF~O z3cUPGmET}u8IDD?UteGU07w5AaP(1V;s;;;slI&_n)rIbN1=(Y-+mOD_*)d3_z@T) z#%GhEGoA%Q{@cM&L(FDEw0}ybr|G|^>B5xErMmy!!4O5>G35A!mock?rN3EbXW<<~ z!LcyuSd{Fq+C=b9lSMqq65}%lJ|>Gk@X+VuqtL{k3-lj_CO!&HJlojcAm#9*(8Q16 z(2EbpChygWd7(sm@OC)l*%1|W^SH7uXF;7^vOI*xzc(BL@D7f3&woj9zg73o;-SBE zatI)uc zNO#jA*NuONZK6<9W%$i&v%iv41ny81BdtTohzEamFUDV6YJ#L#76Excy;hF&0~r02 zfYC>-iAP_5)S7q_Hh({AP5g2EJ!?(;Xz_=pXr3Zj@NA}V^!BJu1KJE$^|H&Y(;{78 zxMd>Szk5_?5GJI@O_Zb4V7{#&^*37kp+*3LurPdWYr#iU|K~*Yk6II7zx}8+@x%5$ zYEAqXE&P1cn)sDmdbHzL=Yz;%bu59Q-_)$BP8U@mOY24>x?j8SYfYL9OnkcGE_&-)_;)Nf7uVNG42;iP`6EqKAoJ6L^4FoLx zJasz0-Al|rwQiPhR3xoRla<6v7d%#hG6fwk*WcDT=l0Y z_J2El=Eyq^eZ`{~&jZM^&*<~Zr+ja!-hzZ_jTB4KG~~al5Isg&>g6YBkcjgG{?RP(%P#+0MF(PT-{?zonwKrVq~uTKui)-);q6~HOGqN>KW2X;WrctoCxxH*Cz9pwI0VRP zr0o>J)AY;rlt@IrJ^#mE1OOPu;D3A2O@eWa0*nPcP#=&R``*dX{2f4ibVO(f4{_gf zf0l&f$MCgkN~B})%4$(S=rzYQY}4s7PX5#LeGCbSUo_+YY79=YcjMLo3UL$!x5qls zkFN)JJdeownC%I8EK+@Q$WXgA7BF2wl@}sH{gacYly%ITWpV zf*jX`o)&*$?f?YHmH^8kn1vdDy+I1WdyYX(BF~QQmw%FvL-C`R8`m&+q}delhNV-I zxFaD$(;Q19KtOy$V`vJIY=$2PmKYyS@_H&fcSlg@mUxCi;$VrVvn1@@Sjd_Hi0Sei z0jSrjG17NP_s1EX9t z;|(p2`P*a4F~=en&$3V3LlR~lri_qlWZ%$3`fl9BivT^~&^;qf{6-u|_}sX}!tope zgKrQA&mjR)=!OV-ESAE4qc3o5268+P$DF3u<;x@aj?583ma*jWQ-6UVg{D|`oEt~H z0gn9g4IM-Z#zM%9#azZEpC|26NE{?hA%jC;7-5Xp`-ccF-~o*W5$Pa}ntjsVSWcZF z0LQUB7}vMoAP$zJP^cK;IBE@&PwRgWcgXdOs*DDOA*k2Q4XFzfA5T(ffH*KdC*~Uu z1CZ25;X?%T+1E1_kbgq+W0eAiL%K(@kbIho$RW1CG89K~)~q!1kH1;V0FcPk($fgB4lCi@`(3|@B!%(z5}+$r*w z#Fz`oJ#7zt4FEE53l)XcC$=p9>5w(VH>}i8Y|9{Y+@{mG-m_b5&J++0o z1xH0%4?>D+y#1P@@y(90C>LJ*V+Ct%hf4X@DnKsfET!-%qoLA3WH6j6}rKqGYcV^!#k6Q_vQ}oOuIlM1%cwgS|?zG{ZS;PC1hWF+S?@SrqnK8UC zVR&c0@XmDMz1hOMl7)BX3hzx7-kT}BGf{Y7p76dj;eA=cdy|Aue-%q;f6NkIOi<K#`czE${xj@>XOL~OV@*?J9EhyEDL;8! z%jIa~)ZQV*=hukr37h5^55D9;h!$@bFn3-DgTZ`bfEi(Jc4;^S9&uuQrKplV?;i zzCT8{_*J8ise7$`^_G^~dzp^BY%*WXXcv?h{H#+>{QZLdx&ob8cjsU&<|Gu{U z|9|`5H3H24#$k#xg0R`1+?8<#igJK zLMMnmPTeMG{FJG1SfYRT|BJ#+5hucah7=V2J1iy#Ycbs%1Gq0-w4vZO`-d_q0gQiv*qM=noc(RnSkRnVQy{i?eBo@_hzlcO)!}X zvr$#Y&t~X6X*!v07t>j{u@~KJ2zPsDV=YgsF1Rd=Q=!;Os*vh=W!jQvU4KGpJ5Q9; zKHv2>BRH!wb!P9^M_yiLE5c1(9sTBn814R{Z=2cU&MhXl&3rn_Vw2;YFp*~C_ZuXS z%}JeX4iB=qSC=IkPiryT1ly%KBRBTEyBf-FJ{Vhzn)e5HvAu*ddzr2$jIl`-Vr2!4 zY^vGv#7}qq2CO?AUIbB4#(!}#(6|ZuP4qJ1qN9Y_ zVpTJ-NO^8qHI95qvTVt@XDpMuc|P5(vsE|m*I`2%Y8YD3G9*(e1@1=CgBli#kV#ic zfle7t3$ZZ`w84e=b9>>7W4Ywd3NA-R9%sEo7@ba%+A^)TjW2Q;wWZ2s(HOR^ zn+k3?b8feDZPNGLWC_k)6t7RxB~9W=($BqkfAv{Aa+o+QV|C!IR%)BU?D6xIY5zDQ z&3kqNmP`)%d=q^+HGhx8EI;G&{DoEzyp(M)KW7RJ<5Yc(S?h$yoTY9^GkmB0ag7{K z7+pE?wBBt)NO_UNUz|D1H=8KYR@gQ8;~EQyx5yRQCQeQqcP03i-8Acg4GwS?m~j8~ znu3rHd@l_FK3~zaTd;9|44gl1qx<6;*SzQx_M~SlCYv9({(o`nAGiK->rZaIrT;iJ z*YnS((ku-zZn=)}n~0i5Uc8J=$-^XN$?)fy8UUkjSHY=a=&8lYAk2ni7DbDBT6=8m zUQNevW~OvG22~E+30N={;3b_v&8wY5GFFN0F?Xn7!Q_R(-4YkFy&g_M`}G_xF3_m@ zNn70to4?_4t$)wpiZK+7XQk$Noe*hTaBFq5@96_ir3-fL*hFM?^I2r147lVM?3m~B zmFhX|I&p`!9JpQ=&Cv-q#nnx-D#{|Slf8G`r^%o!-XCbc+qsH(7$a zRhjMUP#4bxA5~1|9Is^N)m+FF+uUq`6ICriDMYd=a(~RzM3?Lc^(4&__smB-Ha!N! z&CV4?jEZKb7(V(7%7|K}>8!mTTbr;*izGOZ9~0{!a<2#W{ejM*MMKqJUCDGx%UsAQ z%XDhlL^vY?7r05BB)bOZKzpuej&-uS#%K$hl}oF_={0B17Z&L((_>b~=c~Q0BG$H3 z=8`8#Hh(*;SDUv@ef;2vCz*7M(>TIJML*z+iVJmI&=eYXsT)ao*qYQ&LU33jQa{@Y z8*1%evVy}d>M0Yi`;xW8#tnn4>+%LL$9$os7yC*}y4t0!zvSm921MsIztXU)HLS~F zd!`zAqNJ+IeGML$;%Ym4wU?8F6w5qGwiL*3=YI`2$KSjsq{a3szZSo7ZkU}hWc1tN!}^rrN9ctc=B`()ovJqJxBHW#5Hzp z5b*RugV*%7v$os>TN9yK#shRqmEuz-2Nppvp7Y?V|0gLL%rP<)+6OKGjcpF1N=VsF2Rx zid7Np1Z zkfC|hg!Rhyqm-nW=M_6wK z@omEn^KcpEiy+<;%8cu?+pvP^IkE}Y%_C(H>2Pk55%87;tBVb@^eb-HSZ;l?>3=D+ zE8Q}8J7SP@aSM(Fo$`}|TtO^%&Bc(X#aTERYj% zzdGW!u&_?AV-!))Fq^HaxF+?Zd?aP;>HGCX4|;ZylLfxA7IkE`ys$v{XKo#d*Qx2Xm<_*IVQGk-M<4m4J3)a*diedWP+-(Y<&94?d^$R z*n@(GeKN%|hGiQi6Oz2NC>r87 zDvwWObs`>y5?c@)pVbHU%+%H~YO%ki+DXwRrsjHb#2R!1xGnk9jkja%I-;+RECfSU z|N6)oCMo+qhBNmjO7>nzb0u!?~MiJxPi;1sUGmiDY(Si zw0phb%nsUR8DkhR1Pp@P0gF_bBoV4*9J;y4AWtQ!rf z7H%yjo>Fd+G>tzGcultnL+o2!qT|@4Qb;uTZL(HxROI@ptm6BYunizza-MSc#E>uK zG^UhwP^N@so783q#~^S^hpwgv0=wYh8u_p-8i0_8da2V}4u9YFaV<@wpn$v{x0?aS z(gp{hy*zg@Ts?gUFN`^y_4dFK3XWg67HcY?&|?Hrmi&{SdHSQVhxjCGa*PH=9S0hR zS0$FJG>TT@RM!`DtefEehKc;?J1RZunuTHFM_)hs`aj)QB6Nbd+gmpbn_MT|9Atw> zLXWi_yT7i(6n|5QYXWvu3S_eIiUtHEie-L>iGI`dcnN)?X8JD5UB60PKuM{pv(*_& zp<*8akfW^3kYALFZf17des}qZ4d29u#5I(#wZfBr9uU$$T<3}6*pk$%P1Ay9WK*2! z)SA5KO(?sc7S}s8adk@Q-EK2lCEHfEdSJJ|}bTAA4tI(;C->=(^zJl@iGEW`sRBCDrwuO*`V8xJl zA*c7BZiFY_PNVVv%l!!_;Ws_eEh~I$>t!En0YPwS6?yJF<&8t&7v~9y~%SdINwc6mO+OX!V(^bW{d6lFiuYct>?u9Ta1OZcBmSbK|mg%WW$~|D1 zI5%dYJe*7-TwALm)fKy_ti@!Y1tuwn=w@RHoZGWu#xL_!iIHMOYY)G))_hThYu3qO zb?VHNU;9XAQ?1nOS?KV{w4*_87gSNxE=5`}J++}v_VaPBaxGnETVqaw<3O2#%Ky@tB9tJ^0uW ztgjN&8l+Z0iBI-1xtW|-%Il_o6Wep-0h$X*5NV|`3h2eXJ*k}Y8vjbl zPxKt`J~Ownu0~SMaHNRc3f|I5x))<`;eYm9aZAf}MZtvKh*=muc)=<1i(Am)t6Yg) z&`xN_7mIL@pN34oLgzq6VURnxRdOqLG2{0az;L#6!6yVhJEe@?8@Gvr$u?&3mLRh6 zMG$WkRSltw+{6`=ujR0N@|LTI_S94)%Pn{GMLJ>a_)?hR=8uWTWQI>MbL|-oW`EnH zFF_@!3jC%vI-~CR@jG0tmvn?Hu*j)JdfU?5n2%UeUeZXS${O%6T{6?KaUOo?3myH; zp@QrS#S*@yqry_M41d?vn$MIQ%u8MhL#_zj_|#?6ck&nceGP-KtoV3> zZD->jO_1?!+xB^K5aKlygh-;u$gdQHu^&9@3l4Vp>|n`wd?~E3{KvyHU14)R$9$v! z5OZl$y4uo#^ap;;>O4iHA;%9*rteFAvJO{x$K}=~4rx}owde=7y(Z-TnSXy!rTNo& zo3DZYTjT#P7d%IAL65IeMSn2;2sk^3Roo+|+l=bu&WglIx#@St0bi_RNAgNsy2YpC z_$NI~Ti&Ypg1HD%k8gzg8<+A0QLO^wf-kFcmM<8}^SFT4+i0$vy2R#3Y|qtUj^Z$R z&dDqe&$Ae>+BJT1bXaz(5`U&e8$^99?(rqy&YWMLc+O^F> zZN&}&HJ|9p7|<*IJ)VgUdDZ?Bgs@Wn>OSCy?y{@ zrg4r=R%^ZRr^+38*T&0`F}EHV$y@-Z3g)6 zdc{s(e`6uRlf2P;XARklRh5-hK?w zvja3Ux8Dy?=}@UB41blImI+%(mfDj}x>m~!+G@qoCo*&1JW-6x!`HfOLi2-0)<}NV^Lbt#WNzrfZ2_O8eO1Fas_At5d zizyli65PC!&RrmJI4Bw$8> zVqw{Zx&?0ZEZWF8cY-n_T zyM!h?s%$%6VwcAFhY>2IuTPLuOPTnYKIkYC@`87DOi~8^3h%j_)UR`l+&6g{?)^kx z&STg|{n_5tvBbcgMp=jTdBZ=%YT`;+i%?Vvr0kzh9|c}8LP46 z=gztrHi$1z+DS}-=q7k@jSR+oMpsHYXPiD}>teytY#u66XGPN;F!7YuiVeoKy?czE z91TG*(dhMqj!)$$Xsa=w%))$iLhPiChWcpDCUZv_Vbp95{4~#)j;>G9v`^~ju}3;n zBJW&4Zhv7ZW+*zi2>s~|n@;udG} zp04QxQ+8ORkv66u@YQtuBMI}EDIC`9HiCY}4u68~aNp>PO(2C5Rv{y@^8vqCDD8?O z%n1QEp)o0|EXj(&rLv>?(CLOzXQJD=IpGW(N=t7Lz27?|i-tfF%(}-OdXzln`(M$}Ltxu$ZnUxQ5335(aeb$+^ETTKe;&Gc(B*@fQ{_7eBo)Y07AZVHLlF4r!9_R9JgP5%M zC=QNFBP^=9h2o9eXu}k;(hhS-G9*KtxLre&=(^DHlX+mfVoBKT9s}=IBtWLk8r)8 zw87r*v0k5(1dfSuQQ-{EdN^=4J2tiJJ}R}OLBViddAXY@CP9qTOFiO2(*a|K=z`a) z9HLQdc3F$YVts`2b=vLNNvf~7t-{_yWaF-3+9n@3I=d{YB#+riqJJB+@T$ThYa_Ps zpn{*;$z+nVwr{c@duzdD&1UXFIlIswjp`5~e3< zU!>QuIqUeG_DcF3n1p;LiO8tfxpRw-BBy{W#$M^Jk#MC`d;LzUg$NCzs0w8AE=k=Y|q2b5cH0+&Rpe40;$= zlZJ!tHrx{0neQ*dh+onw9L|w-C4x9jv@_v1b2l|x#XNWg6HQC4M}tgOsW`Nijc3e0 zya`}wW6wI;^HNM_Vajvlxb502oAi>oaUmJxjc03dz(wE^et$-V`;48>7t-zAN6K(x zOjY5voS{3%na>pxSu(t?_hqMoY%ms-S0qb#tzC>ZwYI_QfHYEh&)VujudbF!cP42{ zWweN^RPp0sy>PB^(#Fo!2&=}%C1t?7Ta2*x%+UZ60G2sW;H%qdFA5a05&otgE~hIT4i^ab-8t*B1ej5=_(a>cmC!0CL= zN-|#`Jbx@@njB$%@3ubc%hrxruPCr2l5jz2^#H+6ZQ4>%Qu!Q{0{M!pirSZS0QTH! zBh>a}BTTY5TnyWE9bR|hm2@i zW2299u*=EG5kXg(H$33UZG81b*>5>L_3hzOrhm1sdCm$8vwc|;1CJ9e5#$x0BJIJ( zVG&cC)HcDsitB9;f`&{}S&ou~n&pRYkxgrmA%n#`?@(!CW{^rW6o_6E ztbYQAVmP-D~x z?Ra(H>=Vv0O~Wr(Yq0g{GSPDUSS{!T78YmLMYea($10b5ZerVebJF4GB0t&+jsYzt z)k!HW;%hU@vYfY_3A8W%iOS0>H-H3pB(51Ch+1r?$2Y7?7w4r+g(rk|l|(+cHh;Yj zwU|0ly*ocv=k`n~qju8mm{zsN6UyIVNw!4y&<2Im%z;+5Y??<`uAZxQMjIy5ehZ#s zDb+>xOqP2loOV#%$IWg^^L%JE8e`vSOj z-dvazsid`wqO#Oa-Azc-e5@hX*If^Qrw>Ki9gbMHpu*IhG}+#yS692=HjS3yw<&^+ zA>9_pS1#Ri7IloiKb{p=y*3C!Ym#`{Z?hKACN3y#WYSP}_mRr^MM`V{)qiUPHn8r# z9tI0(`9``@ZJG(*sq|c63`$5^o0q;gP0w1hSZ*pi&Ncsrjkqfy? z?vA-=n&KVSy^W-ylegUxc7J92|J2mPHrMYx=@6$EE08ADHWeb$`6oDW*}&sj~KJ zzJY$hS6E4AtC=hksp{Wn#su{a}-EZcv@vQ@MiO5Zo!RY;ma0sy(OjBCW@*@9_?h z^a{EbOCOd!JtO0`vI1m>syUdPCfg<``zR1&+*=26P+?X>3679_zb!^giPJ#L%v9y)QE z68)`fkK7)pGfyvx^NCs)DEfs4t9i25#=B~U$7Cq^H;^G-m;$=ua7VAAGnE2a z4wLePbYPn02!DJM7CtRUotzCfcSgrhaNwmOaQS*kIy1PD8M|0^v5fpCD`!!r=`pGM zBIUNU=ZBJ{Tt!v6)vj}>8nqp+#U*ibYR&kycDxYkwdnH+UCpe0HK*`!Co=?(S_mCp z6W24y@xf|eGhXN2V40qX9avt9v`Mr?;`m6W6&=MtuYafs-r6v;!IWraOk`d-ac7gJ z-Xf$)?H_iniv_gZdSQTQkW_%T!3ue04#?5k!gFjNhq1=r2DxPW7ImYcF}*BH=0>eJ zGOJvox*i6vAp=&WC1W8XUCLxE+134$mD+fSjuOu_K4`M^V!2JZr(>ohkIS4_d>38> z0u&oz)_;+vcnwuHbTTS-<8!UHXM3N{tlcGTnI4cQC&c<`Yei&bVj`dSz}ME7ZXOu4 zHFS9j5HYyWFffQKz4m7e8Z=Ic2iuSae_di?AI3NgKak-PIx#S%=kvOhy%vM6d>B9 zI)72m+4ZoYke#f;t>wtxI+8k7onvKny^`jw%E4k7*1WqP#K|u3kH~9!-5gOMKW_^Z zDiEI*9GwEr`HGmwva<|GvC@zpa@L<;f!wtrKi8x@z2xi`yG)#^_b^6F#vm2n-y>2O z>Z>wfZgrc+H=V|(c~M^StGi;tHLsXQZhyBza-36%T!nq+c^8h!D+HvXEmdz^H|#O4 zvyEGnL|*K!6+|9wMw}7*B+bq!;D{Hd!AR6uwn(ixE?_8bu9GsBcPmaabz7pKv4AcP_Jm<(x3XbaxHi^6FfW zH>RR_r=rj+kGFiXDF7nHHb`^UQXmu6Oe3~I)>y2R&-;p&g8b+;c8tvxc*3e=K<})3 z^q7=#>0Ovk39H)NE-FPT2cb*+87DLN+#G*8od7Fq$WZvZmMwxUOyfnF1P&{Y{Kk8y z>1_p?Bc@`whkRHABLpBXmm(YY?jC1`R7u>-=Ma?Hxo&#ki<`|UL7d2IHR%jB?3*T< zS)Jsp9UDdDNHJ=MTsbGo+NUQF_a(IF=?Ta7O=yt=Xn>waJzYUo&TSHdS4h|ixb%O` z;PgS5aG}+)QK=uSfg&K{=Mx*tW;1e<>tT^ksTH$iSm2n5BQ}VKLsbje+`Kj>HqByo z4_u^b@^r~rhh&T0b2od*9n)efb3ggFir!AE`EP%?7hC^uQ$rxBPU`U`IT2(sdCTB-W~-mZ0dl0 zk7ARVlnm-?Q*SiRDKkYsmP&%c3ti%^4INdgb9RGaOJ+6E9Od)c!ZJPBk{s)4VEeb- zyhTA#U)7W+m!N=_(d9R3P%X=73yYvR=wd+Wd*9HcCdg@h#We1KNp}3E+EbT2D%QWoHys0J? zxFJ$pj~V0&;nmqK#F|bYrvsQRW@mBK5)LjbY^vB-i=Cn)@hi+Fol$>{Dc#y5-tG6H z%jzjmhTFWFTY+sEdd-p(_jq(~yH&Gu@$*UWSI2{(siD3GUfX(2QZd<054Y4YrYNL^ z@nm1(>YylTrbtPocM;D-)$!)x#WC|ki%L+upw9bPzS@aqoUu4&JkC^j+4Eb+bo9e9 zYLy%#ua`1Q)H-ZAB0_&8ertf;Ai+ZiwQ&Q!b2Bk#@Fxs7HR?Q;)8sttn&L}k8-3w# z>!ne~E3drj2A(QN_SbBXNQ*S*R!DS&Ii+X(3Q)7U$`ZH7=P{M^ zxQH_mu0z~3O~~3buW`7rvc#tI*0@*26n7}Y+SVsQqD30=?gM{z)Zo$`=tTvOt%-Um zRbZhCk~;10Ck$$)BbBqShDC@3bzT@O7nkKNbXwmARaFnPsfPgZP(y*d3JcoORDw(q zX*rbjsp~p~j*PX#9?xX1R0_2wLJLkQvV>l1StMZ-=$4Ew*@NOZFaxPf{V_+$PoPe( zBb#jzdEJX;kyU?1S;sonF$(L(*cV$vv#uE6t=J~>6jX z*8_4M#E@y=sgu}iv|it|S=H4b8+?{Z$aRj*3G!SI5|c&KJV}c@OSF2wMpmU-oEpw3 zo*HD@gp|S*35-W_SEf}_^RbQhLq#G2w+`oOldONknSoTAusYt%$!+b3J6Tz~MZLph zX^I7GohV#K(h@VOcfdu}C8YxMB=n2xgJ^@OTp$2$dUJfQyK!3Fuw_v*oN~#hjFV!a z?hs*XbndaLSS5(qilJ|HVW+!{Fu4O82W&Ly7m2SgvNkoHFh>rZ)0EJhc93h-EX*ZY zLVACZDVIKL_POggkkWm)+)s1l-*BD4mQz{V7rB4CueDwFmEb7Eu%5EMhp5wT*;-T? znSf0eq~mr4rOMv2_e~z%wte7Nh7mAv&Mz~B@h4o_Bs%B%_I2V!H~bu|&M_|}6)u&@ z5;Xe2FZxBcED*utmW+xcJQa0z0BpuTXS;uJxH>`XNKD&w$og7B@X!85c*`+uGfcXy zF(MmUjEKamp~=16tm|N0P-462Ni!@ ztS{-IWLAK|4VIaBU~&+|v)hu)4*DGm)wboV!@wp?lk60;OEE=T;;TevsI8&(Vdc)R zGwMXC#crSlw{U`@97K^Yj#uC4KvgTj3g{PCX4HrRbZy`u^6>h;W?iooLwh`OxD3j5 zF44#cTxHO=l(;LIswPOn>@Ovv)dhd_Gjq2yY*)%cyUBDqjOj8eBcEDd2{Jpm`Qehe z7)0(D#vX1>X2kJfu#FoNnyi9w@O)TL=s-f4O$|$Es`F5R*DY4McoOOnU)5y-4Ygqx z6tcB_T&os=1~Qo4D!a-JN+$B`Z09t&TeP;RCM@02CSW3;ixlV$SOL|&WMO|ct+d@) za-;?AP=pPzOl%LlVZoj$BqxN0+sKCJAUt*J(>h!cQb2SG+wJBB#Y9ac;+1ab z?Ajyfyw==Z!#XY=89Z)6XLpdV+fmOZvq72w-@qE4A@W3ak!nZ?;MoG{wKvQgIL>6nTYJxv#SR|AniJ#bf(5aCx*@L>HjRI#&WM3Gvt}z_ z%G94OgN<-M3qR?A)>w!H`q=Wyc%&V*$S`Di&x{))Z;77UCGzG>mLpCS5%6O6k;m3% zcd1&7jA=EA=u`=>;V|!Z%9YX5<_s!V3|*2^7nQd96~23{bYa zcCxHcx|#ym3^T5VVg`TBK%wx2fCh6Cs`9a*RZZBY?{`9ws*&R5Cz~A zMYmg1j$#lzsh7Buf|DV6r^Vr63-xTEPXpC%Jdsdyj6hs}L2!QsH?^G#V$HHFnQ-1{ zROyZdBrauR8-}r<+&w0Db~V|_SEMO5XPD@-Gm!S_H5pQmE3x6c5Np!fFFM-{x*ES; z>fnCv2)S`LFC24Wf=!PUGwz)!!Nk+OM$hMS#em8H*l16woUEKF1i5dN;l@WU+{sxY zU)>~{1tknPH;aEbQaJ>g?p@neP!&Bk)Fm$I5|kDVSXT*GauP?8+90Aa$+R4=b!P}? zE5R?E&uCEOxpObes|ryAIFq${Mj%{fuC37D*vp z@3D1fkdxegOvZh%;P)f+@q|z%5$skFp**qI|#NrytdY}tb?RiYeIaL(xD@C^Kz*A zxjmC{^0TU_*y1}#S0c?3Z(B$_x7L1wC8y^MvC~qrf-tcSLIj(lQ|8HG#m{{rL99A3Soz`q5L^Fkf7z zF3Jf+e(dlSvlw5H9dQ_@j=W4>UI#{SetBWqe%m`a457JL4En$@J(g;$Y)B#lFNBUA z7>gb*i<>`}LRVvS4ltO~U?IKMe4&B;ZEVeWfH^ z3&?*PZ|9-+f-lr#2dx&k<#ObGmwIN3#Asw)m?EZJt~k)qti2M;`>lJL-gV zqula{TK)9LQUd;Sd6JKK_xJFk&F80K4Vap4P_RO9R8GEJj8q7I%!7)PbGHY6MciVw zqi%W$?gbk17Y9f6durTH;7BtKZpt10w|jpN99B~cYQxqz4@U+sOer2H_gR9N$P!<) zk0%O@qos4rxxw{^aeUj0s#bXMc`~dNH(_#o=krL zt{Sb+E@Vz+wDRiai#LyN=-63zU~YtM#=Ork0LxmaV@DoNg6X!SzUF2MUFA;Zufomn zb%rU2GE!?JmT}6*wwAGo8hn;#yAlQZltc9M7^&!eE`&_7)`Z6u zWQv3a8FWIU?D}9;RYjGO7q@A7{#AdyRo;m=;XN2h*cC0ur53hMGGli=--M3msaOys zmdR142j#kn49S(j8(<_PpnuW&bC9T zVUDVTqaswk3^(9L<<{0>MxmL1LvK@hs_cXhYEx@cbx};yI7pq$cK5uu^+SK*24Y*O z2zm^w83qK9Z%FM!^@h{T^Un^vi69 zzM(q16USkbOz!-YQeCTJZEkk5Q?JA&jD`#%ltQ)#qmv#YjmG#O9uVis7L0M^(%i;KfFw zct{AHx`I!5i9WerOTQCo%oTA?eU<~Ah!;#}51>gI0jSKkB`tA99e{rAJ_^sfMyhA2On%ZN|YQ52+) z$m()cbwbB^-j0^~qkhwrQ0{G84QpfYM8e{_FdNYi ztoh_q0m*F&At%6jsNa8WoaJT`U0Y!1QTm*#6Jx6^tVX8q7s9`skh*A>7Cu&805Bt0 zityoV4f?~oU0@E?q(t=xFD@+hoLF)?x?E_)Wgpw~qe-GT)9Wz3N8i({3Qxj32EX;7 zM>u^MC`i0m?X%dAp+fgEVKMIma-IG)+8%t^wBdnidEd>waj$>p3d?l&-^Z{1kNKLe z#0OH2q9dMCNusQgb3>nnJz889nE-u#0p*@?0Bc?Iz_5qhjggsaS=>=6lCbNYsY%O* zp_5BiL?L>}Tbm36$|S{VYQ9szP#K8}MA?9p1l6Tal8TsamAB$J&R4JsF2P!_cn$`< zpzVj_s*Z8U9LRrAWS>Zig<-ZrFAO0>K7>%k6hQSb?M!RqE`8n{r29A%5VV@N_&TW! zNJM0h48>dOT0T7J5gv4C;`nZU>o4iC!Pqf56$t|5`DJJd6-*h;^S*zf(H380gt_Bs`YE#o$8QR| zjY90HKOgCnKmH{z{^n1uu0D6)D;+8%NsJs@XJS}uaP)RHi0+FE|frIkA) zCGcY55xRfkF0|*l$Kw>`dWvE&01u($HsfWuKY#c>>T-)Bamu-BY+rjmKC|IcRwrA| zb?WDE;B1dW^y&ng?1d-89MtmLSTL7Sx|7fGyRDEu#`RQ19E!r>5%zSDuZyzI%|Mi+ zq4;>d8RN66#;Nb5py$S(5wb%KhBB9lX-kGHefWR8%JVM1izzp$MA@x${4#iKa@f+1 zB2?D?SO))?{?BXa`I#P6QE@HO56K4 za?^iC9;$DexKJ`RMUJL&wjKf;R)(r?%wrl?SEaXctnvN9hkCK)mnd{gfgNQT8&RkVcKk|^}wh>=pr9Zn4InLK}GGj|FfiGiL!X{;&1C?ieq(ZqOynjH5L zq*pvt>`TxnM-QD1J(JU}I;ID~^V^|lWx`nA;vmNyus^q+JWnH-#|QOKikWT)-W0Sfs3gN_`(_f1|C;ZWb`;> z%jYv-t2BO-nA@Ell)oxQI_t(9Q#q#rk}ldDlSxs>z4e2!=eOEu%){Fm!Sr*USGQ;< zX^A}2~5(2SiR)%XQobX&bf^qsV-UB42CGk=wgu{P`RZ;!= zC^$_1(R6sbk)iLqCpU0U&lG+)N^lltPVL-*NqjnAtX^Z^b6v~CUq&WKntv)CSKk+*hJ{Xy9p28=@}9kK0?g3kuudy3<7`oMI~5_>Y)mH zE>U_9k~DLv%gnP2J>Z6(3q6d23q`xbz1Cr|V#ECuArU3ck>%llzSK+k{rsy|@|{;; zq6kU0r-;#ZvjLB_-q?4Xz_rRpWw%1iv4c>GQ!I2tgXI+I=KZ*kf8HX29_4|`OvtQv z6T~5EN4a9mp1`$bN$h|7T)rkmddVcxwjK;gQXr|Um59_^g?8wNe zWnD{lw$wTiO=wK+=hvP0D3r2>%SNG0>W>^H9O#09bE1Az8JlgeCrS$xN-LlH9H3@t zque!$R<5)3JHyUYf>EhNHbBaZcwR+Bx^qmo06P5an9;25pFMxK6iTaOgIh>4;QDds zV$=Gxhmi=4LUzAPXPHhmEb;rzRCJwLR=7?1=|I{e`C|CgNWer0W`e3>cD_jOox7}+ zjjXjs!$uVlP8@g zn0ggjYiXzN+SPxp@Azitk_+ps)XCBr7>#oY4q42%pIHBUo|nF=lk%DSo@{-AK`N{* zn~wDxen&<%EXFo>=RQK_8qCxW)9{VRvv)aEn**Ct)I0;v!eu=RJz=6ONhZabY86my zk~i{uxv^qB=MkYxnnuFgPQ=$E9`L2C?%5c)FN+U*81al`& z`mxpZvi;q(T#RTlZ!W1^ImbIN)-n;U)MhzP8-7#uKR;_|h|#6NYpi$Yk{w@Hlw`uL z?`v}3>8|Z(Kx&mfhn?cAQI)J`-0G1Kig-h^q!E97$K~#4(FupUW6)9NP3K>GfSh4X z$}Knf1i=;YqObgKW1dHxT0M(HOU+w!+|o=$*%Jjwq&~|)M!%I^f``=elkSB;-`O+77DXo$nRY$ zrFwtS+^i7v1?2o571^{lT%lLCLkW_prg!1mR2C24f|vdpc_8m{_+ZoBf!Qj|*|gRe z3UR-z+5|sw8K0Y;-Q&GgX8-WqbomY{?x4gQfs`fxkdT0jpIN=Jd30iR5iks@sH{tR zvTTcy_vln1@x10OvwRP@z=h9y*RTKZFu{KpTnU>&VO$DfB=-SFesf7&P2MXmh1KOb zs1`768i5|wOT&}!+rwHsp2c6&S=Ld=JH+#<(dSD*(%SMtIRVR}lTD|iIkg^rc65Q2 z*0{A^6LJZ;@u~x=H}lc6c^BqKV6Rs;F{EeuS%Hk4v(*UT30Sl>cF41r=6>s`%ltnw>-fs^d*NU1DyWF8p>6GvEWma%9!x{F^C1{>)b) zh-}fO+I|=Io6r&|NxY$`dq$9?x z$O*E|GZEvhHmX#B2h=l4j&vv6>WF_9f(Srv`aVH?-|^>)IUBwm{DMgI3w9am@)D+~ zMX_!_u#zYjDU)6Z-Tt-C$-f_JoA*j(j?{~b4yw&)RKx-D3gMbUWI~3*y46J`az)tA= zJpcA=rP)PcgR?x6q0`I|yP~S3t&Df@py;^18K)<6=?7hqDmZHviK#n*s&Kp;?#WSr zzf3RN3wD!=mE@4`2XzdE!kTd)aStnz{(4-^ly*}oweg53B4dvNZ`4Os>a_szL z4|*0yECh%>OvD-*1zjxnXy||9a(ze#HG2x9ifsMnW~)l_#R?VSJL|d?SD&6tpuLwL zBAwKykjLUX|6%X7QE2=69I8>Pinc9O4_(F+w+&MkIx3eHVXD~CM$Zq`+#E0~fTsc(0DoF2A#KneN~X+$wbK+9-uBBqi6C|7@ERy*-l$bNhL zvh{}*lB>FQ9;F7`x!&~ap=tjVkTFkT%eQ&XFiI5!i1`AKeH_M0d&8+v=uq&uPdnMd zo!zpP8ugehAS{G|ak1DeOOH=T;&Vts?K8M$-rMZR4r|oLx*Dm>%>4xnxL?==UG+yG zj?A~uFY2hWQy=7w1p|NWSZ2ftO;NCMWy)3NIFFUg`qq{NBL8e}^oW0{F?EF+tE_V3~)oszb)uj(46%|$QBEX?amye@TK?A+6i zkaNs1v)!mX&(JWsN7Mq(X%YsY48?Q|1>dt=98Dq21c;N+UVhkgzz(`J4Z?Rx-W2>S zo8>rc?1-gN$=!d>?M}}q@Dhjnm3QyklT#7Yv1Q|>n)s8Y7juP-BVxkT@A7xgQYi57 zqDpfn=ZjL42Ng1QMScQ5;AVIha$&5845^7_-yh}4n)w;C`Owl41(`M%92Y5o5Q3R9 zF13t8Edou-kLBTg=X;ZOOB{phVKqN3u{+R)VT(xBp2L68Bll5NhUM6tBs-;8V_S`> z!Sg&>wuPa7y?-rE$TsrIR?_?C$7?^?n=`O~*R^L`JhV?+I6hZGWi(sj{h_prcIG(U zS7|3D@_S_VG}l|hU$(%+-|d236qeYmi=`}El_?KcwV$3D97SKT7ACwiLG=wjEJ|0g zS{k9Va1?(VAIqB*VF-X28!wKn?@YMi7kSXg8*ZhyU=)VVDX(=B1EaYftccDMPA07} ziOJPQ$FKsd@5)lmyj}s!ub$~MoTJDAc5=oT_iLVy@19wyaJx_PpRpzN2jD+zoslFv zmNzasQ;~#Bt%T1W(O+v*@wX%S$c^`Gl}D>DjPrk>xT!e>_#Ji3zt3NC#mGUX^8m$_ zdb!e@U`LgnoqaW~8so7K+JT;$n+G{>cP5!6+Ul$aOgw_lNwJO=9x3aBNl$YiPn{Tf=3EwI&V-&i%+FyitImr zxQ~C368>{2Z^LgqC^O@47YwqryO7J>S7$XUV7Due`dX(A^>UJHLQ zDhKXjr@w+jWdecMy0OU6Ec}Hp%V1n7y+>BVBCDyZ+@?|3!Gst!y`m;O9PHEkRDD!1 zoW(l#tgdUGDVE!hp#9TRLzjc@-bybsOg)Rf;%hNyT0=KC4b)=^m9dkV!gj-R#R`=^ zdy2R+iWGWm73#%21d3k=Zqo!Auv~wXKAfON$VKj?ZJp_Z0q<#`JYw%q+$KC*u#kjQ z>;}pY%*^8IYRYojD305}XIl2fAA1f&ddfo$#l|H5qQW(l)`_fSNO(l(PTn_dOsWGd zhM6myhg<2o?PWb95c>!gk(POOhdHez_bV~unBm7x46zFEq0W7NjQ7F0@kq; zMzAP>SnYb!HGZ?MkSli#WzqG3cU2cWBeVjFDL6dqggU|C!DOXQWF3PUx_wPqasd-5 zsX@Ks#%s_G*@dcr-+f9g+9!ot?ob9Cl1U&YFN_m;1aNSoLx2ebB? zVGT&DyCX|0*HEk4wyLxiJ~$FFF%C<+90ijq^s{WCm-WY+)Rx8$tw>v+K~4-dKO8PY6=^)6K5x zsdwFwD>@qJX6)j}Cqs$UxPAruiK0Tn4J_Lw$S~sfzgMDdy7WP)m+*+|ieHvHRV5jf za>d5INwqfe_DXBIarC+gwSNvNSof;by4(p4!<1#!KPv?GF=dxEO_vr#7~_a}0<<57Yys)}{>0Y$rG~ zvhbaC2$L~(Rz1f>mqfvd%soXto-9HT3xGzwKVDYMQPb6qnf5}M6e0hhaF4i&flmMV z#?q-OL1|G=jvXseI)**)`2L{;o6%Q&Xjcd0;X(QbebA?1SZ#kwWalYvzVA)gA{)?M(`nAoUl9cd`%5|U1y^byis9^4Nj z3>ThK*k&FsZjzXQ&JM+8PUI6-$#~$xHArWQ)^~I2=MndFdI9D}lSdWIZ!5er&$UcG z;*uEXV+^z^*u2!8Bjf>EM+VA)sz-{$a%?lLVg><(9+rQaLgV$KtIP>XVD2l6;k>zr z$NFVBKx0HnDhSC7@v=hE&WXEq?@B@i>;BL5dru^TtNXq$K5n{vvn@M*qw+m_et8ca z1~!*E%p4cTZZ4qWRI`yB%{X2q3My@3YsJzE;hSUDV4&a+<)u$yDVk-(pwHBX>3Q+> zpj~zC?&NTwo@v=k)Mcoako-rX=I{^m#UKxtc7~R2+yMGPv9jxqR?UT{|r`pI0?cjeT&k+Z%eF$5?(*qrs?}_qQCtKL} z_+Z^LF)TS$+RMZr6Z+^5v)Lf;5r<=I{;|r|j+szTC8m}kpjxLRoj47IMfnIH%7YPZ z&#_$StLv=k!_TxeOfc0|ks#FMNwTP1reH+3HK$FIyx01eT9%Jmy5>UXGnx6vRa2)l z1}lF`E>fL38&GBPh02PD-=QAzJCWImJv9~wyL;6(g118JVsH1?B8S|0*d-}k3!WpS zbP25exxe~9D~UWu;>0(Rr%&prqhmA@VSLc9OiafmF5|JvV8vF2=em^OplYm%@7NVG zR4I*{22pA_@0-t*A_0NYiD`W=liPeGG} z&w&23>b*yYzb(e#{1(k*cbO%C_ez#k$M?eHM@gFhV5heK#Ua*wX1~Y*1p=#x#mbkp z7XoDg8n+u50-6Bhy>INbCnby5ZVE;M2fDJma6hu!*+QG zyYXF1NVkH;fn?g-U#1wf4OM+x$f3ws2-2dk?|!Jxy0LOh-~)XNc;}56&OD@ST+3@5 zKwRbsVpop~&++)IF7u$@ruP1Bak5YhlY28Bd@ym(6?wqHFJ};c%ixGfHe)E}*CVbw zKkUssjQ?C`+5ddpF$IAPs?)Sp4tZ=ry84$FdZDW5D8sZGM}xNn==ZC&w!7Z1-`!bT z?XV}SQ9UBPJm+1wTV&zS0JQ&4wTTO&aNr&UBI>)x@wL>0+jR*DX$4Z zf)w+wxjQv~W{VxtqctIcL~7VhovKX<=b(O@ohza&qo!ByC1o^VtnE}sZF{P*BT85@ zkK&&oV&=w$-(}E0(RL5{d)8i+t_@?|Hc_h{u#*Wln@MCo=PkOP|5RD7<-6pot~r_w zc`w?@H6<|?We87IMg&yP>IveezLNLC65_n<`8nBtCb7_2>Y*Hcrx0@iNat$&XcUqz zDw17{Y5jH|Afci>GK;Dsnp&gDN_Oly)MPT#kQfdrkytk(kCR@fu zqI$)DE1opF_;7&~oouCHf^+LTX9?nWCzODjV)ycoqa1H0{M)=X@$HBeOBpgQhe>Ly z3qnET!?$hKcC~rYt~d*30)=C7a!?(C^Ckx(E~+vBA+ksyFu)K5vX#M;4eU4Vl>h)*#frxro^|20=#Lz%=QBJ zn2o{m*0I$t>{a&Ix+%1CWobw9f#Y4jxOrcLKXWY}(M{!;P-eDU)OJcFO5yAj!^pz# zi+(K2&zw+=W^W$oJ$Jc6xW3!(iFj_@D5k1u=weDea}hv3#?*d{D(rrZ^mjjh7iJV3 zM}>y7D={+}3C2am7ISvINCZUjrJTTxU~n(UnNs#iS5?|}qsi|ANi`5$QZS%3&^}cn zeb(tt>3Cv`3^~Bx0f)YkivkZc4GWmL@XIEA-K<1?D+ErD5A>OOfH=k87}ARIHD#__ zno{9K|JFU;)*K3XQ&6afebV)RlWs!qD*Hts1Ul%3TpsG6=&X=Y=$e0Dp2)0p=t&qq zRdHQYDCmJ}!mNO#t}q@E{wQa}4&E=4;QVjve%PDy=Dzp$$@y6!p^%`CxYvGW5!S*_ zyuEoj8W{9+>1SQ<;K_^=2o__qNLR%_aPc%w;F#TB|sJtVukUsp)5$ zlpE~VPx0Fwp3knY>y9$4grw@kCGO2~nS#e2Z{A1;OoXATj{=g_bCj2iCT9NPzR-5H z2W(p8-buozIa9#a;Xeogk=G?AE{@>&<-42$p#}ZR@yLt(!NTc2 z$vK21BvWq8=kq51)#*|We?}vlf1fI)G2i*Q=4D=#d&83?9=lk4n>o;w(~00DCRYnB z1v0;r$d>6?pP0E4mn@sbSWty%6#JIpm+G68E`FeE<{)nq6~SYJ;~)umt2+?zqCNW!2Yv{zbgyM0~3w_(b>Wm0?T3_M@5ga zT5I7$L4pZ2Q}yzr@m)4mLOtS#tXsI^RDSxp%IwCGH%`~nETvlO^RqdR==XZ1mQ{-c zpjtaY;dx`#kYlm$fN0d@KSk{j)G!@$_kA>prtD9;m`0gpe5`QMh7uys!?he}c zW$s51ggs)kHA#97xmj!Md98kzJaeez$#?oAG{J1OMM9h6Xc$H#BL?@vgN13Zafd`7zp7u(A!m6OZP)N(hV|{Q5yEi5C zOH7joEGYZQu=8igYs(gSfOOpJ5McbqR%37VUD4LRW?@8I zzztQJBeMP@oX#199zI~o^_UGG zT6bo+>QU2ww}(?uj;x-k;0!Ers%pyHbO^b;RLXJnwKqLx;WC^DJ= z5;pGw^E@Zv3ilkvNtEEpVb~xgE(~~PD5n_4FHI1=oL`_#vb(*x^F z{s?Z!4%kqjL+4RK)1wR>SV$i62tC~eMWpgvy?qdWD5f02+S)7piP<%czzy;Hty>q> z#Vu^y=ZPHN8JzpWPtS=pUVIEbSs5HcN&#Siwc~_ecf9Td6SQs2THkrtoPB+SQVz=` z-VPE$%Dhl1G9r4YIyGwTstjcv0jbHBsC{Zx64z~O%Zo{nUQ_r~zlPK7Elgj(TQ~{7 z$wsh$gK?wHlf1W-y5|+?o#QwynM)KS`t0E{7MSotXgZJRH)l|R#UDD_o8rdDW1X%11a-_TDNkrHq&K^9yS7S$H8jC zMiRuWBwKTHIo6Kp)@c*&`p8zadic5TIGO!_>KIH@)j3&{aU5te6!isxE2t874U+-g zB=)8<{NG;7CWM~q*Gst}VX64CN{h!HsA~wwv+&%s|8|$f;91FyP$A#$?0)2(ZY6Ym z-cHa@{l39sJ!m9W0#MZHkb|?brj&I*t#yrnHXeRjdKZ%X{XGK;ay!+slh*|8Jg;GY zF*Wqqw?@9&SPU92uN83b@wkg-wrOESw{6b1+PH7Zc^z0X}erC5sX3OSWk=TfYk%Y^tD}F>2 zApVOq?Qh4EacS)q_0$M9yRwE=MrE~sio=Op&Nd-{^D~XX*}m?(YIrX$_26hKirP`A z=WUH9qj0o^`7Q{7CXezt7*ef-BAeweQ*CW!jXae}=yIl??00q4cY>f(d4@+V{C?`u za@qJ&cn<4bd1ZaqNIc?hnTEO`1+#2Pi=Rj>^r#ido68C^ZCf{5&$eT}U>LrC^=*e& z&y58Ke^E4)N!X`m+J;GW7Q#Di*6G8qiN>0^>_DB*Y7#bBL8Pf%oLe_^H7wiKjV^uM z=*9kS_gUqS+h_X6TZe5qUug(VmvOeMY;&<4%C%O$0gM`ey@)LRF)v%2FUu@1pEpZ`r}{0@@i%@DyvXm;Z>!aH z6y5L}7ja^h*PHO<(A}9jbIcZk{GetKjssKhefK#IzycL`9)tqby$iB`J+ed20szem zIzOEF-9yUAU&Shnt%=mw+{T@{Gx&Z76(CK5aMcm8fk)Y(wf)!t-8CgzHXNAFI=ZkQ zm^gIn*eyYE()zrf^_}AH4HD}p6{+M;R}2?b?Gv>0{#^_ya0224&qHl6Ka>-1KY;4a zh{03Bgy1Pqw5yyPnI5@+tqzxJ6;d|IA!j>UhZ}0l4RKl7D7xB@$VRfhfOH{(o?fK% z8CoxM+o^zx<|wH2B;vlP(EeAU!apCjgAAZw0!}B`DKw@QqOv@{^P$cvaZ2Ji$HGZH zCpNYSh@@u#RKmc@LS%PZ-Mv}b$YrWcbcQymQo8<=OX@ z(MT6{IH_|?)+y%t5j?0MJL-}sAa1GTPluW?WqQjR**SnjMsrs5nw`a_ojgEPytF|* zb#%B}j#6ql=xVx&7gwGNIVyFn?8_QC5YNdrN+3*T8Idla8SPD_E zL+!==C}Nb??u;nXhQP6oHlT__o`LC-dVvf-ReOx5EnpUZvVh)R_WOiNB=dIH+p#xc z5_|_(q4ij;UCW4~o7IcUFPv{M(~W$r(6s`G3eyf778n{u#1S~qPi%T4tnu)Ies*g; zV|gmZ_?!~zOz(oVdFyYGWbR(+yqDEYsN>-QoHk>U7csoe>FBadt)i8{D%;?Pw9|#F zR3dKG0U7Xr%SG_z3Ny+BO_0Sy7++)YIh6L_{y znQA(GU1<1@*6_|Xu4~vcC>GFi9hDD?cd&;oXUcC9p5U2St+`Ydf0WI@%FK2{*PAN#x4Q~{EXRDehX?61%ULI5( z@z^LM(E64xhAQd?Kc-sHQB!Ue!Dal)7nm3YDL<4JJQ$w+tWFI5`3^E~A50&5OA7juv}Qs}2Z&{9;! z@nv^^C4v1J25Ig*Qp$J*2`@vG>@^0#MF6P}XxpA|QRA`Sd@K;W;{ndJLLw~NdTheZ zwj7onaEXjkJDUzgUIT7*%~03sp`ICGq_XkCjhXFfOj-}8XYuT1+vlXjxqV5#r$*TA zZ#@`g{-NCX8bu}G@1O6m6apjfOp-L0F5;qpg^O9gTf3MftyRx@KaGe6DD6;Mx%4P;K6WrQ+!t_X(8hUiPe>W6Tg#TJ)=tjI-qI2{H{cQ z^3!-*D~={%h;V*DwK11B)EWnVPzB(OtWK`i7R9|7lkq~bUL&ud)(h#XCfPSqvm_{<-?{4a#As|stuj7@E9Z`Xx>SY0{i5&DszbcdrW1bG3ZjVSs5c%oVgT_Sre*!vdznMDg>wLvg!<0!B_08pSWqTvzA>t=m=g8H&-=tC356{G~pea zAF*&vI$R4KA`i*9coWmik@aLq1e1E0%S=)>j(VxPuA}vgzzhBl((w63Wf)iHozR#f z>j{l2a_V3%XR6QrjQyOO!8>oGWS5qfO^+|{&n#Rg|4Q+jBhO_an7n!>waAIx_uV8I zE6~Kx*vvewryq>v^NBVQC=C;TO6U_d&)uNLTMt}C9p)rI9WhD}Nb1w}tP*ak8?Jmi zv0kA254V;Y%)1Y_}|BW)gj`- z=l}Y*|Kq>?_dmzKWmAzXMgDL9=YJ;w!|*hTf*ipy|M>SNnHRTMCPZr&|If4job*5b S+xO4^_`d=9uZ<+7JrDr?ZkgBs diff --git a/fast/stages/fast-links.sh b/fast/stages/fast-links.sh index eaa620691..0d971e463 100755 --- a/fast/stages/fast-links.sh +++ b/fast/stages/fast-links.sh @@ -69,7 +69,7 @@ if [[ ! -z ${FAST_STAGE_DEPS+x} ]]; then done fi -echo -e "\n# conventional place for stage tfvars (manually created)" +echo -e "\n# conventional location for this stage terraform.tfvars (manually managed)" echo "$CMD/${FAST_STAGE_LEVEL}-${FAST_STAGE_NAME}.auto.tfvars ./" if [[ ! -z ${FAST_STAGE_OPTIONAL+x} ]]; then diff --git a/modules/data-catalog-tag-template/README.md b/modules/data-catalog-tag-template/README.md index 73246cfc4..b94101cad 100644 --- a/modules/data-catalog-tag-template/README.md +++ b/modules/data-catalog-tag-template/README.md @@ -131,10 +131,10 @@ fields: | name | description | type | required | default | |---|---|:---:|:---:|:---:| -| [project_id](variables.tf#L26) | Id of the project where Tag Templates will be created. | string | ✓ | | -| [region](variables.tf#L31) | Default region for tag templates. | string | ✓ | | -| [factories_config](variables.tf#L17) | Paths to data files and folders that enable factory functionality. | object({…}) | | {} | -| [tag_templates](variables.tf#L36) | Tag templates definitions in the form {TAG_TEMPLATE_ID => TEMPLATE_DEFINITION}. | map(object({…})) | | {} | +| [project_id](variables.tf#L29) | Id of the project where Tag Templates will be created. | string | ✓ | | +| [factories_config](variables.tf#L17) | Paths to data files and folders that enable factory functionality. | object({…}) | | {} | +| [region](variables.tf#L34) | Default region for tag templates. | string | | null | +| [tag_templates](variables.tf#L40) | Tag templates definitions in the form {TAG_TEMPLATE_ID => TEMPLATE_DEFINITION}. | map(object({…})) | | {} | ## Outputs diff --git a/modules/data-catalog-tag-template/main.tf b/modules/data-catalog-tag-template/main.tf index 1498dcb81..2c3121948 100644 --- a/modules/data-catalog-tag-template/main.tf +++ b/modules/data-catalog-tag-template/main.tf @@ -53,9 +53,13 @@ locals { } resource "google_data_catalog_tag_template" "default" { - for_each = local.tag_templates - project = var.project_id - region = coalesce(each.value.region, var.region) + for_each = local.tag_templates + project = var.project_id + region = lookup( + var.factories_config, + coalesce(each.value.region, var.region), + coalesce(each.value.region, var.region) + ) tag_template_id = each.key display_name = each.value.display_name dynamic "fields" { diff --git a/modules/data-catalog-tag-template/variables.tf b/modules/data-catalog-tag-template/variables.tf index 3e72cc3e2..5d17a730d 100644 --- a/modules/data-catalog-tag-template/variables.tf +++ b/modules/data-catalog-tag-template/variables.tf @@ -18,6 +18,9 @@ variable "factories_config" { description = "Paths to data files and folders that enable factory functionality." type = object({ tag_templates = optional(string) + context = optional(object({ + regions = optional(map(string), {}) + }), {}) }) nullable = false default = {} @@ -31,6 +34,7 @@ variable "project_id" { variable "region" { description = "Default region for tag templates." type = string + default = null } variable "tag_templates" { diff --git a/modules/dataplex-aspect-types/README.md b/modules/dataplex-aspect-types/README.md index 9dba8ba63..488012dad 100644 --- a/modules/dataplex-aspect-types/README.md +++ b/modules/dataplex-aspect-types/README.md @@ -69,12 +69,19 @@ module "aspect-types" { Aspect types can also be defined via a resource factory, where the file name will be used as the aspect type id. The resulting data is then internally combined with the `aspect_types` variable. +IAM attributes can leverage substitutions for principals, which need to be defined via the `factories_configs.context.iam_principals` variable as shown in the example below. + ```hcl module "aspect-types" { source = "./fabric/modules/dataplex-aspect-types" project_id = "test-project" factories_config = { aspect_types = "data/aspect-types" + context = { + iam_principals = { + test-sa = "serviceAccount:sa-0@test-project.iam.gserviceaccount.com" + } + } } } # tftest modules=1 resources=4 files=aspect-0,aspect-1 @@ -83,8 +90,8 @@ module "aspect-types" { ```yaml display_name: "Test template 0." iam: - roles/dataplex.aspectTypeOwner: - - "group:data-owners@example.com" + "roles/dataplex.aspectTypeOwner": + - group:data-owners@example.com metadata_template: | { "name": "tf-test-template-0", @@ -117,8 +124,8 @@ metadata_template: | display_name: "Test template 1." iam_bindings_additive: user: - role: "roles/dataplex.aspectTypeUser" - member: "serviceAccount:sa-0@test-project.iam.gserviceaccount.com" + role: roles/dataplex.aspectTypeUser + member: test-sa metadata_template: | { "name": "tf-test-template-1", @@ -151,10 +158,10 @@ metadata_template: | | name | description | type | required | default | |---|---|:---:|:---:|:---:| -| [project_id](variables.tf#L64) | Project id where resources will be created. | string | ✓ | | +| [project_id](variables.tf#L67) | Project id where resources will be created. | string | ✓ | | | [aspect_types](variables.tf#L17) | Aspect templates. Merged with those defined via the factory. | map(object({…})) | | {} | -| [factories_config](variables.tf#L48) | Paths to folders for the optional factories. | object({…}) | | {} | -| [location](variables.tf#L57) | Location for aspect types. | string | | "global" | +| [factories_config](variables.tf#L48) | Paths to folders for the optional factories. | object({…}) | | {} | +| [location](variables.tf#L60) | Location for aspect types. | string | | "global" | ## Outputs diff --git a/modules/dataplex-aspect-types/iam.tf b/modules/dataplex-aspect-types/iam.tf index 4d1f59c61..2cbfbcb77 100644 --- a/modules/dataplex-aspect-types/iam.tf +++ b/modules/dataplex-aspect-types/iam.tf @@ -55,14 +55,20 @@ resource "google_dataplex_aspect_type_iam_binding" "authoritative" { } role = each.value.role aspect_type_id = google_dataplex_aspect_type.default[each.value.aspect_type_id].id - members = each.value.members + members = [ + for v in each.value.members : + lookup(var.factories_config.context.iam_principals, v, v) + ] } resource "google_dataplex_aspect_type_iam_binding" "bindings" { for_each = local.iam_bindings role = each.value.role aspect_type_id = google_dataplex_aspect_type.default[each.value.aspect_type_id].id - members = each.value.members + members = [ + for v in each.value.members : + lookup(var.factories_config.context.iam_principals, v, v) + ] dynamic "condition" { for_each = each.value.condition == null ? [] : [""] content { @@ -77,7 +83,9 @@ resource "google_dataplex_aspect_type_iam_member" "members" { for_each = local.iam_bindings_additive aspect_type_id = google_dataplex_aspect_type.default[each.value.aspect_type_id].id role = each.value.role - member = each.value.member + member = lookup( + var.factories_config.context.iam_principals, each.value.member, each.value.member + ) dynamic "condition" { for_each = each.value.condition == null ? [] : [""] content { diff --git a/modules/dataplex-aspect-types/variables.tf b/modules/dataplex-aspect-types/variables.tf index 9c43b37be..bc52caaaf 100644 --- a/modules/dataplex-aspect-types/variables.tf +++ b/modules/dataplex-aspect-types/variables.tf @@ -49,6 +49,9 @@ variable "factories_config" { description = "Paths to folders for the optional factories." type = object({ aspect_types = optional(string) + context = optional(object({ + iam_principals = optional(map(string), {}) + }), {}) }) nullable = false default = {} diff --git a/modules/project-factory/README.md b/modules/project-factory/README.md index 5b7b4b6a2..b64175908 100644 --- a/modules/project-factory/README.md +++ b/modules/project-factory/README.md @@ -495,9 +495,10 @@ service_accounts: | name | description | type | required | default | |---|---|:---:|:---:|:---:| | [factories_config](variables.tf#L131) | Path to folder with YAML resource description data files. | object({…}) | ✓ | | -| [data_defaults](variables.tf#L17) | Optional default values used when corresponding project data from files are missing. | object({…}) | | {} | +| [data_defaults](variables.tf#L17) | Optional default values used when corresponding project data from files are missing. | object({…}) | | {} | | [data_merges](variables.tf#L73) | Optional values that will be merged with corresponding data from files. Combines with `data_defaults`, file data, and `data_overrides`. | object({…}) | | {} | | [data_overrides](variables.tf#L92) | Optional values that override corresponding data from files. Takes precedence over file data and `data_defaults`. | object({…}) | | {} | +| [factories_data](variables.tf#L155) | Alternate factory data input allowing to use this module as a library. Merged with local YAML data. | object({…}) | | {} | ## Outputs diff --git a/modules/project-factory/factory-budgets.tf b/modules/project-factory/factory-budgets.tf index 97c138487..512021d16 100644 --- a/modules/project-factory/factory-budgets.tf +++ b/modules/project-factory/factory-budgets.tf @@ -19,7 +19,8 @@ locals { # reimplement the billing account factory here to interpolate projects _budget_path = try(pathexpand(var.factories_config.budgets.budgets_data_path), null) - _budgets = ( + _budgets = merge( + var.factories_data.budgets, { for f in try(fileset(local._budget_path, "**/*.yaml"), []) : trimsuffix(f, ".yaml") => yamldecode(file("${local._budget_path}/${f}")) diff --git a/modules/project-factory/factory-folders.tf b/modules/project-factory/factory-folders.tf index bc9fb812a..3da56dabd 100644 --- a/modules/project-factory/factory-folders.tf +++ b/modules/project-factory/factory-folders.tf @@ -20,11 +20,14 @@ locals { _folders_path = try( pathexpand(var.factories_config.folders_data_path), null ) - _folders = { - for f in local._hierarchy_files : dirname(f) => yamldecode(file( - "${coalesce(var.factories_config.folders_data_path, "-")}/${f}" - )) - } + _folders = merge( + var.factories_data.hierarchy, + { + for f in local._hierarchy_files : dirname(f) => yamldecode(file( + "${coalesce(var.factories_config.folders_data_path, "-")}/${f}" + )) + } + ) _hierarchy_files = try( fileset(local._folders_path, "**/_config.yaml"), [] diff --git a/modules/project-factory/variables.tf b/modules/project-factory/variables.tf index 7e351bb8a..b65afd253 100644 --- a/modules/project-factory/variables.tf +++ b/modules/project-factory/variables.tf @@ -47,7 +47,7 @@ variable "data_defaults" { service_agent_subnet_iam = optional(map(list(string)), {}) service_iam_grants = optional(list(string), []) network_subnet_users = optional(map(list(string)), {}) - }), { host_project = null }) + })) storage_location = optional(string) tag_bindings = optional(map(string), {}) # non-project resources @@ -151,3 +151,247 @@ variable "factories_config" { }) nullable = false } + +variable "factories_data" { + description = "Alternate factory data input allowing to use this module as a library. Merged with local YAML data." + type = object({ + budgets = optional(map(object({ + amount = object({ + currency_code = optional(string) + nanos = optional(number) + units = optional(number) + use_last_period = optional(bool) + }) + display_name = optional(string) + filter = optional(object({ + credit_types_treatment = optional(object({ + exclude_all = optional(bool) + include_specified = optional(list(string)) + })) + label = optional(object({ + key = string + value = string + })) + period = optional(object({ + calendar = optional(string) + custom = optional(object({ + start_date = object({ + day = number + month = number + year = number + }) + end_date = optional(object({ + day = number + month = number + year = number + })) + })) + })) + projects = optional(list(string)) + resource_ancestors = optional(list(string)) + services = optional(list(string)) + subaccounts = optional(list(string)) + })) + threshold_rules = optional(list(object({ + percent = number + forecasted_spend = optional(bool) + })), []) + update_rules = optional(map(object({ + disable_default_iam_recipients = optional(bool) + monitoring_notification_channels = optional(list(string)) + pubsub_topic = optional(string) + })), {}) + })), {}) + hierarchy = optional(map(object({ + name = optional(string) + parent = optional(string) + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + members = list(string) + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + member = string + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_by_principals = optional(map(list(string)), {}) + tag_bindings = optional(map(string), {}) + })), {}) + projects = optional(map(object({ + automation = optional(object({ + project = string + bucket = optional(object({ + location = string + description = optional(string) + prefix = optional(string) + storage_class = optional(string, "STANDARD") + uniform_bucket_level_access = optional(bool, true) + versioning = optional(bool) + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + members = list(string) + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + member = string + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + labels = optional(map(string), {}) + })) + service_accounts = optional(map(object({ + description = optional(string) + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + members = list(string) + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + member = string + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_billing_roles = optional(map(list(string)), {}) + iam_folder_roles = optional(map(list(string)), {}) + iam_organization_roles = optional(map(list(string)), {}) + iam_project_roles = optional(map(list(string)), {}) + iam_sa_roles = optional(map(list(string)), {}) + iam_storage_roles = optional(map(list(string)), {}) + })), {}) + })) + billing_account = optional(string) + billing_budgets = optional(list(string), []) + buckets = optional(map(object({ + location = string + description = optional(string) + prefix = optional(string) + storage_class = optional(string, "STANDARD") + uniform_bucket_level_access = optional(bool, true) + versioning = optional(bool) + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + members = list(string) + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + member = string + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + labels = optional(map(string), {}) + })), {}) + contacts = optional(map(list(string)), {}) + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + members = list(string) + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + member = string + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_by_principals = optional(map(list(string)), {}) + labels = optional(map(string), {}) + metric_scopes = optional(list(string), []) + name = optional(string) + org_policies = optional(map(object({ + inherit_from_parent = optional(bool) # for list policies only. + reset = optional(bool) + rules = optional(list(object({ + allow = optional(object({ + all = optional(bool) + values = optional(list(string)) + })) + deny = optional(object({ + all = optional(bool) + values = optional(list(string)) + })) + enforce = optional(bool) # for boolean policies only. + condition = optional(object({ + description = optional(string) + expression = optional(string) + location = optional(string) + title = optional(string) + }), {}) + parameters = optional(string) + })), []) + })), {}) + parent = optional(string) + prefix = optional(string) + service_accounts = optional(map(object({ + display_name = optional(string) + iam_self_roles = optional(list(string), []) + iam_project_roles = optional(map(list(string)), {}) + })), {}) + service_encryption_key_ids = optional(map(list(string)), {}) + services = optional(list(string), []) + shared_vpc_host_config = optional(object({ + enabled = bool + service_projects = optional(list(string), []) + })) + shared_vpc_service_config = optional(object({ + host_project = string + network_users = optional(list(string), []) + service_agent_iam = optional(map(list(string)), {}) + service_agent_subnet_iam = optional(map(list(string)), {}) + service_iam_grants = optional(list(string), []) + network_subnet_users = optional(map(list(string)), {}) + })) + tag_bindings = optional(map(string), {}) + vpc_sc = optional(object({ + perimeter_name = string + perimeter_bridges = optional(list(string), []) + is_dry_run = optional(bool, false) + })) + })), {}) + }) + nullable = false + default = {} +} diff --git a/modules/project/README.md b/modules/project/README.md index 0380ac2ea..5996311e1 100644 --- a/modules/project/README.md +++ b/modules/project/README.md @@ -1654,12 +1654,12 @@ alerts: | [service_encryption_key_ids](variables.tf#L204) | Service Agents to be granted encryption/decryption permissions over Cloud KMS encryption keys. Format {SERVICE_AGENT => [KEY_ID]}. | map(list(string)) | | {} | | [services](variables.tf#L211) | Service APIs to enable. | list(string) | | [] | | [shared_vpc_host_config](variables.tf#L217) | Configures this project as a Shared VPC host project (mutually exclusive with shared_vpc_service_project). | object({…}) | | null | -| [shared_vpc_service_config](variables.tf#L226) | Configures this project as a Shared VPC service project (mutually exclusive with shared_vpc_host_config). | object({…}) | | {…} | -| [skip_delete](variables.tf#L254) | Deprecated. Use deletion_policy. | bool | | null | +| [shared_vpc_service_config](variables.tf#L227) | Configures this project as a Shared VPC service project (mutually exclusive with shared_vpc_host_config). | object({…}) | | {…} | +| [skip_delete](variables.tf#L255) | Deprecated. Use deletion_policy. | bool | | null | | [tag_bindings](variables-tags.tf#L81) | Tag bindings for this project, in key => tag value id format. | map(string) | | null | | [tags](variables-tags.tf#L88) | Tags by key name. If `id` is provided, key or value creation is skipped. The `iam` attribute behaves like the similarly named one at module level. | map(object({…})) | | {} | -| [universe](variables.tf#L266) | GCP universe where to deploy the project. The prefix will be prepended to the project id. | object({…}) | | null | -| [vpc_sc](variables.tf#L275) | VPC-SC configuration for the project, use when `ignore_changes` for resources is set in the VPC-SC module. | object({…}) | | null | +| [universe](variables.tf#L267) | GCP universe where to deploy the project. The prefix will be prepended to the project id. | object({…}) | | null | +| [vpc_sc](variables.tf#L276) | VPC-SC configuration for the project, use when `ignore_changes` for resources is set in the VPC-SC module. | object({…}) | | null | ## Outputs diff --git a/modules/project/cmek.tf b/modules/project/cmek.tf index 8bd44a56f..68ab9a325 100644 --- a/modules/project/cmek.tf +++ b/modules/project/cmek.tf @@ -27,10 +27,9 @@ locals { "artifactregistry.googleapis.com" : ["artifactregistry"] "bigtableadmin.googleapis.com" : ["bigtable"] "bigquery.googleapis.com" : ["bigquery-encryption"] - "composer.googleapis.com" : [ - "composer", "artifactregistry", "container-engine", - "compute", "pubsub", "storage" - ] + # the list for composer now track composer 3 + # https://cloud.google.com/composer/docs/composer-3/configure-cmek-encryption#grant-roles-permissions + "composer.googleapis.com" : ["composer", "storage"] "compute.googleapis.com" : ["compute"] "container.googleapis.com" : ["compute"] "dataflow.googleapis.com" : ["dataflow", "compute"] diff --git a/modules/project/variables.tf b/modules/project/variables.tf index d2b1b0ddb..6cff61263 100644 --- a/modules/project/variables.tf +++ b/modules/project/variables.tf @@ -220,7 +220,8 @@ variable "shared_vpc_host_config" { enabled = bool service_projects = optional(list(string), []) }) - default = null + nullable = true + default = null } variable "shared_vpc_service_config" { diff --git a/tests/fast/stages/s0_bootstrap/cicd.yaml b/tests/fast/stages/s0_bootstrap/cicd.yaml index d91dae7c6..54e1d6f0f 100644 --- a/tests/fast/stages/s0_bootstrap/cicd.yaml +++ b/tests/fast/stages/s0_bootstrap/cicd.yaml @@ -343,7 +343,7 @@ counts: google_project_iam_audit_config: 1 google_project_iam_binding: 19 google_project_iam_member: 23 - google_project_service: 32 + google_project_service: 33 google_project_service_identity: 8 google_service_account: 12 google_service_account_iam_binding: 12 @@ -356,4 +356,4 @@ counts: google_tags_tag_value: 2 local_file: 13 modules: 26 - resources: 287 + resources: 288 diff --git a/tests/fast/stages/s0_bootstrap/simple.yaml b/tests/fast/stages/s0_bootstrap/simple.yaml index 21a9a233e..5230b1bef 100644 --- a/tests/fast/stages/s0_bootstrap/simple.yaml +++ b/tests/fast/stages/s0_bootstrap/simple.yaml @@ -28,7 +28,7 @@ counts: google_project_iam_audit_config: 1 google_project_iam_binding: 19 google_project_iam_member: 17 - google_project_service: 32 + google_project_service: 33 google_project_service_identity: 8 google_service_account: 6 google_service_account_iam_binding: 6 @@ -41,7 +41,7 @@ counts: google_tags_tag_value: 2 local_file: 8 modules: 20 - resources: 250 + resources: 251 outputs: automation: __missing__ diff --git a/tests/fast/stages/s1_resman/simple.yaml b/tests/fast/stages/s1_resman/simple.yaml index d0d25f9a9..7020270fb 100644 --- a/tests/fast/stages/s1_resman/simple.yaml +++ b/tests/fast/stages/s1_resman/simple.yaml @@ -13,23 +13,23 @@ # limitations under the License. counts: - google_folder: 14 - google_folder_iam_binding: 67 + google_folder: 16 + google_folder_iam_binding: 74 google_org_policy_policy: 2 - google_organization_iam_member: 20 - google_project_iam_member: 17 - google_service_account: 17 - google_service_account_iam_binding: 17 - google_storage_bucket: 8 - google_storage_bucket_iam_binding: 16 - google_storage_bucket_iam_member: 17 - google_storage_bucket_object: 19 - google_tags_tag_binding: 14 + google_organization_iam_member: 21 + google_project_iam_member: 19 + google_service_account: 19 + google_service_account_iam_binding: 19 + google_storage_bucket: 9 + google_storage_bucket_iam_binding: 18 + google_storage_bucket_iam_member: 19 + google_storage_bucket_object: 21 + google_tags_tag_binding: 16 google_tags_tag_key: 2 google_tags_tag_value: 13 google_tags_tag_value_iam_binding: 4 - modules: 40 - resources: 247 + modules: 45 + resources: 272 outputs: cicd_repositories: @@ -40,6 +40,8 @@ outputs: name: cloud-foundation-fabric/1-resman type: github service_accounts: + data-platform-dev-ro: fast2-dev-resman-dp-0r@fast2-prod-automation.iam.gserviceaccount.com + data-platform-dev-rw: fast2-dev-resman-dp-0@fast2-prod-automation.iam.gserviceaccount.com gcve-dev-ro: fast2-dev-resman-gcve-0r@fast2-prod-automation.iam.gserviceaccount.com gcve-dev-rw: fast2-dev-resman-gcve-0@fast2-prod-automation.iam.gserviceaccount.com gke-dev-ro: fast2-dev-resman-gke-0r@fast2-prod-automation.iam.gserviceaccount.com diff --git a/tests/fast/stages/s2_security/simple.tfvars b/tests/fast/stages/s2_security/simple.tfvars index f41ca510c..e60698058 100644 --- a/tests/fast/stages/s2_security/simple.tfvars +++ b/tests/fast/stages/s2_security/simple.tfvars @@ -24,10 +24,6 @@ certificate_authorities = { location = "europe-west8" } } -custom_roles = { - project_iam_viewer = "organizations/123456789012/roles/bar" - service_project_network_admin = "organizations/123456789012/roles/foo" -} environments = { dev = { is_default = false diff --git a/tests/fast/stages/s3_data_platform_dev/__init__.py b/tests/fast/stages/s3_data_platform_dev/__init__.py new file mode 100644 index 000000000..c37e93b74 --- /dev/null +++ b/tests/fast/stages/s3_data_platform_dev/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/fast/stages/s3_data_platform_dev/simple.tfvars b/tests/fast/stages/s3_data_platform_dev/simple.tfvars new file mode 100644 index 000000000..e5dd22f76 --- /dev/null +++ b/tests/fast/stages/s3_data_platform_dev/simple.tfvars @@ -0,0 +1,44 @@ +automation = { + outputs_bucket = "fast2-prod-iac-core-outputs" +} +billing_account = { + id = "000000-111111-222222" +} +environments = { + dev = { + is_default = false + name = "Development" + short_name = "dev" + tag_name = "development" + } +} +factories_config = { + context = { + iam_principals = { + data-consumer-bi = "group:gcp-consumer-bi@example.com" + dp-product-a-0 = "group:gcp-data-product-a-0@example.com" + } + } +} +folder_ids = { + data-platform-dev = "folders/00000000000000" +} +host_project_ids = { + dev-spoke-0 = "fast2-dev-net-spoke-0" +} +organization = { + domain = "fast.example.com" + id = 123456789012 + customer_id = "C00000000" +} +prefix = "fast2" +subnet_self_links = { + dev-spoke-0 = { + "europe-west8/dev-dataplatform" = "projects/fast2-dev-net-spoke-0/regions/europe-west8/subnetworks/dev-dataplatform" + } +} +vpc_self_links = { + dev-spoke-0 = "projects/fast2-dev-net-spoke-0/global/networks/dev-spoke-0" +} + + diff --git a/tests/fast/stages/s3_data_platform_dev/simple.yaml b/tests/fast/stages/s3_data_platform_dev/simple.yaml new file mode 100644 index 000000000..e4319eb6f --- /dev/null +++ b/tests/fast/stages/s3_data_platform_dev/simple.yaml @@ -0,0 +1,41 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +counts: + google_bigquery_dataset: 1 + google_bigquery_dataset_iam_binding: 1 + google_bigquery_default_service_account: 2 + google_composer_environment: 1 + google_compute_shared_vpc_service_project: 1 + google_data_catalog_policy_tag: 3 + google_data_catalog_taxonomy: 1 + google_dataplex_aspect_type: 1 + google_folder: 2 + google_folder_iam_binding: 5 + google_project: 3 + google_project_iam_binding: 21 + google_project_iam_member: 13 + google_project_service: 17 + google_project_service_identity: 6 + google_service_account: 6 + google_service_account_iam_binding: 4 + google_storage_bucket: 3 + google_storage_bucket_iam_binding: 5 + google_storage_bucket_object: 5 + google_storage_project_service_account: 2 + google_tags_location_tag_binding: 2 + google_tags_tag_key: 1 + google_tags_tag_value: 1 + modules: 19 + resources: 107 diff --git a/tests/fast/stages/s3_data_platform_dev/tftest.yaml b/tests/fast/stages/s3_data_platform_dev/tftest.yaml new file mode 100644 index 000000000..6d1d5c567 --- /dev/null +++ b/tests/fast/stages/s3_data_platform_dev/tftest.yaml @@ -0,0 +1,18 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +module: fast/stages/3-data-platform-dev + +tests: + simple: diff --git a/tests/fixtures.py b/tests/fixtures.py index c45d19697..7e9eace58 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -191,7 +191,7 @@ def plan_validator(module_path, inventory_paths, basedir, tf_var_files=None, # - put the values coming from user's inventory the right # side of any comparison operators. # - include a descriptive error message to the assert - print(yaml.dump({'values': summary.values})) + # print(yaml.dump({'values': summary.values})) # print("", yaml.dump({'counts': summary.counts})) if 'values' in inventory:

>aL21)><4=uqUi`)UwdyR!dZ{KTlM;Zu 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 GgGrS|C~5QDsp-x_v8O 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 YAoxEg{m=jQ{rx}xA2^hAiI7_p0616g2><{9 delta 114895 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