From 7bcec349fc25c541ffbfeb7dd226444b70bf546b Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 12:40:15 +0530 Subject: [PATCH 01/15] documentation update --- README.md | 276 ++----- READMEold.md | 238 ++++++ docs/docs/api-server/index.md | 147 ---- docs/docs/api-server/swagger.md | 2 - docs/docs/architecture.md | 34 - docs/docs/cluster.md | 4 - docs/docs/exosphere/concepts.md | 583 +++++++++++++ docs/docs/exosphere/create-graph.md | 298 +++++++ docs/docs/exosphere/create-runtime.md | 285 +++++++ docs/docs/exosphere/dashboard.md | 189 +++++ docs/docs/exosphere/examples.md | 765 ++++++++++++++++++ .../examples/node-examples/basic-nodes.md | 192 +++++ .../exosphere/examples/node-examples/index.md | 38 + docs/docs/exosphere/getting-started.md | 148 ++++ docs/docs/exosphere/index.md | 128 +++ docs/docs/exosphere/register-node.md | 159 ++++ docs/docs/exosphere/state-manager-setup.md | 374 +++++++++ docs/docs/exosphere/trigger-graph.md | 55 ++ docs/docs/stylesheets/extra.css | 4 +- docs/mkdocs.yml | 62 +- 20 files changed, 3550 insertions(+), 431 deletions(-) create mode 100644 READMEold.md delete mode 100644 docs/docs/api-server/index.md delete mode 100644 docs/docs/api-server/swagger.md delete mode 100644 docs/docs/architecture.md delete mode 100644 docs/docs/cluster.md create mode 100644 docs/docs/exosphere/concepts.md create mode 100644 docs/docs/exosphere/create-graph.md create mode 100644 docs/docs/exosphere/create-runtime.md create mode 100644 docs/docs/exosphere/dashboard.md create mode 100644 docs/docs/exosphere/examples.md create mode 100644 docs/docs/exosphere/examples/node-examples/basic-nodes.md create mode 100644 docs/docs/exosphere/examples/node-examples/index.md create mode 100644 docs/docs/exosphere/getting-started.md create mode 100644 docs/docs/exosphere/index.md create mode 100644 docs/docs/exosphere/register-node.md create mode 100644 docs/docs/exosphere/state-manager-setup.md create mode 100644 docs/docs/exosphere/trigger-graph.md diff --git a/README.md b/README.md index 6fd9f14f..58908b7c 100644 --- a/README.md +++ b/README.md @@ -1,238 +1,92 @@ ![logo light](assets/logo-light.svg#gh-light-mode-only) ![logo dark](assets/logo-dark.svg#gh-dark-mode-only) -> We are building a world where creators and innovators can fully dedicate themselves to crafting extraordinary products and services, unburdened by the complexities of the underlying infrastructure. We foresee a future where intelligent systems seamlessly operate behind the scenes, tackling intricate, high-scale challenges with immense computational demands and vast data movements. +--- +Exosphere is open source infrastructure to run AI agents at scale with first party support for large data and long running flows. -To realize this, we are pioneering an open-source infrastructure layer for background AI workflows and agents that is robust, affordable, and effortless to use, empowering the scalable solutions and transformative tasks of today, tomorrow, and beyond. +Exosphere lets you define plug and playable nodes that can then be run on a reliable backbone in the form of a workflow, with: +- Dynamic State Creation at runtime +- Infinite parallel agents +- Persistent state management +- Failure handling -## Core Concepts -To have an intution of the first version of the platform, we would highly recommend watching the video below, this explains using our cluster apis with YML input, we are working on more modalities like pythonic control systems. +This allows developers to deploy production agents that can scale beautifully to build robust autonomous AI workflows. - - Cluster API YT - -### Satellite -Satellites are the core building blocks for exosphere. They are lego blocks designed for a specific purpose: you can connect them together to create complex systems in a matter of minutes without worrying about the underlying infrastructure. -They are pre-implemented serverless functions highly optimized for workflows and high volume batch processing, optimized for cost, reliability, developer velocity and ease of use. +## Getting Started -Our in-house optimization for workflows and batch processing can lead to significant cost savings, for example you can expect a cost per token saving of about 50-75% on LLMs like DeepSeek R1 70B, Gemma 3 27B, etc. +- ### Installation + ```bash + uv add exospherehost + ``` -Each of these satellites must satisfy the following properties: +- ### Define your first node + Each node is an atomic reusable unit on Exosphere. Once registered, you can plug it into any workflow going forward. This could be an agent, an api call, or existing code, anything you want to be a unit of your workflow. + ```python + from exospherehost import BaseNode + from pydantic import BaseModel -1. Should be idempotent and stateless. -2. Should have a unique identifier of the format `satellite/unique-project-name/satellite-name`, example: `satellite/exospherehost/deepseek-r1-distrill-llama-70b` -3. Should take a `config` parameter as an `object` to control or modify the behaviour. -4. Should be totally independent of any other satellite. -5. Should return a `list` of `objects`. -6. Should have following necessary fields: `parents`, `children`, `identifier`, `status`, `retries`, `delay`. Most of these fields are optional are set by the platform itself. -7. Should provide a clean interface for the user to check the status of the satellite and get output data. + class MyFirstNode(BaseNode): -Further work is being done to allow users to bring their own satellites and use our core infrastructure to manage their lifecycle. + class Inputs(BaseModel): + city:str + #Define inputs taken by node -### Cluster -A Cluster is a collection of satellites connected together to form a complete workflow: a series of satellities working together to achieve a common goal. + class Outputs(BaseModel): + description:str + #Output fields from this node -Each of these clusters must satisfy the following properties: + async def execute(self) -> Outputs: + return Outputs(descriptor_agent(inputs.city)) + #Execution function: + # >>Agent + # >>Existing Code + # >>Anything else you want to do! + ``` -1. Should be a collection of satellites that are connected together to form a system. -2. Should have a unique identifier of the format `cluster/unique-project-name/cluster-name`, example: `cluster/aikin/structured-json` -3. Should define a necessary parameter of `SLA` denoting the maximum time to complete the cluster, **higher the SLA, lower the cost** as systems have more time to optimize for the task (currently supported: `6h`, `12h`, `24h`) -4. Should have a necessary `trigger` parameter to start the cluster, this can be a `cron` expression, or an `api-call` or other possible events. -5. Each cluster can also define `logs` parameter to configure log forwarding to a specific destination like `NewRelic`, `Kusto`, `CloudWatch` or any other logging service. -6. Each cluster can also define `failure` steps to handle the cluster in case of failure, this could again be a set of satellites to run in case of failure. + -Developers can define their own clusters using our cluster api, which supports cluster creation, deletion, status, logs and other operations. Currently we are supporting cluster creation through `YML` files or our APIs and SDKs. + Create the node and add it to a runtime to enable execution: + ```python + from exospherehost import Runtime -### Orbit -Orbit is the core compute platform capable of managing the lifecycle of satellites and clusters optimally across multiple computes including GPUs, CPUs, and other hardware. Further allowing developers to write their own satellites and plug-in with our core exosphere platform. + Runtime( + name="my-first-runtime", + namespace="hello-world", + nodes=[ + MyFirstNode + ] + ).start() + ``` -## Example -Here is an example of using our cluster api to create a satellite cluster to get structured json from PDF files of quaterly financial reports. The workflow in the image could be represented as the `YML` file below. - -![Example Workflow](assets/example-workflow.png) - -```yaml -# define the version of the exosphere apis -version: 0.0.1b - -# using cluster api to create the cluster -cluster: - # maximum allowed to compute the cluster - # define the sla of the cluster (6h, 12h, 24h) - sla: 6h - - # define the name and description of the cluster for better understanding (optional) - title: Structured JSON from Quarterly Financial Reports - description: This cluster will take a list of PDF files from S3 and return a structured JSON output. - - # define the identifier of the cluster (project-name/cluster-name) - identifier: aikin/strucutred-pdfs - - # trigger for the cluster - trigger: - cron: "0 0 * * *" - - # define retries for each satellite, default is 5 - retries: 3 - - # define the secrets for the cluster, these are stored in a secure vault and only accessible by allowed satellites in this cluster - # still be sure to have minimum required permissions for each secret to avoid any security issues - secrets: - - AWS_ACCESS_KEY: "your-aws-access-key" - - AWS_SECRET_KEY: "your-aws-secret-key" - - API_BEARER_TOKEN: "your-api-bearer-token" - - NEW_RELIC_ACCOUNT_ID: "your-new-relic-account-id" - - NEW_RELIC_API_KEY: "your-new-relic-api-key" - - NEW_RELIC_APPLICATION_ID: "your-new-relic-application-id" - - FAILURE_S3_AWS_ACCESS_KEY: "your-failure-s3-aws-access-key" - - FAILURE_S3_AWS_SECRET_KEY: "your-failure-s3-aws-secret-key" +- ### Define your first flow - # satellites in order to execute, each satellite returns a list of objects hence computational graph is formed and is executed in parallel. - satellites: - - name: Get files from S3 - uses: satellite/exospherehost/get-files-from-s3 - identifier: get-files-from-s3 - config: - bucket: aikin-financial-reports - prefix: sec - recursive: true - extension: pdf - secrets: - - AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} - - AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} - - name: Extract text from PDF - uses: satellite/exospherehost/parse-pdf-with-docling - identifier: parse-pdf-with-docling - config: - language: en - output-format: markdown-string - extract-images: false - - name: Get structured json from markdown using DeepSeek - uses: satellite/exospherehost/deepseek-r1-distrill-llama-70b - identifier: deepseek-r1-distrill-llama-70b - retries: 5 - config: - temperature: 0.5 - max-tokens: 1024 - output-format: json - output-schema: | - { - "company": string, - "quarter": string, - "year": string, - "revenue": number, - "net-income": number, - "gross-profit": number, - "operating-income": number, - "net-income-margin": number, - "gross-profit-margin": number, - "operating-income-margin": number, - } - input: - prompt: | - Parse the following quarterly financial report and return a structured json output as defined in the output-schema, report text is provided below: - ${{satellites.parse-pdf-with-docling.output}} - - name: Call Webhook to send the structured json to Aikin API - uses: satellite/exospherehost/call-webhook - identifier: call-webhook - config: - url: https://api.aikin.com/v1/financial-reports - method: POST - headers: - - Authorization: Bearer ${{ secrets.API_BEARER_TOKEN }} - body: - - data: ${{satellites.deepseek-r1-distrill-llama-70b.output}} - file-path: $${{satellites.get-files-from-s3.output.file-path}} - - name: Delete success file from S3 - uses: satellite/exospherehost/delete-file-from-s3 - identifier: delete-file-from-s3 - config: - bucket: aikin-financial-reports - file-path: $${{satellites.get-files-from-s3.output.file-path}} - secrets: - - AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} - - AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} - - - # define steps to handle logs for this cluster - logs: - satellites: - - name: Send logs to NewRelic - uses: satellite/exospherehost/send-logs-to-new-relic - identifier: send-logs-to-new-relic - config: - account-id: ${{ secrets.NEW_RELIC_ACCOUNT_ID }} - api-key: ${{ secrets.NEW_RELIC_API_KEY }} - application-id: ${{ secrets.NEW_RELIC_APPLICATION_ID }} - log-level: info - - # define steps to handle failure for this cluster - failure: - # run from failed steps from this satellite - from: parse-pdf-with-docling - satellites: - - name: Move to failure bucket - uses: satellite/exospherehost/move-to-s3 - identifier: move-to-failure-bucket - config: - origin-source: s3 - origin-bucket: aikin-financial-reports-failure - origin-file-path: $${{satellites.get-files-from-s3.output.file-path}} - destination-source: s3 - destination-bucket: aikin-financial-reports-failure - destination-file-path: failed/quaterly-financial-reports/$${{satellites.get-files-from-s3.output.file-name}} - secrets: - - ORIGIN_AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} - - ORIGIN_AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} - - DESTINATION_AWS_ACCESS_KEY: ${{ secrets.FAILURE_S3_AWS_ACCESS_KEY }} - - DESTINATION_AWS_SECRET_KEY: ${{ secrets.FAILURE_S3_AWS_SECRET_KEY }} - - name: Send failure notification on PagerDuty - uses: satellite/exospherehost/send-pagerduty-alert - identifier: send-pagerduty-alert - config: - pagerduty-api-key: ${{ secrets.PAGERDUTY_API_KEY }} - pagerduty-service-id: ${{ secrets.PAGERDUTY_SERVICE_ID }} - input: - message: | - Cluster ${{cluster.identifier}} failed at ${{cluster.trigger}} for file $${{satellites.get-files-from-s3.output.file-path}} with error ${{satellites.get-files-from-s3.output.error}}, file has been moved to failure bucket with path $${{satellites.move-to-failure-bucket.output.file-uri}} -``` - -This could also be represented as a pythonic control using our SDK/APIs, checkout [documentation](https://docs.exosphere.host) for more details. + Flows are then described connecting nodes with relationships in json objects. Exosphere runs flows as per defined trigger conditions. See [Flow defintions](docs.exosphere.host) to see more examples. + ```json + { + "secrets": {}, + "nodes": [ + { + "node_name": "MyFirstNode", + "namespace": "hello-world", + "identifier": "describe_city", + "inputs": { + "bucket_name": "initial", + "prefix": "initial", + "files_only": "true", + "recursive": "false" + }, + "next_nodes": ["create_batches"] + }, + ``` ## Documentation -For more information, please refer to our [documentation](https://docs.exosphere.host). - -### Steps to build the Documentation locally -1. Install UV: Follow the official instructions [here](https://docs.astral.sh/uv/#installation). -2. Clone this repository, use command `git clone https://github.com/exospherehost/exospherehost.git` -3. Install dependencies by navigating to `docs` folder and executing `uv sync` -4. Use the command `uv run mkdocs serve` while `docs` folder being your working path. - -### Contribute to Documentation -We encourage contributions to the documentation page, you can simply add a new PR with the `documentation` label. - -## Open Source Commitment -We believe that humanity would not have been able to achieve the level of innovation and progress we have today without the support of open source and community, we want to be a part of this movement and support the open source community. In following ways: -1. We will be open sourcing majority of our codebase for exosphere.host and making it available to the community. We welcome all sort of contributions and feedback from the community and will be happy to collaborate with you. -2. For whatever the profits which we generate from exosphere.host, we will be donating a portion of it to open source projects and communities. If you have any questions, suggestions or ideas. -3. We would further be collaborating with various open source student programs to provide support, encourage and mentor the next generation of open source contributors. - -Please feel free to reach out to us at [nivedit@exosphere.host](mailto:nivedit@exosphere.host). Lets push the boundaries of possibilities for humanity together! ## Contributing -We welcome community contributions. For guidelines, refer to our [CONTRIBUTING.md](/CONTRIBUTING.md). Further we are thankful to all the contributors helping us to simplify infrastructure starting with the process of building and deploying AI workflows and agents. -![exosphere.host Contributors](https://contrib.rocks/image?repo=exospherehost/exospherehost) +We welcome community contributions. For guidelines, refer to our [CONTRIBUTING.md](/CONTRIBUTING.md). Further we are thankful to all the contributors helping us to simplify infrastructure starting with the process of building and deploying AI workflows and agents. -## Star History - - - - - Star History Chart - - +Join our Discord: https://discord.gg/msUHahrp for active community discussions. We have weekly community huddle to talk up feature dicsussions, feel free to become a part of the conversation. diff --git a/READMEold.md b/READMEold.md new file mode 100644 index 00000000..6fd9f14f --- /dev/null +++ b/READMEold.md @@ -0,0 +1,238 @@ +![logo light](assets/logo-light.svg#gh-light-mode-only) +![logo dark](assets/logo-dark.svg#gh-dark-mode-only) + +> We are building a world where creators and innovators can fully dedicate themselves to crafting extraordinary products and services, unburdened by the complexities of the underlying infrastructure. We foresee a future where intelligent systems seamlessly operate behind the scenes, tackling intricate, high-scale challenges with immense computational demands and vast data movements. + +To realize this, we are pioneering an open-source infrastructure layer for background AI workflows and agents that is robust, affordable, and effortless to use, empowering the scalable solutions and transformative tasks of today, tomorrow, and beyond. + +## Core Concepts +To have an intution of the first version of the platform, we would highly recommend watching the video below, this explains using our cluster apis with YML input, we are working on more modalities like pythonic control systems. + + + Cluster API YT + + +### Satellite +Satellites are the core building blocks for exosphere. They are lego blocks designed for a specific purpose: you can connect them together to create complex systems in a matter of minutes without worrying about the underlying infrastructure. + +They are pre-implemented serverless functions highly optimized for workflows and high volume batch processing, optimized for cost, reliability, developer velocity and ease of use. + +Our in-house optimization for workflows and batch processing can lead to significant cost savings, for example you can expect a cost per token saving of about 50-75% on LLMs like DeepSeek R1 70B, Gemma 3 27B, etc. + +Each of these satellites must satisfy the following properties: + +1. Should be idempotent and stateless. +2. Should have a unique identifier of the format `satellite/unique-project-name/satellite-name`, example: `satellite/exospherehost/deepseek-r1-distrill-llama-70b` +3. Should take a `config` parameter as an `object` to control or modify the behaviour. +4. Should be totally independent of any other satellite. +5. Should return a `list` of `objects`. +6. Should have following necessary fields: `parents`, `children`, `identifier`, `status`, `retries`, `delay`. Most of these fields are optional are set by the platform itself. +7. Should provide a clean interface for the user to check the status of the satellite and get output data. + +Further work is being done to allow users to bring their own satellites and use our core infrastructure to manage their lifecycle. + +### Cluster +A Cluster is a collection of satellites connected together to form a complete workflow: a series of satellities working together to achieve a common goal. + +Each of these clusters must satisfy the following properties: + +1. Should be a collection of satellites that are connected together to form a system. +2. Should have a unique identifier of the format `cluster/unique-project-name/cluster-name`, example: `cluster/aikin/structured-json` +3. Should define a necessary parameter of `SLA` denoting the maximum time to complete the cluster, **higher the SLA, lower the cost** as systems have more time to optimize for the task (currently supported: `6h`, `12h`, `24h`) +4. Should have a necessary `trigger` parameter to start the cluster, this can be a `cron` expression, or an `api-call` or other possible events. +5. Each cluster can also define `logs` parameter to configure log forwarding to a specific destination like `NewRelic`, `Kusto`, `CloudWatch` or any other logging service. +6. Each cluster can also define `failure` steps to handle the cluster in case of failure, this could again be a set of satellites to run in case of failure. + +Developers can define their own clusters using our cluster api, which supports cluster creation, deletion, status, logs and other operations. Currently we are supporting cluster creation through `YML` files or our APIs and SDKs. + +### Orbit +Orbit is the core compute platform capable of managing the lifecycle of satellites and clusters optimally across multiple computes including GPUs, CPUs, and other hardware. Further allowing developers to write their own satellites and plug-in with our core exosphere platform. + +## Example +Here is an example of using our cluster api to create a satellite cluster to get structured json from PDF files of quaterly financial reports. The workflow in the image could be represented as the `YML` file below. + +![Example Workflow](assets/example-workflow.png) + +```yaml +# define the version of the exosphere apis +version: 0.0.1b + +# using cluster api to create the cluster +cluster: + # maximum allowed to compute the cluster + # define the sla of the cluster (6h, 12h, 24h) + sla: 6h + + # define the name and description of the cluster for better understanding (optional) + title: Structured JSON from Quarterly Financial Reports + description: This cluster will take a list of PDF files from S3 and return a structured JSON output. + + # define the identifier of the cluster (project-name/cluster-name) + identifier: aikin/strucutred-pdfs + + # trigger for the cluster + trigger: + cron: "0 0 * * *" + + # define retries for each satellite, default is 5 + retries: 3 + + # define the secrets for the cluster, these are stored in a secure vault and only accessible by allowed satellites in this cluster + # still be sure to have minimum required permissions for each secret to avoid any security issues + secrets: + - AWS_ACCESS_KEY: "your-aws-access-key" + - AWS_SECRET_KEY: "your-aws-secret-key" + - API_BEARER_TOKEN: "your-api-bearer-token" + - NEW_RELIC_ACCOUNT_ID: "your-new-relic-account-id" + - NEW_RELIC_API_KEY: "your-new-relic-api-key" + - NEW_RELIC_APPLICATION_ID: "your-new-relic-application-id" + - FAILURE_S3_AWS_ACCESS_KEY: "your-failure-s3-aws-access-key" + - FAILURE_S3_AWS_SECRET_KEY: "your-failure-s3-aws-secret-key" + + # satellites in order to execute, each satellite returns a list of objects hence computational graph is formed and is executed in parallel. + satellites: + - name: Get files from S3 + uses: satellite/exospherehost/get-files-from-s3 + identifier: get-files-from-s3 + config: + bucket: aikin-financial-reports + prefix: sec + recursive: true + extension: pdf + secrets: + - AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} + - AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} + - name: Extract text from PDF + uses: satellite/exospherehost/parse-pdf-with-docling + identifier: parse-pdf-with-docling + config: + language: en + output-format: markdown-string + extract-images: false + - name: Get structured json from markdown using DeepSeek + uses: satellite/exospherehost/deepseek-r1-distrill-llama-70b + identifier: deepseek-r1-distrill-llama-70b + retries: 5 + config: + temperature: 0.5 + max-tokens: 1024 + output-format: json + output-schema: | + { + "company": string, + "quarter": string, + "year": string, + "revenue": number, + "net-income": number, + "gross-profit": number, + "operating-income": number, + "net-income-margin": number, + "gross-profit-margin": number, + "operating-income-margin": number, + } + input: + prompt: | + Parse the following quarterly financial report and return a structured json output as defined in the output-schema, report text is provided below: + ${{satellites.parse-pdf-with-docling.output}} + - name: Call Webhook to send the structured json to Aikin API + uses: satellite/exospherehost/call-webhook + identifier: call-webhook + config: + url: https://api.aikin.com/v1/financial-reports + method: POST + headers: + - Authorization: Bearer ${{ secrets.API_BEARER_TOKEN }} + body: + - data: ${{satellites.deepseek-r1-distrill-llama-70b.output}} + file-path: $${{satellites.get-files-from-s3.output.file-path}} + - name: Delete success file from S3 + uses: satellite/exospherehost/delete-file-from-s3 + identifier: delete-file-from-s3 + config: + bucket: aikin-financial-reports + file-path: $${{satellites.get-files-from-s3.output.file-path}} + secrets: + - AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} + - AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} + + + # define steps to handle logs for this cluster + logs: + satellites: + - name: Send logs to NewRelic + uses: satellite/exospherehost/send-logs-to-new-relic + identifier: send-logs-to-new-relic + config: + account-id: ${{ secrets.NEW_RELIC_ACCOUNT_ID }} + api-key: ${{ secrets.NEW_RELIC_API_KEY }} + application-id: ${{ secrets.NEW_RELIC_APPLICATION_ID }} + log-level: info + + # define steps to handle failure for this cluster + failure: + # run from failed steps from this satellite + from: parse-pdf-with-docling + satellites: + - name: Move to failure bucket + uses: satellite/exospherehost/move-to-s3 + identifier: move-to-failure-bucket + config: + origin-source: s3 + origin-bucket: aikin-financial-reports-failure + origin-file-path: $${{satellites.get-files-from-s3.output.file-path}} + destination-source: s3 + destination-bucket: aikin-financial-reports-failure + destination-file-path: failed/quaterly-financial-reports/$${{satellites.get-files-from-s3.output.file-name}} + secrets: + - ORIGIN_AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} + - ORIGIN_AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} + - DESTINATION_AWS_ACCESS_KEY: ${{ secrets.FAILURE_S3_AWS_ACCESS_KEY }} + - DESTINATION_AWS_SECRET_KEY: ${{ secrets.FAILURE_S3_AWS_SECRET_KEY }} + - name: Send failure notification on PagerDuty + uses: satellite/exospherehost/send-pagerduty-alert + identifier: send-pagerduty-alert + config: + pagerduty-api-key: ${{ secrets.PAGERDUTY_API_KEY }} + pagerduty-service-id: ${{ secrets.PAGERDUTY_SERVICE_ID }} + input: + message: | + Cluster ${{cluster.identifier}} failed at ${{cluster.trigger}} for file $${{satellites.get-files-from-s3.output.file-path}} with error ${{satellites.get-files-from-s3.output.error}}, file has been moved to failure bucket with path $${{satellites.move-to-failure-bucket.output.file-uri}} +``` + +This could also be represented as a pythonic control using our SDK/APIs, checkout [documentation](https://docs.exosphere.host) for more details. + +## Documentation +For more information, please refer to our [documentation](https://docs.exosphere.host). + +### Steps to build the Documentation locally +1. Install UV: Follow the official instructions [here](https://docs.astral.sh/uv/#installation). +2. Clone this repository, use command `git clone https://github.com/exospherehost/exospherehost.git` +3. Install dependencies by navigating to `docs` folder and executing `uv sync` +4. Use the command `uv run mkdocs serve` while `docs` folder being your working path. + +### Contribute to Documentation +We encourage contributions to the documentation page, you can simply add a new PR with the `documentation` label. + +## Open Source Commitment + +We believe that humanity would not have been able to achieve the level of innovation and progress we have today without the support of open source and community, we want to be a part of this movement and support the open source community. In following ways: + +1. We will be open sourcing majority of our codebase for exosphere.host and making it available to the community. We welcome all sort of contributions and feedback from the community and will be happy to collaborate with you. +2. For whatever the profits which we generate from exosphere.host, we will be donating a portion of it to open source projects and communities. If you have any questions, suggestions or ideas. +3. We would further be collaborating with various open source student programs to provide support, encourage and mentor the next generation of open source contributors. + +Please feel free to reach out to us at [nivedit@exosphere.host](mailto:nivedit@exosphere.host). Lets push the boundaries of possibilities for humanity together! + +## Contributing +We welcome community contributions. For guidelines, refer to our [CONTRIBUTING.md](/CONTRIBUTING.md). Further we are thankful to all the contributors helping us to simplify infrastructure starting with the process of building and deploying AI workflows and agents. + +![exosphere.host Contributors](https://contrib.rocks/image?repo=exospherehost/exospherehost) + +## Star History + + + + + Star History Chart + + diff --git a/docs/docs/api-server/index.md b/docs/docs/api-server/index.md deleted file mode 100644 index 7cbe0120..00000000 --- a/docs/docs/api-server/index.md +++ /dev/null @@ -1,147 +0,0 @@ -# API Server -API Server is essentially the public interface of the Exosphere platform for the users to interact with. API Server is created in fastapi and has following core apps, each independent of each other. - -## Project -Project is a logical grouping and separation of the resources within exosphere ecosystem, thus each project has its unique namespace and billing details attached to it. - -Note: Currently all users within a project have same access to all resources within the project. Billing information is set once and cannot be changed, these could be changed only by the exosphere team on email request as of now. - -### Project Model -```json -{ - "_id":{ - "type": ObjectId, - "required": true, - "description": "Unique identifier for the project, auto generated by database" - }, - "name":{ - "type": String, - "required": true, - "description": "Human readable name of the project" - }, - "status":{ - "type": String, - "required": true, - "description": "Status of the project, active, inactive, blocked, deleted (enum)" - }, - "billing_account":{ - "type": { - "company_name": { - "type": String, - "required": true, - "description": "Name of the company" - }, - "company_address": { - "type": String, - "required": true, - "description": "Address of the company" - }, - "tax_number_type": { - "type": String, - "required": true, - "description": "Type of the tax number, vat, gst, etc. (enum)" - }, - "tax_number": { - "type": String, - "required": true, - "description": "Tax number of the company" - }, - "country": { - "type": String, - "required": true, - "description": "Country of the company" - } - }, - "required": true, - "description": "Billing account of the project, reference to the billing account document" - }, - "users": [ - { - { - "role": { - "type": String, - "required": true, - "description": "Role of the user in the project, admin, user, etc. (enum)" - }, - "user": { - "type": ObjectId, - "required": true, - "description": "Reference to the user document" - } - } - } - ], - "super_admin": { - "type": ObjectId, - "required": true, - "description": "Reference to the user document, super admin of the project" - }, - "created_at":{ - "type": DateTime, - "required": true, - "description": "Date and time when the project was created" - }, - "updated_at":{ - "type": DateTime, - "required": true, - "description": "Date and time when the project was last updated" - } -} -``` - -## User -Model representing exosphere user. - -### User Model -```json -{ - "_id":{ - "type": ObjectId, - "required": true, - "description": "Unique identifier for the user, auto generated by database" - }, - "name":{ - "type": String, - "required": true, - "description": "Human readable name of the user" - }, - "type": { - "type": String, - "required": true, - "description": "Type of the user, human, api, etc. (enum)" - }, - "identifier": { - "type": String, - "required": true, - "description": "Identifier of the user, email, phone, etc. (string)" - }, - "verification_status": { - "type": String, - "required": true, - "description": "Verification status of the user, verified, not_verified, blocked, deleted, not_required (enum)" - }, - "credential": { - "type": String, - "required": true, - "description": "Credential of the user, password, key, etc. (string)" - }, - "status": { - "type": String, - "required": true, - "description": "Status of the user, active, inactive, deleted, blocked (enum)" - }, - "created_at":{ - "type": DateTime, - "required": true, - "description": "Date and time when the user was created" - }, - "updated_at":{ - "type": DateTime, - "required": true, - "description": "Date and time when the user was last updated" - } -} -``` - -## Auth -The main role of this project is to issue tokens and verify the users and APIs to access the resources within the projects. diff --git a/docs/docs/api-server/swagger.md b/docs/docs/api-server/swagger.md deleted file mode 100644 index 99b1c365..00000000 --- a/docs/docs/api-server/swagger.md +++ /dev/null @@ -1,2 +0,0 @@ -# Swagger -All api definitions and swagger documentation is available at [https://api.exosphere.host/docs](https://api.exosphere.host/docs) \ No newline at end of file diff --git a/docs/docs/architecture.md b/docs/docs/architecture.md deleted file mode 100644 index abf08c14..00000000 --- a/docs/docs/architecture.md +++ /dev/null @@ -1,34 +0,0 @@ -# Architecture -This page explains the architecture of working and implementation of `satellites`, `orbit` and working of apis and api server. - -![Architecture](./assets/arch.png) - -## API Server -The main job of the API server is to handle the requests from the user and make sure of the following: - -- Authentication -- Authorization -- Rate Limiting -- Error Handling - -Further pass the request to the controller to handle the workflow gracefully. - -## Controller -This is like the brain of the system and is responsible for the following: - -- Scheduling the workflows -- Managing the state of the workflows -- Handling the errors -- Handling the logs -- Requested necessary infrastructure resources to manage the satellites - - -## Orbit -Container holding one or more satellites is referred as `orbit`. There are certain rules with each `orbit` has to follow: - -- Should be a self-contained unit -- Should define the minimum hardware requirements -- Should implement standard exosphere interfaces and protocols - -## Infra Manager -The role of the infra manager is to manage the underlying infrastructure and hardware resources as per the instructions from the controller. \ No newline at end of file diff --git a/docs/docs/cluster.md b/docs/docs/cluster.md deleted file mode 100644 index 6eb8b99f..00000000 --- a/docs/docs/cluster.md +++ /dev/null @@ -1,4 +0,0 @@ -# Cluster -A cluster is a group of satellites that are run together. They are defined in a YAML file and executed as a single job. You can define a cluster in a YAML file and deploy it on ExosphereHost infrastructure within minutes. - -Adding more examples to this section to make clusters clearer. Further, we are working on Pythonic control flow to make clusters more flexible and powerful. \ No newline at end of file diff --git a/docs/docs/exosphere/concepts.md b/docs/docs/exosphere/concepts.md new file mode 100644 index 00000000..0c7a7d58 --- /dev/null +++ b/docs/docs/exosphere/concepts.md @@ -0,0 +1,583 @@ +# Core Concepts + +This section explains the fundamental concepts that define Exosphere's architecture and design philosophy. + +## Fanout + +Fanout is a core concept in Exosphere that enables parallel processing and distributed execution. It allows a single node to produce multiple outputs, which can then be processed by multiple downstream nodes simultaneously. + +### Understanding Fanout + +Fanout occurs when a node returns multiple outputs from a single execution. This is particularly useful for: + +- **Data splitting**: Dividing large datasets into smaller chunks for parallel processing +- **Batch processing**: Processing multiple items simultaneously +- **Parallel agents**: Executing different branches of a workflow concurrently + +### Fanout Example + +```python +from exospherehost import BaseNode +from pydantic import BaseModel + +class DataSplitterNode(BaseNode): + class Inputs(BaseModel): + data: str # JSON string of data array + + class Outputs(BaseModel): + chunk: str # JSON string of data chunk + + class Secrets(BaseModel): + pass + + async def execute(self) -> list[Outputs]: + data = json.loads(self.inputs.data) + chunk_size = 100 + + outputs = [] + for i in range(0, len(data), chunk_size): + chunk = data[i:i + chunk_size] + outputs.append(self.Outputs( + chunk=json.dumps(chunk) + )) + + return outputs # This creates fanout - multiple outputs +``` + +### Fanout in Flows + +When a node produces multiple outputs, the state manager creates multiple states that can be processed in parallel. In the flow structure, this is handled through the `next_nodes` field: + +```json +{ + "nodes": [ + { + "node_name": "DataSplitterNode", + "namespace": "MyProject", + "identifier": "data_splitter", + "inputs": { + "data": "initial" + }, + "next_nodes": ["processor_1", "processor_2", "processor_3"] + }, + { + "node_name": "DataProcessorNode", + "namespace": "MyProject", + "identifier": "processor_1", + "inputs": { + "chunk": "${{ data_splitter.outputs.chunk }}" + }, + "next_nodes": ["result_merger"] + }, + { + "node_name": "DataProcessorNode", + "namespace": "MyProject", + "identifier": "processor_2", + "inputs": { + "chunk": "${{ data_splitter.outputs.chunk }}" + }, + "next_nodes": ["result_merger"] + }, + { + "node_name": "DataProcessorNode", + "namespace": "MyProject", + "identifier": "processor_3", + "inputs": { + "chunk": "${{ data_splitter.outputs.chunk }}" + }, + "next_nodes": ["result_merger"] + }, + { + "node_name": "ResultMergerNode", + "namespace": "MyProject", + "identifier": "result_merger", + "inputs": { + "result_1": "${{ processor_1.outputs.processed_data }}", + "result_2": "${{ processor_2.outputs.processed_data }}", + "result_3": "${{ processor_3.outputs.processed_data }}" + }, + "next_nodes": [] + } + ] +} +``` + +Each output from the `data_splitter` node will trigger separate executions of the processor nodes, and the `result_merger` will wait for all processors to complete before executing. + +## Units + +Units in Exosphere represent the atomic processing components that make up your workflows. Each unit is a self-contained piece of logic that can be executed independently. + +### Unit Characteristics + +- **Self-contained**: Each unit has its own inputs, outputs, and processing logic +- **Stateless**: Units don't maintain state between executions (state is managed externally) +- **Reusable**: Units can be used in multiple workflows +- **Testable**: Units can be tested independently + +## Inputs + +Inputs define the data that a unit expects to receive. In Exosphere v1, all inputs must be strings, which provides a consistent interface while allowing for complex data through JSON serialization. + +### Input Structure + +```python +class Inputs(BaseModel): + # Simple string inputs + user_id: str + operation: str + + # Complex data as JSON strings + config: str # JSON string + data: str # JSON string +``` + +### Input Validation + +Pydantic automatically validates inputs based on the schema: + +```python +class Inputs(BaseModel): + user_id: str + age: str # Must be a string representation of a number + + @validator('age') + def validate_age(cls, v): + try: + age = int(v) + if age < 0 or age > 150: + raise ValueError("Age must be between 0 and 150") + return v + except ValueError: + raise ValueError("Age must be a valid integer") +``` + +### Working with Complex Inputs + +Since all inputs are strings, use JSON for complex data: + +```python +async def execute(self) -> Outputs: + # Parse JSON inputs + config = json.loads(self.inputs.config) + data = json.loads(self.inputs.data) + + # Use the parsed data + result = self._process_with_config(data, config) + + return self.Outputs(result=json.dumps(result)) +``` + +### Input Mapping in Flows + +In flow templates, inputs can reference outputs from previous nodes using the `${{ ... }}` syntax: + +```json +{ + "nodes": [ + { + "node_name": "DataLoaderNode", + "identifier": "data_loader", + "inputs": { + "source": "initial" // Static value + }, + "next_nodes": ["data_processor"] + }, + { + "node_name": "DataProcessorNode", + "identifier": "data_processor", + "inputs": { + "raw_data": "${{ data_loader.outputs.processed_data }}", // Mapped from previous node + "config": "initial" // Static value + }, + "next_nodes": ["data_validator"] + } + ] +} +``` + +**Mapping Syntax:** +- **`${{ node_identifier.outputs.field_name }}`**: Maps output from a specific node +- **`initial`**: Static value provided when the flow is triggered +- **Direct values**: String, number, or boolean values + +## Outputs + +Outputs define the data that a unit produces. Like inputs, all outputs must be strings in v1, providing a consistent interface for data flow between units. + +### Output Structure + +```python +class Outputs(BaseModel): + # Simple string outputs + status: str + message: str + + # Complex data as JSON strings + result: str # JSON string + metadata: str # JSON string +``` + +### Multiple Outputs + +Units can return multiple outputs through fanout: + +```python +async def execute(self) -> list[Outputs]: + data = json.loads(self.inputs.data) + + outputs = [] + for item in data: + processed = self._process_item(item) + outputs.append(self.Outputs( + result=json.dumps(processed), + item_id=str(item['id']) + )) + + return outputs # Multiple outputs for fanout +``` + +### Output Validation + +Validate outputs before returning them: + +```python +async def execute(self) -> Outputs: + result = self._process(self.inputs.data) + + # Validate the result + if not result: + return self.Outputs( + result="", + status="error", + error="Processing failed" + ) + + return self.Outputs( + result=json.dumps(result), + status="success", + error="" + ) +``` + +## Secrets + +Secrets provide secure access to sensitive configuration data such as API keys, database credentials, and other authentication tokens. Secrets are managed securely by the Exosphere runtime and are never exposed in logs or error messages. + +### Secret Structure + +```python +class Secrets(BaseModel): + # API credentials + api_key: str + api_secret: str + + # Database credentials + database_url: str + database_password: str + + # External service credentials + aws_access_key_id: str + aws_secret_access_key: str +``` + +### Using Secrets + +Secrets are automatically injected into your unit during execution: + +```python +async def execute(self) -> Outputs: + # Access secrets via self.secrets + headers = { + "Authorization": f"Bearer {self.secrets.api_key}", + "Content-Type": "application/json" + } + + # Use secrets for API calls + async with httpx.AsyncClient() as client: + response = await client.post( + "https://api.example.com/process", + headers=headers, + json={"data": self.inputs.data} + ) + + return self.Outputs(result=response.text) +``` + +### Secret Management + +Secrets are managed by the Exosphere runtime and are defined as an object in the flow template: + +```json +{ + "secrets": { + "openai_api_key": "your-openai-key", + "aws_access_key_id": "your-aws-key", + "aws_secret_access_key": "your-aws-secret", + "database_url": "your-database-url" + }, + "nodes": [ + // ... node definitions + ] +} +``` + +Secrets can be configured through: + +1. **Flow template**: Define secrets in the flow template (for development) +2. **Environment variables**: Set secrets in your runtime environment +3. **Runtime configuration**: Pass secrets when creating the runtime +4. **External secret management**: Integrate with services like AWS Secrets Manager + +### Security Best Practices + +- **Never log secrets**: Secrets are automatically filtered from logs +- **Use environment variables**: Store secrets in environment variables +- **Rotate secrets regularly**: Implement secret rotation policies +- **Limit secret scope**: Only include secrets that the unit actually needs + +## Data Flow Concepts + +### Linear Flow + +Simple sequential processing where each node has a single successor: + +```json +{ + "nodes": [ + { + "node_name": "DataLoaderNode", + "identifier": "data_loader", + "next_nodes": ["data_processor"] + }, + { + "node_name": "DataProcessorNode", + "identifier": "data_processor", + "next_nodes": ["data_validator"] + }, + { + "node_name": "DataValidatorNode", + "identifier": "data_validator", + "next_nodes": [] + } + ] +} +``` + +### Parallel Flow + +Multiple nodes processing simultaneously with a merge point: + +```json +{ + "nodes": [ + { + "node_name": "DataSplitterNode", + "identifier": "data_splitter", + "next_nodes": ["processor_1", "processor_2"] + }, + { + "node_name": "DataProcessorNode", + "identifier": "processor_1", + "next_nodes": ["result_merger"] + }, + { + "node_name": "DataProcessorNode", + "identifier": "processor_2", + "next_nodes": ["result_merger"] + }, + { + "node_name": "ResultMergerNode", + "identifier": "result_merger", + "next_nodes": [] + } + ] +} +``` + +### Conditional Flow + +Flow that depends on conditions (handled within node logic): + +```json +{ + "nodes": [ + { + "node_name": "DataAnalyzerNode", + "identifier": "data_analyzer", + "next_nodes": ["text_processor", "image_processor"] + }, + { + "node_name": "TextProcessorNode", + "identifier": "text_processor", + "next_nodes": ["result_collector"] + }, + { + "node_name": "ImageProcessorNode", + "identifier": "image_processor", + "next_nodes": ["result_collector"] + }, + { + "node_name": "ResultCollectorNode", + "identifier": "result_collector", + "next_nodes": [] + } + ] +} +``` + +### Fanout Flow + +One node producing multiple outputs for parallel processing: + +```json +{ + "nodes": [ + { + "node_name": "DataSplitterNode", + "identifier": "data_splitter", + "next_nodes": ["processor_1", "processor_2", "processor_3"] + }, + { + "node_name": "DataProcessorNode", + "identifier": "processor_1", + "next_nodes": [] + }, + { + "node_name": "DataProcessorNode", + "identifier": "processor_2", + "next_nodes": [] + }, + { + "node_name": "DataProcessorNode", + "identifier": "processor_3", + "next_nodes": [] + } + ] +} +``` + +## State Management + +### State Lifecycle + +1. **Pending**: State is created and waiting for execution +2. **Running**: State is currently being executed +3. **Executed**: State completed successfully +4. **Errored**: State failed with an error + +### State Persistence + +States are automatically persisted by the state manager, providing: + +- **Fault tolerance**: Failed states can be retried +- **Recovery**: Workflows can resume from where they left off +- **Monitoring**: Track execution progress and history +- **Debugging**: Inspect state data and error information + +### State Transitions + +```python +# State transitions are handled automatically +async def execute(self) -> Outputs: + try: + result = self._process(self.inputs.data) + return self.Outputs(result=result) # State becomes "executed" + except Exception as e: + raise e # State becomes "errored" +``` + +## Error Handling + +### Error Propagation + +Errors in units are automatically handled by the runtime: + +```python +async def execute(self) -> Outputs: + try: + result = self._process(self.inputs.data) + return self.Outputs(result=result) + except ValueError as e: + # Validation errors - don't retry + return self.Outputs( + result="", + error=f"validation_error: {str(e)}" + ) + except Exception as e: + # Processing errors - will be retried + raise e +``` + +### Retry Logic + +The runtime automatically retries failed states: + +- **Transient failures**: Network issues, temporary unavailability +- **Configurable retry limits**: Set maximum retry attempts +- **Exponential backoff**: Increasing delays between retries +- **Error classification**: Different handling for different error types + +## Performance Concepts + +### Async Execution + +All units are executed asynchronously: + +```python +async def execute(self) -> Outputs: + # Async operations for better performance + result = await self._async_operation(self.inputs.data) + return self.Outputs(result=result) +``` + +### Parallel Processing + +Fanout enables parallel processing: + +```python +async def execute(self) -> list[Outputs]: + # This will create multiple parallel executions + return [self.Outputs(data=chunk) for chunk in self._split_data()] +``` + +### Resource Management + +- **Connection pooling**: Reuse connections for external services +- **Memory management**: Automatic cleanup of resources +- **CPU utilization**: Efficient use of available compute resources + +## Scalability Concepts + +### Horizontal Scaling + +Add more runtime instances to handle increased load: + +```python +# Multiple runtime instances can process the same workflow +Runtime(namespace="MyProject", name="Runtime-1", nodes=[MyNode]).start() +Runtime(namespace="MyProject", name="Runtime-2", nodes=[MyNode]).start() +``` + +### Load Balancing + +The state manager automatically distributes work across available runtimes: + +- **Round-robin distribution**: Even distribution of states +- **Capacity-based routing**: Consider runtime capacity +- **Health-based routing**: Avoid unhealthy runtimes + +### Auto-scaling + +Scale based on workload: + +- **Queue depth**: Scale up when queue is full +- **Processing time**: Scale up when processing is slow +- **Error rates**: Scale down when error rates are high + +## Next Steps + +- **[Create Flow](./create-graph.md)** - Learn how to create flow templates +- **[Trigger Flow](./trigger-graph.md)** - Execute your workflows +- **[Examples](./examples.md)** - See real-world examples +- **[Dashboard](./dashboard.md)** - Monitor your flows with the Exosphere dashboard diff --git a/docs/docs/exosphere/create-graph.md b/docs/docs/exosphere/create-graph.md new file mode 100644 index 00000000..5afdff2f --- /dev/null +++ b/docs/docs/exosphere/create-graph.md @@ -0,0 +1,298 @@ +# Create Graph + +Graphs in Exosphere define executions by connecting nodes together. A graph template specifies the nodes, their connections, and how data flows between them. This guide shows you how to create and manage graph templates. + +## Graph Structure + +A graph template consists of: + +- **Nodes**: The processing units in your workflow with their inputs and next nodes +- **Secrets**: Configuration data shared across nodes +- **Input Mapping**: How data flows between nodes using `${{ ... }}` syntax + +## Basic Graph Example + +One can define a graph on Exosphere through a simple json config, which specifies the nodes and their relationships on the graph. + +```json +{ + "secrets": { + "openai_api_key": "your-openai-key", + "database_url": "your-database-url" + }, + "nodes": [ + { + "node_name": "DataLoaderNode", + "namespace": "MyProject", + "identifier": "data_loader", + "inputs": { + "source": "initial", + "format": "json" + }, + "next_nodes": ["data_processor"] + }, + { + "node_name": "DataProcessorNode", + "namespace": "MyProject", + "identifier": "data_processor", + "inputs": { + "raw_data": "${{ data_loader.outputs.processed_data }}", + "config": "initial" + }, + "next_nodes": ["data_validator"] + }, + { + "node_name": "DataValidatorNode", + "namespace": "MyProject", + "identifier": "data_validator", + "inputs": { + "data": "${{ data_processor.outputs.processed_data }}", + "validation_rules": "initial" + }, + "next_nodes": [] + } + ] +} +``` + +## Components + +### Secrets + +Define secrets as an object with key-value pairs: + +```json +{ + "secrets": { + "openai_api_key": "your-openai-key", + "aws_access_key_id": "your-aws-key", + "aws_secret_access_key": "your-aws-secret", + "aws_region": "us-east-1", + "database_url": "your-database-url" + } +} +``` + +**Fields:** + +- **Keys**: Secret names that will be available to all nodes +- **Values**: The actual secret values (in production, these should be encrypted) + +### Nodes + +Define the nodes in your workflow with their inputs and next nodes: + +```json +{ + "nodes": [ + { + "node_name": "NodeClassName", + "namespace": "MyProject", + "identifier": "unique_node_id", + "inputs": { + "input_field": "initial_value", + "mapped_field": "${{ source_node.outputs.output_field }}" + }, + "next_nodes": ["next_node_identifier"] + } + ] +} +``` + +**Fields:** + +- **`node_name`**: The class name of the node (must be registered) +- **`namespace`**: The namespace where the node is registered +- **`identifier`**: Unique identifier for the node in this flow +- **`inputs`**: Input values for the node +- **`next_nodes`**: Array of node identifiers that this node connects to + +### Input Mapping + +Use the `${{ ... }}` syntax to map outputs from previous nodes: + +```json +{ + "inputs": { + "static_value": "initial", + "mapped_value": "${{ source_node.outputs.output_field }}", + "nested_mapping": "${{ source_node.outputs.nested.field }}" + } +} +``` + +**Mapping Syntax:** + +- **`${{ node_identifier.outputs.field_name }}`**: Maps output from a specific node +- **`initial`**: Static value provided when the flow is triggered +- **Direct values**: String, number, or boolean values + +## Creating Graph Templates + +The recommended way to create graph templates is using the Exosphere Python SDK, which provides a clean interface to the State Manager API. + +```python hl_lines="5-9 23-27" +from exospherehost import StateManager + +async def create_flow_template(): + # Initialize the State Manager + state_manager = StateManager( + namespace="MyProject", + state_manager_uri="https://your-state-manager.exosphere.host", + key="your-api-key" + ) + + # Define the graph nodes + graph_nodes = [ + ... #nodes from the namespace MyProject + ] + + # Define secrets + secrets = { + ... + } + + try: + # Create or update the graph template + result = await state_manager.upsert_graph( + graph_name="my-workflow", + graph_nodes=graph_nodes, + secrets=secrets + ) + print("Graph template created successfully!") + print(f"Validation status: {result['validation_status']}") + return result + except Exception as e: + print(f"Error creating graph template: {e}") + raise + +# Run the function +import asyncio +asyncio.run(create_flow_template()) +``` +## Input Mapping Patterns + +=== "Field Mapping" + + ```json + { + "inputs": { + "data": "${{ source_node.outputs.data }}" + } + } + ``` + +=== "Static Values" + + ```json + { + "inputs": { + "config_value": "static_value", + "number_value": "42", + "boolean_value": "true" + } + } + ``` + +## Graph Validation + +The state manager validates your graph template: + +### Node Validation + +- All nodes must be registered in the specified namespace +- Node identifiers must be unique within the graph +- Node names must match registered node classes + +### Input Validation + +- Mapped fields must exist in source node schemas +- Input field names must match node input schemas +- No circular dependencies allowed in `next_nodes` + +### Secret Validation + +- All referenced secrets must be defined in the secrets object +- Secret names must be valid identifiers + +## Graph Management + +=== "Get Graph Template" + + ```python hl_lines="11" + from exospherehost import StateManager + + async def get_graph_template(): + state_manager = StateManager( + namespace="MyProject", + state_manager_uri="https://your-state-manager.exosphere.host", + key="your-api-key" + ) + + try: + graph_info = await state_manager.get_graph("my-workflow") + print(f"Graph validation status: {graph_info['validation_status']}") + print(f"Number of nodes: {len(graph_info['nodes'])}") + print(f"Validation errors: {graph_info['validation_errors']}") + return graph_info + except Exception as e: + print(f"Error getting graph template: {e}") + raise + + # Get graph information + graph_info = asyncio.run(get_graph_template()) + ``` + +=== "Update Graph Template" + + ```python hl_lines="17 21-25" + async def update_graph_template(): + state_manager = StateManager( + namespace="MyProject", + state_manager_uri="https://your-state-manager.exosphere.host", + key="your-api-key" + ) + + # Updated graph nodes + updated_nodes = [ + ... + ] + + # Updated secrets + updated_secrets = { + "openai_api_key": "your-openai-key", + "database_url": "your-database-url", + "logging_endpoint": "your-logging-endpoint" # Added new secret + } + + try: + result = await state_manager.upsert_graph( + graph_name="my-workflow", + graph_nodes=updated_nodes, + secrets=updated_secrets + ) + print("Graph template updated successfully!") + print(f"Validation status: {result['validation_status']}") + return result + except Exception as e: + print(f"Error updating graph template: {e}") + raise + + # Update the graph + asyncio.run(update_graph_template()) + ``` + +## Graph Visualization + +The Exosphere dashboard provides visual representation of your graphs. Checkout the [Dashboard Guide](./dashboard.md) + +- **Node View**: See all nodes and their connections via `next_nodes` +- **Execution Flow**: Track how data flows through the graph using input mapping +- **State Monitoring**: Monitor execution states in real-time +- **Error Tracking**: Identify and debug failed executions + +## Next Steps + +- **[Trigger Graph](./trigger-graph.md)** - Learn how to execute your workflows +- **[Examples](./examples.md)** - See real-world graph examples +- **[Dashboard](./dashboard.md)** - Use the Exosphere dashboard for monitoring diff --git a/docs/docs/exosphere/create-runtime.md b/docs/docs/exosphere/create-runtime.md new file mode 100644 index 00000000..430cad7d --- /dev/null +++ b/docs/docs/exosphere/create-runtime.md @@ -0,0 +1,285 @@ +# Create Runtime + +The `Runtime` class is the core component that manages the execution environment for your Exosphere nodes. It handles node registration, state polling, execution, and communication with the state manager. + +## Runtime Setup + +=== "Basic" + + ```python hl_lines="17-22" + from exospherehost import Runtime, BaseNode + from pydantic import BaseModel + + class MyNode(BaseNode): + class Inputs(BaseModel): + data: str + + class Outputs(BaseModel): + result: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> Outputs: + return self.Outputs(result=f"Processed: {self.inputs.data}") + + # Create and start the runtime + Runtime( + namespace="MyProject", + name="MyRuntime", + nodes=[MyNode] + ).start() + + ``` + +=== "Advanced" + + ```python hl_lines="17-30" + from exospherehost import Runtime, BaseNode + from pydantic import BaseModel + + class MyNode(BaseNode): + class Inputs(BaseModel): + data: str + + class Outputs(BaseModel): + result: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> Outputs: + return self.Outputs(result=f"Processed: {self.inputs.data}") + + # Create runtime with custom configuration + runtime = Runtime( + namespace="MyProject", + name="MyRuntime", + nodes=[MyNode], + state_manager_uri="https://your-state-manager.exosphere.host", + key="your-api-key", + batch_size=32, + workers=8, + poll_interval=2 + ) + + # Start the runtime + runtime.start() + + ``` + +## Runtime Parameters + +### Required Parameters + +- **`namespace`** (str): The namespace for your project. Used to organize and isolate your nodes and workflows. +- **`name`** (str): The name of this runtime instance. Must be unique within your namespace. +- **`nodes`** (List[type[BaseNode]]): List of node classes to register and execute. + +### Optional Parameters + +- **`state_manager_uri`** (str | None): URI of the state manager service. If not provided, uses `EXOSPHERE_URI` environment variable. +- **`key`** (str | None): API key for authentication. If not provided, uses `EXOSPHERE_KEY` environment variable. +- **`batch_size`** (int): Number of states to fetch per poll. Defaults to 16. +- **`workers`** (int): Number of concurrent worker tasks. Defaults to 4. +- **`state_manager_version`** (str): State manager API version. Defaults to "v0". +- **`poll_interval`** (int): Seconds between polling for new states. Defaults to 1. + +## Environment Configuration + +Create a `.env` file in your project root: + +```bash +EXOSPHERE_URI=https://your-state-manager.exosphere.host +EXOSPHERE_KEY=your-api-key +``` + +Then load it in your code: + +```python +from dotenv import load_dotenv +load_dotenv() + +from exospherehost import Runtime, BaseNode + +# Your runtime code here... +``` + +## Runtime Lifecycle + +### 1. Initialization + +The runtime validates configuration and node classes: + +```python +runtime = Runtime( + namespace="MyProject", + name="MyRuntime", + nodes=[MyNode] +) +``` + +### 2. Registration + +Nodes are automatically registered with the state manager when the runtime starts: + +```python +# This happens automatically when you call start() +await runtime._register() +``` + +### 3. Execution + +The runtime starts polling for states and executing nodes: + +```python +runtime.start() +``` + +## Multiple Nodes + +You can register multiple nodes in a single runtime: + +```python hl_lines="10-16" +from exospherehost import Runtime, BaseNode +from pydantic import BaseModel + +class DataProcessorNode(BaseNode): + ... + +class DataValidatorNode(BaseNode): + ... + +# Register both nodes +Runtime( + namespace="MyProject", + name="DataPipeline", + nodes=[DataProcessorNode, DataValidatorNode] +).start() + +``` + +## Runtime Configuration Best Practices + +### Batch Size and Workers + +Choose appropriate values based on your workload: + +```python hl_lines="4 13" +# For CPU-intensive tasks +Runtime( + namespace="MyProject", + name="CPU", + nodes=[MyNode], + batch_size=8, # Smaller batches + workers=2 # Fewer workers +).start() + +# For GPU-intensive tasks +Runtime( + namespace="MyProject", + name="GPU", + nodes=[MyNode], + batch_size=32, # Larger batches + workers=16 # More workers +).start() +``` + +### Poll Interval + +Adjust based on your latency requirements: + +```python hl_lines="6 14" +# For real-time processing +Runtime( + namespace="MyProject", + name="RealTime", + nodes=[MyNode], + poll_interval=1 # Poll every second +).start() + +# For batch processing +Runtime( + namespace="MyProject", + name="Batch", + nodes=[MyNode], + poll_interval=10 # Poll every 10 seconds +).start() +``` + +## Logging + +The runtime provides built-in logging: + +```python +import logging + +# Configure logging level +logging.basicConfig(level=logging.INFO) + +# The runtime will log: +# - Node registration +# - State polling +# - Execution results +# - Errors and retries +``` + +## Production Deployment + +### Docker Deployment + +```dockerfile +FROM python:3.12-slim + +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . . +CMD ["python", "main.py"] +``` + +### Kubernetes Deployment + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: exosphere-runtime +spec: + replicas: 3 + selector: + matchLabels: + app: exosphere-runtime + template: + metadata: + labels: + app: exosphere-runtime + spec: + containers: + - name: runtime + image: your-registry/exosphere-runtime:latest + env: + - name: EXOSPHERE_URI + value: "https://your-state-manager.exosphere.host" + - name: EXOSPHERE_KEY + valueFrom: + secretKeyRef: + name: exosphere-secrets + key: api-key +``` + +## Monitoring + +Monitor your runtime using the Exosphere dashboard: + +- **Node Status**: View registered nodes and their health +- **Execution Metrics**: Monitor throughput and error rates +- **State Management**: Track state transitions and completion +- **Error Logs**: Debug failed executions + +## Next Steps + +- **[Register Node](./register-node.md)** - Learn how to create custom nodes +- **[Create Graph](./create-graph.md)** - Build workflows by connecting nodes +- **[Trigger Graph](./trigger-graph.md)** - Execute and monitor workflows diff --git a/docs/docs/exosphere/dashboard.md b/docs/docs/exosphere/dashboard.md new file mode 100644 index 00000000..f2a840ce --- /dev/null +++ b/docs/docs/exosphere/dashboard.md @@ -0,0 +1,189 @@ +# Exosphere Dashboard + +The Exosphere dashboard provides a comprehensive web interface for monitoring, debugging, and managing your workflows. This guide shows you how to access and use the dashboard effectively. + +## Dashboard Overview + +The Exosphere dashboard is a separate frontend application that connects to your state manager backend and provides: + +- **Real-time monitoring** of workflow execution +- **Visual graph representation** of your workflows +- **State management** and debugging tools +- **Performance metrics** and analytics +- **Error tracking** and resolution + +## Running the Dashboard + +There are currently two ways to run the Exosphere dashboard frontend: + +### Option 1: Docker Container (Recommended) + +The easiest way to run the dashboard is using the pre-built Docker container: + +```bash +docker run -p 3000:3000 ghcr.io/exospherehost/exosphere-dashboard:latest +``` + +This will start the dashboard and make it available at: +- **Local**: http://localhost:3000 +- **Network**: http://0.0.0.0:3000 + +The container will automatically start and be ready in a few seconds. + +### Option 2: Local Development + +For development or customization, you can run the dashboard locally: + +```bash +# Clone the state-manager-frontend repository +git clone +cd state-manager-frontend + +# Install dependencies +npm install + +# Set up environment variables +cp .env.example .env +# Edit .env with your configuration + +# Start the development server +npm run dev +``` + +The dashboard will be available at `http://localhost:3000` + +### Option 3: Web Portal (Coming Soon) + +A third option will be available soon - a hosted web portal where you can view your running states in production without needing to run anything locally. + +## Dashboard Features + +The Exosphere dashboard provides the following key features: + +### 1. Graph Templates Management + +- **View all graph templates** in your namespace +- **Visual graph representation** with node connections +- **Graph validation** and status checking +- **Template editing** capabilities + +### 2. Registered Nodes Monitoring + +- **List all registered nodes** in your namespace +- **Node health status** and availability +- **Node schemas** (inputs, outputs, secrets) +- **Node performance** metrics + +### 3. Execution Monitoring + +- **Real-time workflow execution** tracking +- **State transitions** visualization +- **Execution progress** indicators +- **Run history** and status + +### 4. State Management + +- **Current states** for active runs +- **State history** for completed runs +- **Error details** and debugging information +- **State retry** capabilities + +### 5. API Integration + +- **REST API endpoints** for programmatic access +- **Authentication** via API keys +- **Real-time updates** via WebSocket connections + +## Connecting to Your State Manager + +The dashboard connects to your state manager backend. Make sure your state manager is running and accessible: + +> **Note**: For detailed setup instructions, see **[State Manager Setup](./state-manager-setup.md)**. + +### Local State Manager + +```bash +# Start the state manager +cd state-manager +python run.py +``` + +The state manager will be available at `http://localhost:8000` + +### Production State Manager + +In production, your state manager is typically available at: +`https://your-state-manager.exosphere.host` + +## Configuration + +### Environment Variables + +Configure the dashboard by setting these environment variables: + +```bash +# State manager API endpoint +NEXT_PUBLIC_STATE_MANAGER_URL=http://localhost:8000 + +# API key for authentication +NEXT_PUBLIC_API_KEY=your-api-key + +# Namespace +NEXT_PUBLIC_NAMESPACE=your-namespace + +# Other configuration options +NEXT_PUBLIC_REFRESH_INTERVAL=5000 +NEXT_PUBLIC_ENABLE_WEBSOCKET=true +``` + +### API Key Authentication + +The dashboard uses the same API key authentication as the state manager: + +```bash +# Set your API key +export EXOSPHERE_KEY="your-api-key" +``` + +## Using the Dashboard + +### Viewing Graph Templates + +1. Navigate to the **Graphs** section +2. Select a graph template to view its details +3. The visual representation shows: + - Nodes as connected boxes + - Data flow direction with arrows + - Triggers as entry points + - Node relationships and dependencies + +### Monitoring Execution + +1. Go to the **Executions** section +2. Find your active run by run ID or search criteria +3. View the execution status: + - **Pending**: States waiting to be executed + - **Running**: Currently executing states + - **Completed**: Successfully executed states + - **Failed**: States that encountered errors + +### Debugging Failed Executions + +1. Identify failed states in the execution view +2. Click on a failed state to view details: + - **Error message** and stack trace + - **Input data** that caused the failure + - **Node configuration** and secrets used + - **Execution logs** and timestamps + +3. Use the debugging tools: + - **Retry state** with the same inputs + - **Modify inputs** and retry + - **View related states** in the workflow + + +## Next Steps + +- **[Examples](./examples.md)** - See real-world dashboard usage examples +- **[Concepts](./concepts.md)** - Learn about fanout, units, inputs, outputs, and secrets +- **[API Reference](./api-reference.md)** - Complete API documentation diff --git a/docs/docs/exosphere/examples.md b/docs/docs/exosphere/examples.md new file mode 100644 index 00000000..2396ee9a --- /dev/null +++ b/docs/docs/exosphere/examples.md @@ -0,0 +1,765 @@ +# Examples + +This section provides real-world examples of Exosphere workflows and nodes. These examples demonstrate common patterns and use cases for building distributed AI workflows. + +## Document Processing Examples + +### Parse List of Documents + +A comprehensive document processing pipeline that handles multiple document types and formats. + +#### Node Structure + +```python +from exospherehost import BaseNode +from pydantic import BaseModel +import json + +class DocumentParserNode(BaseNode): + class Inputs(BaseModel): + document_url: str + document_type: str + processing_config: str # JSON string + + class Outputs(BaseModel): + parsed_content: str # JSON string + metadata: str # JSON string + status: str + + class Secrets(BaseModel): + api_key: str + storage_bucket: str + + async def execute(self) -> Outputs: + config = json.loads(self.inputs.processing_config) + + # Parse document based on type + if self.inputs.document_type == "pdf": + content = await self._parse_pdf(self.inputs.document_url) + elif self.inputs.document_type == "docx": + content = await self._parse_docx(self.inputs.document_url) + else: + content = await self._parse_text(self.inputs.document_url) + + # Extract metadata + metadata = { + "document_type": self.inputs.document_type, + "file_size": len(content), + "processing_config": config + } + + return self.Outputs( + parsed_content=json.dumps(content), + metadata=json.dumps(metadata), + status="success" + ) + + async def _parse_pdf(self, url): + # PDF parsing logic + pass + + async def _parse_docx(self, url): + # DOCX parsing logic + pass + + async def _parse_text(self, url): + # Text parsing logic + pass +``` + +#### Graph Template + +```json +{ + "name": "document-processing-pipeline", + "description": "Process and parse multiple document types", + "nodes": [ + { + "id": "document-loader", + "name": "DocumentLoaderNode", + "namespace": "exospherehost" + }, + { + "id": "document-parser", + "name": "DocumentParserNode", + "namespace": "exospherehost" + }, + { + "id": "content-analyzer", + "name": "ContentAnalyzerNode", + "namespace": "exospherehost" + }, + { + "id": "result-storer", + "name": "ResultStorerNode", + "namespace": "exospherehost" + } + ], + "connections": [ + { + "from": "document-loader", + "to": "document-parser", + "mapping": { + "document_url": "document_url", + "document_type": "document_type" + } + }, + { + "from": "document-parser", + "to": "content-analyzer", + "mapping": { + "parsed_content": "content" + } + }, + { + "from": "content-analyzer", + "to": "result-storer", + "mapping": { + "analysis_result": "result" + } + } + ], + "triggers": [ + { + "id": "process-documents", + "node": "document-loader" + } + ], + "secrets": [ + "api_key", + "storage_bucket" + ] +} +``` + +#### Triggering the Pipeline + +```python +from exospherehost import StateManager, TriggerState +import json + +async def process_documents(): + state_manager = StateManager( + namespace="exospherehost", + state_manager_uri="https://your-state-manager.exosphere.host", + key="your-api-key" + ) + + # Document processing configuration + config = { + "ocr_enabled": True, + "language": "en", + "extract_tables": True, + "extract_images": False + } + + # Create trigger state + trigger_state = TriggerState( + identifier="process-documents", + inputs={ + "document_url": "https://example.com/document.pdf", + "document_type": "pdf", + "processing_config": json.dumps(config) + } + ) + + # Trigger the pipeline + result = await state_manager.trigger("document-processing-pipeline", state=trigger_state) + return result +``` + +## Cloud Storage Examples + +### S3 File Processing + +A cloud storage runtime that processes files from S3 buckets. + +#### List S3 Files Node + +```python +import boto3 +from exospherehost import BaseNode +from pydantic import BaseModel + +class ListS3FilesNode(BaseNode): + class Inputs(BaseModel): + bucket_name: str + prefix: str = "" + files_only: str = "true" + recursive: str = "false" + + class Outputs(BaseModel): + file_keys: str # JSON string of file keys + + class Secrets(BaseModel): + aws_access_key_id: str + aws_secret_access_key: str + aws_region: str + + async def execute(self) -> Outputs: + s3_client = boto3.client( + 's3', + aws_access_key_id=self.secrets.aws_access_key_id, + aws_secret_access_key=self.secrets.aws_secret_access_key, + region_name=self.secrets.aws_region + ) + + response = s3_client.list_objects_v2( + Bucket=self.inputs.bucket_name, + Prefix=self.inputs.prefix + ) + + file_keys = [] + for obj in response.get('Contents', []): + if self.inputs.files_only == "true": + if not obj['Key'].endswith('/'): + file_keys.append(obj['Key']) + else: + file_keys.append(obj['Key']) + + return self.Outputs(file_keys=json.dumps(file_keys)) +``` + +#### Download S3 File Node + +```python +import boto3 +import tempfile +import os +from exospherehost import BaseNode +from pydantic import BaseModel + +class DownloadS3FileNode(BaseNode): + class Inputs(BaseModel): + bucket_name: str + file_key: str + local_path: str = "" + + class Outputs(BaseModel): + local_file_path: str + file_size: str + download_status: str + + class Secrets(BaseModel): + aws_access_key_id: str + aws_secret_access_key: str + aws_region: str + + async def execute(self) -> Outputs: + s3_client = boto3.client( + 's3', + aws_access_key_id=self.secrets.aws_access_key_id, + aws_secret_access_key=self.secrets.aws_secret_access_key, + region_name=self.secrets.aws_region + ) + + # Determine local path + if not self.inputs.local_path: + temp_dir = tempfile.gettempdir() + filename = os.path.basename(self.inputs.file_key) + local_path = os.path.join(temp_dir, filename) + else: + local_path = self.inputs.local_path + + try: + # Download file + s3_client.download_file( + self.inputs.bucket_name, + self.inputs.file_key, + local_path + ) + + # Get file size + file_size = os.path.getsize(local_path) + + return self.Outputs( + local_file_path=local_path, + file_size=str(file_size), + download_status="success" + ) + + except Exception as e: + return self.Outputs( + local_file_path="", + file_size="0", + download_status=f"error: {str(e)}" + ) +``` + +#### Cloud Storage Runtime + +```python +from exospherehost import Runtime +from nodes.list_s3_files import ListS3FilesNode +from nodes.download_s3_file import DownloadS3FileNode + +# Initialize the cloud storage runtime +Runtime( + name="cloud-storage-runtime", + namespace="exospherehost", + nodes=[ListS3FilesNode, DownloadS3FileNode] +).start() +``` + +#### S3 Processing Graph + +```json +{ + "name": "s3-file-processing", + "description": "Process files from S3 bucket", + "nodes": [ + { + "id": "file-lister", + "name": "ListS3FilesNode", + "namespace": "exospherehost" + }, + { + "id": "file-downloader", + "name": "DownloadS3FileNode", + "namespace": "exospherehost" + }, + { + "id": "file-processor", + "name": "FileProcessorNode", + "namespace": "exospherehost" + } + ], + "connections": [ + { + "from": "file-lister", + "to": "file-downloader", + "mapping": { + "file_keys": "file_key" + } + }, + { + "from": "file-downloader", + "to": "file-processor", + "mapping": { + "local_file_path": "input_file" + } + } + ], + "triggers": [ + { + "id": "process-s3-files", + "node": "file-lister" + } + ], + "secrets": [ + "aws_access_key_id", + "aws_secret_access_key", + "aws_region" + ] +} +``` + +## Data Processing Examples + +### Batch Data Processing + +A scalable batch processing pipeline for large datasets. + +#### Data Splitter Node + +```python +import json +from exospherehost import BaseNode +from pydantic import BaseModel + +class DataSplitterNode(BaseNode): + class Inputs(BaseModel): + data: str # JSON string of data array + batch_size: str = "1000" + + class Outputs(BaseModel): + batch_data: str # JSON string of batch data + + class Secrets(BaseModel): + pass + + async def execute(self) -> list[Outputs]: + data = json.loads(self.inputs.data) + batch_size = int(self.inputs.batch_size) + + outputs = [] + for i in range(0, len(data), batch_size): + batch = data[i:i + batch_size] + outputs.append(self.Outputs( + batch_data=json.dumps(batch) + )) + + return outputs +``` + +#### Data Processor Node + +```python +import json +from exospherehost import BaseNode +from pydantic import BaseModel + +class DataProcessorNode(BaseNode): + class Inputs(BaseModel): + batch_data: str # JSON string + processing_config: str # JSON string + + class Outputs(BaseModel): + processed_data: str # JSON string + processing_stats: str # JSON string + + class Secrets(BaseModel): + api_key: str + + async def execute(self) -> Outputs: + data = json.loads(self.inputs.batch_data) + config = json.loads(self.inputs.processing_config) + + # Process the data + processed_items = [] + for item in data: + processed_item = await self._process_item(item, config) + processed_items.append(processed_item) + + # Calculate statistics + stats = { + "input_count": len(data), + "output_count": len(processed_items), + "processing_time": "calculated_time" + } + + return self.Outputs( + processed_data=json.dumps(processed_items), + processing_stats=json.dumps(stats) + ) + + async def _process_item(self, item, config): + # Item processing logic + return {"processed": item, "config": config} +``` + +#### Result Merger Node + +```python +import json +from exospherehost import BaseNode +from pydantic import BaseModel + +class ResultMergerNode(BaseNode): + class Inputs(BaseModel): + processed_data: str # JSON string + batch_id: str + + class Outputs(BaseModel): + merged_results: str # JSON string + total_count: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> Outputs: + data = json.loads(self.inputs.processed_data) + + # Merge results (in a real scenario, this would aggregate from multiple batches) + merged_results = data + + return self.Outputs( + merged_results=json.dumps(merged_results), + total_count=str(len(merged_results)) + ) +``` + +## API Integration Examples + +### External API Processing + +A node that integrates with external APIs for data enrichment. + +#### API Integration Node + +```python +import httpx +import json +from exospherehost import BaseNode +from pydantic import BaseModel + +class APIEnrichmentNode(BaseNode): + class Inputs(BaseModel): + user_data: str # JSON string + enrichment_type: str + + class Outputs(BaseModel): + enriched_data: str # JSON string + api_response: str # JSON string + + class Secrets(BaseModel): + api_key: str + api_endpoint: str + + async def execute(self) -> Outputs: + user_data = json.loads(self.inputs.user_data) + + headers = { + "Authorization": f"Bearer {self.secrets.api_key}", + "Content-Type": "application/json" + } + + async with httpx.AsyncClient() as client: + response = await client.post( + f"{self.secrets.api_endpoint}/enrich", + headers=headers, + json={ + "data": user_data, + "type": self.inputs.enrichment_type + } + ) + + if response.status_code == 200: + enriched_data = response.json() + return self.Outputs( + enriched_data=json.dumps(enriched_data), + api_response=json.dumps({"status": "success"}) + ) + else: + return self.Outputs( + enriched_data=json.dumps(user_data), + api_response=json.dumps({"status": "error", "code": response.status_code}) + ) +``` + +## Machine Learning Examples + +### Model Inference Node + +A node for running machine learning model inference. + +#### ML Inference Node + +```python +import json +import numpy as np +from exospherehost import BaseNode +from pydantic import BaseModel + +class MLInferenceNode(BaseNode): + class Inputs(BaseModel): + input_data: str # JSON string + model_name: str + + class Outputs(BaseModel): + predictions: str # JSON string + confidence_scores: str # JSON string + + class Secrets(BaseModel): + model_path: str + model_config: str # JSON string + + async def execute(self) -> Outputs: + input_data = json.loads(self.inputs.input_data) + model_config = json.loads(self.secrets.model_config) + + # Load model (in practice, you'd load this once and cache it) + model = await self._load_model(self.secrets.model_path) + + # Preprocess input + processed_input = self._preprocess_input(input_data, model_config) + + # Run inference + predictions = await self._run_inference(model, processed_input) + + # Postprocess results + confidence_scores = self._calculate_confidence(predictions) + + return self.Outputs( + predictions=json.dumps(predictions.tolist()), + confidence_scores=json.dumps(confidence_scores.tolist()) + ) + + async def _load_model(self, model_path): + # Model loading logic + pass + + def _preprocess_input(self, data, config): + # Preprocessing logic + pass + + async def _run_inference(self, model, input_data): + # Inference logic + pass + + def _calculate_confidence(self, predictions): + # Confidence calculation + pass +``` + +## Error Handling Examples + +### Robust Error Handling Node + +A node that demonstrates comprehensive error handling patterns. + +#### Error Handler Node + +```python +import json +import traceback +from exospherehost import BaseNode +from pydantic import BaseModel + +class RobustProcessingNode(BaseNode): + class Inputs(BaseModel): + data: str + retry_count: str = "0" + + class Outputs(BaseModel): + result: str + error: str + retry_count: str + + class Secrets(BaseModel): + max_retries: str = "3" + + async def execute(self) -> Outputs: + current_retry = int(self.inputs.retry_count) + max_retries = int(self.secrets.max_retries) + + try: + # Attempt processing + result = await self._process_data(self.inputs.data) + + return self.Outputs( + result=result, + error="", + retry_count=str(current_retry) + ) + + except ValueError as e: + # Validation error - don't retry + return self.Outputs( + result="", + error=f"validation_error: {str(e)}", + retry_count=str(current_retry) + ) + + except Exception as e: + # Processing error - retry if possible + if current_retry < max_retries: + # This will trigger a retry with incremented count + raise Exception(f"retry_attempt_{current_retry + 1}: {str(e)}") + else: + return self.Outputs( + result="", + error=f"max_retries_exceeded: {str(e)}", + retry_count=str(current_retry) + ) + + async def _process_data(self, data): + # Processing logic that might fail + if not data: + raise ValueError("Data cannot be empty") + + # Simulate processing + return f"processed: {data}" +``` + +## Monitoring and Logging Examples + +### Logging Node + +A node that demonstrates proper logging and monitoring. + +#### Logger Node + +```python +import json +import logging +from datetime import datetime +from exospherehost import BaseNode +from pydantic import BaseModel + +class LoggingNode(BaseNode): + class Inputs(BaseModel): + message: str + log_level: str = "INFO" + metadata: str = "{}" # JSON string + + class Outputs(BaseModel): + log_entry: str # JSON string + timestamp: str + + class Secrets(BaseModel): + log_endpoint: str + log_api_key: str + + async def execute(self) -> Outputs: + metadata = json.loads(self.inputs.metadata) + timestamp = datetime.now().isoformat() + + log_entry = { + "message": self.inputs.message, + "level": self.inputs.log_level, + "timestamp": timestamp, + "metadata": metadata, + "node_id": "LoggingNode" + } + + # Send to external logging service + await self._send_log(log_entry) + + return self.Outputs( + log_entry=json.dumps(log_entry), + timestamp=timestamp + ) + + async def _send_log(self, log_entry): + # Send log to external service + async with httpx.AsyncClient() as client: + await client.post( + self.secrets.log_endpoint, + headers={"Authorization": f"Bearer {self.secrets.log_api_key}"}, + json=log_entry + ) +``` + +## Best Practices Summary + +### 1. Error Handling + +- Always handle exceptions gracefully +- Provide meaningful error messages +- Implement retry logic for transient failures +- Use appropriate error types for different scenarios + +### 2. Data Validation + +- Validate inputs at the node level +- Use Pydantic for schema validation +- Handle edge cases and invalid data +- Provide clear error messages for validation failures + +### 3. Performance + +- Use async/await for I/O operations +- Implement proper resource cleanup +- Consider batching for large datasets +- Monitor and optimize execution time + +### 4. Security + +- Never log sensitive data +- Use secrets for API keys and credentials +- Validate and sanitize inputs +- Implement proper authentication + +### 5. Monitoring + +- Log important events and errors +- Track execution metrics +- Implement health checks +- Use structured logging + +## Next Steps + +- **[Concepts](./concepts.md)** - Learn about fanout, units, inputs, outputs, and secrets +- **[API Reference](./api-reference.md)** - Complete API documentation +- **[Tutorials](./tutorials.md)** - Step-by-step tutorials for common use cases diff --git a/docs/docs/exosphere/examples/node-examples/basic-nodes.md b/docs/docs/exosphere/examples/node-examples/basic-nodes.md new file mode 100644 index 00000000..68648578 --- /dev/null +++ b/docs/docs/exosphere/examples/node-examples/basic-nodes.md @@ -0,0 +1,192 @@ +# Basic Node Examples + +This section contains basic node implementation examples that demonstrate fundamental patterns for creating Exosphere nodes. + +## Simple Data Processing Node + +A basic node that performs simple text operations. + +```python +from exospherehost import BaseNode +from pydantic import BaseModel + +class DataProcessorNode(BaseNode): + class Inputs(BaseModel): + text: str + operation: str + + class Outputs(BaseModel): + result: str + status: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> Outputs: + if self.inputs.operation == "uppercase": + result = self.inputs.text.upper() + elif self.inputs.operation == "lowercase": + result = self.inputs.text.lower() + else: + return self.Outputs( + result="", + status="error: unknown operation" + ) + + return self.Outputs( + result=result, + status="success" + ) +``` + +## Complex Data Processing Node + +A node that handles complex data using JSON serialization. + +```python +import json +from exospherehost import BaseNode +from pydantic import BaseModel + +class ComplexDataNode(BaseNode): + class Inputs(BaseModel): + config: str # JSON string + data_list: str # JSON string + + class Outputs(BaseModel): + result: str + metadata: str # JSON string + + class Secrets(BaseModel): + api_key: str + + async def execute(self) -> Outputs: + # Parse JSON inputs + config = json.loads(self.inputs.config) + data_list = json.loads(self.inputs.data_list) + + # Process data + results = [] + for item in data_list: + processed = process_item(item, config) + results.append(processed) + + # Return JSON outputs + return self.Outputs( + result=json.dumps(results), + metadata=json.dumps({ + "processed_count": len(results), + "config_used": config + }) + ) +``` + +## Multi-Output Node + +A node that returns multiple outputs by returning a list. + +```python +from exospherehost import BaseNode +from pydantic import BaseModel + +class MultiOutputNode(BaseNode): + class Inputs(BaseModel): + data: str + + class Outputs(BaseModel): + processed_data: str + status: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> list[Outputs]: + # Process data and create multiple outputs + outputs = [] + + # Split data and process each part + parts = self.inputs.data.split(',') + + for i, part in enumerate(parts): + processed = part.strip().upper() + outputs.append(self.Outputs( + processed_data=processed, + status=f"processed_part_{i}" + )) + + return outputs +``` + +## Error Handling Node + +A node that demonstrates robust error handling patterns. + +```python +from exospherehost import BaseNode +from pydantic import BaseModel + +class RobustNode(BaseNode): + class Inputs(BaseModel): + data: str + + class Outputs(BaseModel): + result: str + error: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> Outputs: + try: + # Your processing logic + result = process_data(self.inputs.data) + return self.Outputs( + result=result, + error="" + ) + except ValueError as e: + return self.Outputs( + result="", + error=f"validation_error: {str(e)}" + ) + except Exception as e: + return self.Outputs( + result="", + error=f"processing_error: {str(e)}" + ) +``` + +## Testing Node + +A simple node for testing purposes. + +```python +import asyncio +from exospherehost import BaseNode +from pydantic import BaseModel + +class TestNode(BaseNode): + class Inputs(BaseModel): + data: str + + class Outputs(BaseModel): + result: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> Outputs: + return self.Outputs(result=f"processed: {self.inputs.data}") + +# Test the node +async def test_node(): + node = TestNode() + inputs = TestNode.Inputs(data="test data") + secrets = TestNode.Secrets() + + outputs = await node._execute(inputs, secrets) + print(f"Output: {outputs.result}") + +# Run the test +asyncio.run(test_node()) +``` diff --git a/docs/docs/exosphere/examples/node-examples/index.md b/docs/docs/exosphere/examples/node-examples/index.md new file mode 100644 index 00000000..3a5c078e --- /dev/null +++ b/docs/docs/exosphere/examples/node-examples/index.md @@ -0,0 +1,38 @@ +# Node Examples + +This section provides comprehensive examples of Exosphere node implementations, organized by category and complexity level. + +## Overview + +Node examples are organized into the following categories: + +- **[Nodes](./basic-nodes.md)** - Fundamental patterns and simple node implementations +- **[Integration](./integration-nodes.md)** - Nodes that integrate with external services and systems + +## Basic Node Examples + +The [Nodes](./basic-nodes.md) section includes: + +- **Simple Data Processing Node** - Basic text operations (uppercase, lowercase) +- **Complex Data Processing Node** - JSON serialization for complex data +- **Multi-Output Node** - Nodes that return multiple outputs +- **Error Handling Node** - Robust error handling patterns +- **Testing Node** - Simple node for testing purposes + +## Integration Node Examples + +The [Integration](./integration-nodes.md) section includes: + +- **API Integration Node** - HTTP requests to external APIs +- **Database Operations Node** - Database queries using asyncpg +- **File Operations Node** - File system operations using aiofiles +- **Cloud Storage Node** - AWS S3 integration +- **Email Integration Node** - SMTP email sending + +## Next Steps + +After reviewing these examples: + +- **[Register Node](../register-node.md)** - Learn how to create and register your own nodes +- **[Create Graph](../create-graph.md)** - Connect nodes into workflows +- **[Examples](../examples.md)** - See complete workflow examples diff --git a/docs/docs/exosphere/getting-started.md b/docs/docs/exosphere/getting-started.md new file mode 100644 index 00000000..4bff078f --- /dev/null +++ b/docs/docs/exosphere/getting-started.md @@ -0,0 +1,148 @@ +# Getting Started + +## Installation + +### Quick Install + +```bash +uv add exospherehost +``` + +## Environment Setup + +Set up your environment variables for authentication: +=== ".env File" + + ```bash + EXOSPHERE_URI=your-state-manager-uri + EXOSPHERE_KEY=your-api-key + ``` +=== "Environment Variables" + + ```bash + export EXOSPHERE_URI="your-state-manager-uri" + export EXOSPHERE_KEY="your-api-key" + ``` + + +## Overview + +Exosphere is built around three core concepts: + +### 1. Nodes + +Nodes are the building blocks of your workflows. Each node: + +- Defines input/output schemas using Pydantic models +- Implements an `execute` method for processing logic +- Can be connected to other nodes to form workflows +- Automatically handles state persistence + +### 2. Runtime + +The `Runtime` class manages the execution environment and coordinates with the ExosphereHost state manager. It handles: + +- Node lifecycle management +- State coordination +- Error handling and recovery +- Resource allocation + +### 3. State Manager + +The state manager orchestrates workflow execution, manages state transitions, and provides the dashboard for monitoring and debugging. + +## Quick Start Example + +Create a simple node that processes data: + +```python +from exospherehost import Runtime, BaseNode +from pydantic import BaseModel + +class SampleNode(BaseNode): + class Inputs(BaseModel): + name: str + data: str + + class Outputs(BaseModel): + message: str + processed_data: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> Outputs: + print(f"Processing data for: {self.inputs.name}") + processed_data = f"completed:{self.inputs.data}" + return self.Outputs( + message="success", + processed_data=processed_data + ) + +# Initialize the runtime +Runtime( + namespace="MyProject", + name="DataProcessor", + nodes=[SampleNode] +).start() +``` + +## Next Steps + +Now that you have the basics, explore: + +- **[Register Node](./register-node.md)** - Understand how to create and register custom nodes +- **[Create Runtime](./create-runtime.md)** - Learn how to set up and configure your runtime +- **[Create Graph](./create-graph.md)** - Build workflows by connecting nodes together +- **[Trigger Graph](./trigger-graph.md)** - Execute your workflows and monitor their progress + +## Key Features + +- **Distributed Execution**: Run nodes across multiple compute resources +- **State Management**: Automatic state persistence and recovery +- **Type Safety**: Full Pydantic integration for input/output validation +- **String-only data model (v1)**: All `Inputs`, `Outputs`, and `Secrets` fields are strings +- **Async Support**: Native async/await support for high-performance operations +- **Error Handling**: Built-in retry mechanisms and error recovery +- **Scalability**: Designed for high-volume batch processing and workflows + +## Architecture + +``` +┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ +│ Your Nodes │ │ Runtime │ │ State Manager │ +│ │◄──►│ │◄──►│ │ +│ - Inputs │ │ - Registration │ │ - Orchestration │ +│ - Outputs │ │ - Execution │ │ - State Mgmt │ +│ - Secrets │ │ - Error Handling │ │ - Dashboard │ +└─────────────────┘ └──────────────────┘ └─────────────────┘ +``` + +## Data Model (v1) + +**Important**: In v1, all fields in `Inputs`, `Outputs`, and `Secrets` must be strings. If you need to pass complex data (e.g., JSON), serialize the data to a string first, then parse that string within your node. + +```python +class MyNode(BaseNode): + class Inputs(BaseModel): + # ✅ Correct - string fields + user_id: str + config: str # JSON string + + class Outputs(BaseModel): + # ✅ Correct - string fields + result: str + metadata: str # JSON string + + class Secrets(BaseModel): + # ✅ Correct - string fields + api_key: str + database_url: str +``` + +## Support + +For support and questions: +- **Email**: [nivedit@exosphere.host](mailto:nivedit@exosphere.host) +- **Documentation**: [https://docs.exosphere.host](https://docs.exosphere.host) +- **GitHub Issues**: [https://github.com/exospherehost/exospherehost/issues](https://github.com/exospherehost/exospherehost/issues) diff --git a/docs/docs/exosphere/index.md b/docs/docs/exosphere/index.md new file mode 100644 index 00000000..f79e5776 --- /dev/null +++ b/docs/docs/exosphere/index.md @@ -0,0 +1,128 @@ +# Exosphere + +Exosphere is a modern, fast (high-performance), open-source infrastructure layer for building distributed AI workflows and agents with Python based on a node-based architecture. + +--- + +**Documentation**: [https://docs.exosphere.host](https://docs.exosphere.host) + +**Source Code**: [https://github.com/exospherehost/exospherehost](https://github.com/exospherehost/exospherehost) + +--- + +## Requirements + +Python 3.12+ + +## Installation + +```bash +uv add exospherehost +``` + +## Example + +### Create it + +Create a file `main.py` with: + +```python +from exospherehost import Runtime, BaseNode +from pydantic import BaseModel + +class HelloWorldNode(BaseNode): + class Inputs(BaseModel): + name: str + + class Outputs(BaseModel): + message: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> Outputs: + return self.Outputs( + message=f"Hello, {self.inputs.name}!" + ) + +# Initialize the runtime +Runtime( + namespace="MyProject", + name="HelloWorld", + nodes=[HelloWorldNode] +).start() +``` + +### Run it + +Run the server with: + +```bash +uv run main.py +``` + +### Check it + +Your runtime is now running and ready to process workflows! + +### Interactive Dashboard + +Now go to your Exosphere dashboard to: + +* View your registered nodes +* Create and manage graph templates +* Trigger workflows +* Monitor execution states +* Debug and troubleshoot + +## Example upgrade + +Now modify the file `main.py` to add more complex processing: + +```python +from exospherehost import Runtime, BaseNode +from pydantic import BaseModel +import json + +class DataProcessorNode(BaseNode): + class Inputs(BaseModel): + data: str + operation: str + + class Outputs(BaseModel): + result: str + status: str + + class Secrets(BaseModel): + api_key: str + + async def execute(self) -> Outputs: + # Parse the input data + try: + data = json.loads(self.inputs.data) + except: + return self.Outputs( + result="", + status="error: invalid json" + ) + + # Process based on operation + if self.inputs.operation == "transform": + result = {"transformed": data, "processed": True} + else: + result = {"original": data, "processed": False} + + return self.Outputs( + result=json.dumps(result), + status="success" + ) + +# Initialize the runtime +Runtime( + namespace="MyProject", + name="DataProcessor", + nodes=[DataProcessorNode] +).start() +``` + +The runtime will automatically reload and register the updated node. diff --git a/docs/docs/exosphere/register-node.md b/docs/docs/exosphere/register-node.md new file mode 100644 index 00000000..941b58b3 --- /dev/null +++ b/docs/docs/exosphere/register-node.md @@ -0,0 +1,159 @@ +# Register Node + +Nodes are the building blocks of Exosphere workflows. Each node defines a specific piece of processing logic with typed inputs, outputs, and secrets. This guide shows you how to create and register custom nodes. + +## Node Structure + +Every node inherits from `BaseNode` and defines three key components: + +```python +from exospherehost import BaseNode +from pydantic import BaseModel + +class MyNode(BaseNode): + class Inputs(BaseModel): + # Define your input fields here + pass + + class Outputs(BaseModel): + # Define your output fields here + pass + + class Secrets(BaseModel): + # Define your secret fields here + pass + + async def execute(self) -> Outputs: + # Implement your processing logic here + pass +``` + +### Inputs + +Define the data your node expects to receive: + +```python +class Inputs(BaseModel): + user_id: str + data: str + config: str # JSON string for complex configuration + batch_size: str = "100" # Default value +``` + +### Outputs + +Define the data your node produces: + +```python +class Outputs(BaseModel): + processed_data: str + metadata: str # JSON string for complex metadata + status: str + count: str +``` + +### Secrets + +Define sensitive configuration data your node needs: + +```python +class Secrets(BaseModel): + api_key: str + database_url: str + encryption_key: str +``` + +## Examples + +For node implementation examples, see the **[Node Implementation Examples](./examples/node-examples/index.md)** section, which includes: + +- **[Nodes](./examples/node-examples/basic-nodes.md)** - Fundamental patterns and simple node implementations +- **[Integration](./examples/node-examples/integration-nodes.md)** - Nodes that integrate with external services and systems + +These examples demonstrate common patterns, best practices, and real-world use cases for creating Exosphere nodes. + +## Node Validation + +The runtime automatically validates your nodes: + +```python hl_lines="19" +# ✅ Valid node +class ValidNode(BaseNode): + class Inputs(BaseModel): + data: str # All fields must be strings + + class Outputs(BaseModel): + result: str # All fields must be strings + + class Secrets(BaseModel): + api_key: str # All fields must be strings + + async def execute(self) -> Outputs: + return self.Outputs(result="success") + +# ❌ Invalid node - non-string fields +class InvalidNode(BaseNode): + class Inputs(BaseModel): + data: str + count: int # Error: must be str + + class Outputs(BaseModel): + result: str + + class Secrets(BaseModel): + pass + + async def execute(self) -> Outputs: + return self.Outputs(result="success") +``` + +## Node Registration + +Nodes are automatically registered when you start your runtime: + +```python hl_lines="14" +from exospherehost import Runtime + +# Create your nodes +class Node1(BaseNode): + # ... node implementation + +class Node2(BaseNode): + # ... node implementation + +# Register nodes with runtime +Runtime( + namespace="MyProject", + name="MyRuntime", + nodes=[Node1, Node2] # Both nodes will be registered +).start() +``` + +## Node Naming and Organization + +### Namespace Organization + +Organise nodes to a namespace to re-use them across flows in that namespace + +```python hl_lines="3 10" +# Development namespace +Runtime( + namespace="dev", + name="MyRuntime", + nodes=[MyNode] +).start() + +# Production namespace +Runtime( + namespace="prod", + name="MyRuntime", + nodes=[MyNode] +).start() +``` + +## Next Steps + +- **[Node Implementation Examples](./node-examples/index.md)** - Comprehensive examples of node implementations +- **[Create Graph](./create-graph.md)** - Learn how to connect nodes into workflows +- **[Trigger Graph](./trigger-graph.md)** - Execute and monitor your workflows +- **[Examples](./examples.md)** - See real-world workflow examples and use cases diff --git a/docs/docs/exosphere/state-manager-setup.md b/docs/docs/exosphere/state-manager-setup.md new file mode 100644 index 00000000..882441c2 --- /dev/null +++ b/docs/docs/exosphere/state-manager-setup.md @@ -0,0 +1,374 @@ +# State Manager Setup Guide + +This guide provides step-by-step instructions for setting up the Exosphere state manager in both local and production environments. + +## Overview + +The Exosphere state manager is the core backend service that handles workflow execution, state management, and coordination between nodes. It provides a REST API for managing graph templates, registered nodes, and workflow execution states. + +## Local Setup Options + +### Option 1: Docker Container (Recommended) + +The easiest way to run the state manager locally is using Docker. This approach ensures consistent environments and minimal setup. + +#### Prerequisites + +- Docker and Docker Compose installed +- Git (to clone the repository) + +#### Setup Steps + +1. **Clone the repository** (if you haven't already): + ```bash + git clone https://github.com/exospherehost/exospherehost.git + cd exospherehost + ``` + +2. **Navigate to the state-manager directory**: + ```bash + cd state-manager + ``` + +3. **Create environment configuration**: + ```bash + # Create .env file + cp .env.example .env + # Edit .env with your configuration + ``` + +4. **Start the state manager**: + ```bash + docker-compose up -d + ``` + +5. **Verify the service is running**: + ```bash + # Check container status + docker-compose ps + + # Check logs + docker-compose logs -f api-server + + # Test the API + curl http://localhost:8000/health + ``` + +The state manager will be available at: +- **API**: http://localhost:8000 +- **Health Check**: http://localhost:8000/health +- **API Documentation**: http://localhost:8000/docs + +#### Configuration Options + +Edit the `.env` file to configure your environment: + +```bash +# Database configuration +MONGODB_URI=mongodb://localhost:27017/exosphere +DATABASE_NAME=exosphere + +# API configuration +API_KEY=your-secret-api-key +NAMESPACE=your-namespace + +# Logging +LOG_LEVEL=INFO + +# Security +ENCRYPTION_KEY=your-32-character-encryption-key +``` + +### Option 2: Local Development with exospherehost + +For development or when you need more control over the environment, you can run the state manager locally using the exospherehost Python package. + +#### Prerequisites + +- Python 3.12 or higher +- uv package manager (recommended) or pip +- MongoDB (local or cloud instance) + +#### Setup Steps + +1. **Install uv** (if not already installed): + ```bash + curl -LsSf https://astral.sh/uv/install.sh | sh + ``` + +2. **Navigate to the state-manager directory**: + ```bash + cd state-manager + ``` + +3. **Install dependencies**: + ```bash + uv sync + ``` + +4. **Set up environment variables**: + ```bash + export MONGODB_URI="mongodb://localhost:27017/exosphere" + export DATABASE_NAME="exosphere" + export API_KEY="your-secret-api-key" + export NAMESPACE="your-namespace" + export ENCRYPTION_KEY="your-32-character-encryption-key" + ``` + +5. **Start MongoDB** (if running locally): + ```bash + # Using Docker + docker run -d -p 27017:27017 --name mongodb mongo:latest + + # Or using your system's package manager + # Ubuntu/Debian: sudo systemctl start mongod + # macOS: brew services start mongodb-community + ``` + +6. **Run the state manager**: + ```bash + # Development mode (with auto-reload) + uv run run.py --mode development + + # Production mode + uv run run.py --mode production --workers 4 + ``` + +The state manager will be available at `http://localhost:8000` + +## Production Setup Options + +### Option 1: Exosphere API/Key (Recommended) + +For production workloads, we recommend using the hosted Exosphere platform. This provides: + +- **Managed infrastructure** with high availability +- **Automatic scaling** based on workload +- **Built-in monitoring** and alerting +- **Global edge locations** for low latency +- **Enterprise-grade security** and compliance + +#### Getting Started + +1. **Contact us for private preview access**: + - Email: [contact@exosphere.host](mailto:contact@exosphere.host) + - Discord: [Join our community](https://discord.gg/exosphere) + - GitHub: [Open an issue](https://github.com/exospherehost/exospherehost/issues) + +2. **Receive your credentials**: + - API endpoint URL + - API key for authentication + - Namespace configuration + +3. **Configure your environment**: + ```bash + export EXOSPHERE_STATE_MANAGER_URI="https://api.exosphere.host" + export EXOSPHERE_API_KEY="your-production-api-key" + export EXOSPHERE_NAMESPACE="your-namespace" + ``` + +4. **Update your application configuration**: + ```python + from exospherehost import Runtime + + Runtime( + namespace="your-namespace", + name="YourWorkflow", + nodes=[YourNodes], + state_manager_uri="https://api.exosphere.host", + api_key="your-production-api-key" + ).start() + ``` + +### Option 2: Self-Hosted Deployment + +For organizations that need complete control over their infrastructure, you can deploy the state manager on your own infrastructure. + +#### Prerequisites + +- Kubernetes cluster (recommended) or Docker Swarm +- MongoDB cluster (Atlas, DocumentDB, or self-hosted) +- Load balancer and ingress controller +- SSL certificates for HTTPS + +#### Kubernetes Deployment + +1. **Create namespace**: + ```bash + kubectl create namespace exosphere + ``` + +2. **Create ConfigMap for configuration**: + ```yaml + apiVersion: v1 + kind: ConfigMap + metadata: + name: state-manager-config + namespace: exosphere + data: + MONGODB_URI: "mongodb://your-mongodb-cluster:27017/exosphere" + DATABASE_NAME: "exosphere" + NAMESPACE: "your-namespace" + LOG_LEVEL: "INFO" + ``` + +3. **Create Secret for sensitive data**: + ```yaml + apiVersion: v1 + kind: Secret + metadata: + name: state-manager-secrets + namespace: exosphere + type: Opaque + data: + API_KEY: + ENCRYPTION_KEY: + ``` + +4. **Deploy the state manager**: + ```bash + kubectl apply -f k8s/state-manager-deployment.yaml + kubectl apply -f k8s/state-manager-service.yaml + kubectl apply -f k8s/state-manager-ingress.yaml + ``` + +#### Docker Swarm Deployment + +1. **Create a Docker Compose file for production**: + ```yaml + version: '3.8' + + services: + state-manager: + image: ghcr.io/exospherehost/state-manager:latest + ports: + - "8000:8000" + environment: + - MONGODB_URI=mongodb://your-mongodb-cluster:27017/exosphere + - DATABASE_NAME=exosphere + - API_KEY=${API_KEY} + - NAMESPACE=${NAMESPACE} + - ENCRYPTION_KEY=${ENCRYPTION_KEY} + deploy: + replicas: 3 + update_config: + parallelism: 1 + delay: 10s + restart_policy: + condition: on-failure + ``` + +2. **Deploy to swarm**: + ```bash + docker stack deploy -c docker-compose.prod.yml exosphere + ``` + +## Configuration Reference + +### Environment Variables + +| Variable | Description | Required | Default | +|----------|-------------|----------|---------| +| `MONGODB_URI` | MongoDB connection string | Yes | - | +| `DATABASE_NAME` | Database name | Yes | `exosphere` | +| `API_KEY` | Secret API key for authentication | Yes | - | +| `NAMESPACE` | Default namespace for operations | Yes | - | +| `ENCRYPTION_KEY` | 32-character key for data encryption | Yes | - | +| `LOG_LEVEL` | Logging level (DEBUG, INFO, WARNING, ERROR) | No | `INFO` | +| `WORKERS` | Number of worker processes | No | CPU count | +| `HOST` | Host to bind to | No | `0.0.0.0` | +| `PORT` | Port to bind to | No | `8000` | + +### Security Considerations + +1. **API Key Management**: + - Use strong, randomly generated API keys + - Rotate keys regularly + - Store keys securely (environment variables, secrets management) + +2. **Database Security**: + - Use MongoDB authentication + - Enable SSL/TLS for database connections + - Restrict network access to database + +3. **Network Security**: + - Use HTTPS in production + - Implement proper firewall rules + - Consider using a reverse proxy (nginx, traefik) + +4. **Encryption**: + - Use a strong 32-character encryption key + - Store encryption keys securely + - Never commit keys to version control + +## Monitoring and Health Checks + +### Health Check Endpoint + +The state manager provides a health check endpoint: + +```bash +curl http://localhost:8000/health +``` + +Response: +```json +{ + "status": "healthy", + "timestamp": "2024-01-01T00:00:00Z", + "version": "0.1.0" +} +``` + +### Logging + +The state manager uses structured logging with the following levels: +- `DEBUG`: Detailed debugging information +- `INFO`: General operational information +- `WARNING`: Warning messages +- `ERROR`: Error messages + +### Metrics + +Consider implementing monitoring with: +- Prometheus for metrics collection +- Grafana for visualization +- AlertManager for alerting + +## Troubleshooting + +### Common Issues + +1. **Connection refused to MongoDB**: + - Verify MongoDB is running + - Check connection string format + - Ensure network connectivity + +2. **API key authentication failed**: + - Verify API key is correct + - Check environment variable is set + - Ensure key has proper permissions + +3. **Encryption key errors**: + - Verify encryption key is exactly 32 characters + - Check for special characters in the key + - Ensure key is properly encoded + +4. **Port already in use**: + - Check if another service is using port 8000 + - Change the port in configuration + - Stop conflicting services + +### Getting Help + +- **Documentation**: [docs.exosphere.host](https://docs.exosphere.host) +- **GitHub Issues**: [github.com/exospherehost/exospherehost/issues](https://github.com/exospherehost/exospherehost/issues) +- **Discord Community**: [discord.gg/exosphere](https://discord.gg/exosphere) +- **Email Support**: [support@exosphere.host](mailto:support@exosphere.host) + +## Next Steps + +- **[Dashboard Setup](./dashboard.md)** - Set up the web dashboard for monitoring +- **[Node Development](./register-node.md)** - Learn how to create and register nodes +- **[Graph Creation](./create-graph.md)** - Build workflows using graph templates +- **[Examples](./examples.md)** - See real-world usage examples diff --git a/docs/docs/exosphere/trigger-graph.md b/docs/docs/exosphere/trigger-graph.md new file mode 100644 index 00000000..d8b1f8d5 --- /dev/null +++ b/docs/docs/exosphere/trigger-graph.md @@ -0,0 +1,55 @@ +# Trigger Graph + +Once you have created a graph template, you can trigger its execution by sending trigger states to the state manager. This guide shows you how to trigger graphs and monitor their execution. + +The recommended way to trigger graphs is using the Exosphere Python SDK, which provides a clean interface to the State Manager API. + +=== "Exosphere Python SDK" + + ```python + from exospherehost import StateManager, TriggerState + + async def trigger_graph(): + # Initialize state manager + state_manager = StateManager( + namespace="MyProject", + state_manager_uri=EXOSPHERE_URI, + key=EXOSPHERE_KEY + ) + + # Create trigger state + trigger_state = TriggerState( + identifier="data_loader", # Must match a node identifier in your graph + inputs={ + "source": "/path/to/data.csv", + "format": "csv", + "batch_size": "1000" + } + ) + + try: + # Trigger the graph + result = await state_manager.trigger("my-graph", state=trigger_state) + print(f"Graph triggered successfully!") + print(f"Run ID: {result['run_id']}") + return result + except Exception as e: + print(f"Error triggering graph: {e}") + raise + + # Run the function + import asyncio + asyncio.run(trigger_graph()) + ``` + +## Monitoring on Exosphere Dashboard + +The Exosphere dashboard provides a powerful web-based interface for monitoring your graphs in real-time. + +For more details on using the Exosphere dashboard see the **[Dashboard Guide](./dashboard.md)**. + +## Next Steps + +- **[Dashboard](./dashboard.md)** - Use the Exosphere dashboard for monitoring +- **[Examples](./examples.md)** - See real-world triggering examples +- **[Concepts](./concepts.md)** - Learn about fanout, units, inputs, outputs, and secrets diff --git a/docs/docs/stylesheets/extra.css b/docs/docs/stylesheets/extra.css index 532fac81..41df7719 100644 --- a/docs/docs/stylesheets/extra.css +++ b/docs/docs/stylesheets/extra.css @@ -22,7 +22,7 @@ --md-code-hl-color: #66d1b5; - --md-code-hl-color--light: #8bdfff; + --md-code-hl-color--light: #0c246994; --md-code-hl-number-color: hsla(0, 67%, 50%, 1); @@ -71,7 +71,7 @@ --md-code-bg-color: #daf5ff; --md-code-hl-color: #031035; - --md-code-hl-color--light: #8bdfff; + --md-code-hl-color--light: #8bffaa4f; --md-code-hl-number-color: hsla(0, 67%, 50%, 1); diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 1ee8a7bc..aa2b8d1e 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -96,20 +96,20 @@ plugins: Introduction: - index.md - getting-started.md - Satellites: - - satellites/index.md - - satellites/exospherehost/call-webhook.md - - satellites/exospherehost/deepseek-r1-distrill-llama-70b.md - - satellites/exospherehost/forward-logs.md - - satellites/exospherehost/get-files.md - - satellites/exospherehost/move-file.md - - satellites/exospherehost/parse-with-docling.md - - satellites/exospherehost/send-alert.md - - satellites/exospherehost/send-email.md - Cluster: - - cluster.md - Architecture: - - architecture.md + Exosphere: + - exosphere/index.md + - exosphere/getting-started.md + - exosphere/state-manager-setup.md + - exosphere/create-runtime.md + - exosphere/register-node.md + - exosphere/examples/node-examples/index.md + - exosphere/examples/node-examples/basic-nodes.md + - exosphere/create-graph.md + - exosphere/trigger-graph.md + - exosphere/dashboard.md + - exosphere/examples.md + - exosphere/concepts.md + markdown_extensions: - pymdownx.highlight: @@ -119,25 +119,25 @@ markdown_extensions: - pymdownx.inlinehilite - pymdownx.snippets - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true extra_css: - stylesheets/extra.css nav: - - Introduction: index.md - - Getting Started: getting-started.md - - Satellites: - - Overview: satellites/index.md - - exospherehost/deepseek-r1-distrill-llama-70b: satellites/exospherehost/deepseek-r1-distrill-llama-70b.md - - exospherehost/get-files: satellites/exospherehost/get-files.md - - exospherehost/parse-with-docling: satellites/exospherehost/parse-with-docling.md - - exospherehost/call-webhook: satellites/exospherehost/call-webhook.md - - exospherehost/forward-logs: satellites/exospherehost/forward-logs.md - - exospherehost/move-file: satellites/exospherehost/move-file.md - - exospherehost/send-alert: satellites/exospherehost/send-alert.md - - exospherehost/send-email: satellites/exospherehost/send-email.md - - Cluster: cluster.md - - Architecture: architecture.md - - API Server: - - Overview: api-server/index.md - - Swagger: api-server/swagger.md \ No newline at end of file + - Introduction: exosphere/index.md + - Getting Started: exosphere/getting-started.md + - State Manager Setup: exosphere/state-manager-setup.md + - Concepts: exosphere/concepts.md + - Create Runtime: exosphere/create-runtime.md + - Register Node: exosphere/register-node.md + - Create Graph: exosphere/create-graph.md + - Trigger Graph: exosphere/trigger-graph.md + - Dashboard: exosphere/dashboard.md + - Examples: + - Overview: exosphere/examples.md + - Node Examples: + - Overview: exosphere/examples/node-examples/index.md + - Basic Nodes: exosphere/examples/node-examples/basic-nodes.md + - Workflow Examples: exosphere/examples/workflow-examples/index.md \ No newline at end of file From b907165613f3b4ffeea769119ff05520bc861ad4 Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 18:48:50 +0530 Subject: [PATCH 02/15] docs updates --- .../components/GraphTemplateDetailModal.tsx | 2 +- dashboard/src/components/NodeDetailModal.tsx | 2 +- docs/docs/assets/DashboardSS-1.png | Bin 0 -> 198667 bytes docs/docs/assets/DashboardSS-2.png | Bin 0 -> 180593 bytes docs/docs/assets/DashboardSS-3.jpg | Bin 0 -> 177611 bytes docs/docs/exosphere/dashboard.md | 244 ++++----- docs/docs/exosphere/getting-started.md | 5 +- docs/docs/exosphere/state-manager-setup.md | 504 +++++++----------- docs/docs/stylesheets/extra.css | 2 +- docs/mkdocs.yml | 14 +- 10 files changed, 320 insertions(+), 453 deletions(-) create mode 100644 docs/docs/assets/DashboardSS-1.png create mode 100644 docs/docs/assets/DashboardSS-2.png create mode 100644 docs/docs/assets/DashboardSS-3.jpg diff --git a/dashboard/src/components/GraphTemplateDetailModal.tsx b/dashboard/src/components/GraphTemplateDetailModal.tsx index f250c45c..33b5f01e 100644 --- a/dashboard/src/components/GraphTemplateDetailModal.tsx +++ b/dashboard/src/components/GraphTemplateDetailModal.tsx @@ -139,7 +139,7 @@ export const GraphTemplateDetailModal: React.FC =
{/* Header */} -
+

Graph Template

diff --git a/dashboard/src/components/NodeDetailModal.tsx b/dashboard/src/components/NodeDetailModal.tsx index cb4f8cc2..4118cfa0 100644 --- a/dashboard/src/components/NodeDetailModal.tsx +++ b/dashboard/src/components/NodeDetailModal.tsx @@ -106,7 +106,7 @@ export const NodeDetailModal: React.FC = ({
{/* Header */} -
+

{node.name}

diff --git a/docs/docs/assets/DashboardSS-1.png b/docs/docs/assets/DashboardSS-1.png new file mode 100644 index 0000000000000000000000000000000000000000..646586affad257278703425564c396e8982f16dd GIT binary patch literal 198667 zcmeFZXINA3_AQF~Qxrs0Km-JA^d{1~fPnPgoAeSw?-&peP!N#bdkcinLx+e8NN)+D zBhnL!l+Xib;l6v{^WW!wydTec9xz!*)?Duzv%GVR$tMjp1u_y^5+WiZGQ~HqwTOsF zjfseE9NfGCoH>?L!~p+X@z7F`A*vXBv<|%a$4**Rnuw@6mh{ZxI`ICM>l;H4BBCck zmtR--408O5h%Sm0UrX!wnr+Mm80gx}UF?u&aJ^NsOr=S?V)KTqm?FKKmS5XHzU~IS zW$OJtO-KGsO*<8bZ=Uj5{An_^nk5naiAoBmVYa>e3@?lLdp2S2Rtfy~ zxzxu_WdD7R`KIx;|2p^n*8j)Hh5X--`@d`V|0hsdTd(=+(6LOW?n7t+0V4~i@96a6|XEicy^X;8pB45mya;^QPI(!owwO_GlWt`jwWIU4YC_}^j8 zZ?$0YB%NPUy1|E3Xz(i0uaIM3mx`5=Vh$mmd12B<&OaHXM8l8%WWfBMIz=0`wzke} z>FZ;ho*o2U`L`*q7Bgrmt)Mgk&AGV;gv05AUf)v*@NB#O#c{I+6;)E#3K0=M4Ge88 zWWrc@4ryUK2oCVv6xh@;G%UJ+_+O!-cAH!fq9*!fxgdlo3a%2EG2nb)iat=fZibeJ z8zB!_A2)@w;4B% zmrv)Xd6@AI-T>AxgBQW!4|@%um3EOBQ=E20Tye?*%YyJaOj$H8FHG{_y@q`NMXIbLu*m3 z?*@FGtLH9O6-;{mV~H!nh_g{>H6${)X=p_s()8CJ@HRt z;lCialL0%uu8#(qN zy*X@`3PsJS|6^%%gQQhn1*v1@gt__%at|qZ`9SlVc$fTbS_SpzDH%qFCvJ63eq{># zyNZ#(Dw0~@YzuGJ19wNB`^9dQTh`^!l3v~ZZj&O!ZJ(P~ho zCNgHEM_a1QI7b*l7-;CS{g27Q#4Q&H830lERvhNG9XXM`Ub&vj=E*MsT|K?h?yQ~v z)7+m!7=;G8nR2nGLB+wywNeHtq%Qc{*(|#eovyw<4i#H+89q+lPP0r^gK`ca2SqXO zeELVa9PxU9d+Zac8859bW4C+Q!uvZ=#DJ$n5?)ruPDXPswmFk!<@BF0_1@!8&p}dr zVa{PR-(`5oUko5gA+5I|dgak|sIzCmtM;{XVH2$RiY`dv-9tr$AHd4F!xkD*IU^Wb4oedN2TWp1&g!PL{@a>OAyg+>!m5k>88#BF6m$7S>a!NC9)=M2JV0anB`$psO*uJ4M z+>o=Ljc!uS;k$}cdGXTIAOXd_2gSIkYu7KW9?UF-3fXfh0vY4-Nne6oDQMBOQ%ckn zvaN>7FLJ>Gxb!Lt;*h}qs6<%pxf5EA8{fS%`q|glcf{|ti+9L#z9-Z-J)O^}q_*z5 zaLaK3#fq1E~3K8qqPA4B)-EiTFID|w?^Cr0>a$Mj%VqP zMYNu&DSUUAk6l!&`~q@v9gnoD8=d#n*F~cp=PTfI5I)^lsRtbM@;553RXP?Jf0OlE zQ3*>%)~j9SJm&wp^jDkUD*W|vq`FVrL9YtFm7td;qMf%dbe?nLY{&(FA?S=QWmKoj z5c-70IxYtq=FY2T!yL*EO+1vrk~RC7+CQ#X$27=Mo>#CGGbUx^?=XT$^o z0^c?He_SpUxSVCR!G6?v0}hT^VQo8E56Bxqmc_aD~7>dI#( z&RPLygIWy>q~lfM86JwhqDo5g_nVydw;i`6_%@>^Oll-n4k;K%>Mm4KX^|w+G*Zem zpgAd*D?3ar-fY#iZjRb)n&V^F1Xu@z=?CULmmfuGHoDam&QM8E?R;=!=Pskxhdq^? z5Jp(A_v#ukCq1CXM)COIW{YtA0kYZEX!Y=JtKY$1H3#noh4C}bi`Li5-&}uK;<3?c ztzy(*=y96y*~smwv35uT|GY5$zwU5glx139DL!ycXi%6Gs5D}>*-W@6lCKaA(9CNO z5GTQh_*`6~rW#t5c+ULdog3RjV{%wW78B0PeR#BnjpBiI_gr(0D^^iQkJAS%fvfHJ zUAFYke%c=&)x8i*X=soW3is3*wR&caFhW39OQxzEy8TFvuDvgp+yyNcyjSbMdij)V z=@sLw&6-EMKhPNeC*J-w&~@%^y<{vd$UvuXK^sV6O%!Ea zJ*=Wa&tk;q1Pzs18_VSJl2eu%$P$qz`1>R@G%bt3rWOEcX53+t;_EO2{20XHUAmwv@zbh3V#+zvJ?;!{#mtWR&ZZLgK325iT7{x0$na>gjMNNEGP zey5b^*VR9o5iQ;81XT)3aOUOC^Zz|wQ9N^kFw8z2)zoH@d>Yl64`$p#=j51I)a>$g z*;3DT2YBFTW{{;dHCj)E{#jpVD_F*j$;4B-%YI32Pb^OkY!@~0eXXuWhyq;1<{b%9 zWA4?bi%I9+t!^*>bro)ou_O zOeFH9p#2>gV$fDIV(K8o?Z*4s`=W-E^G%O&SKF zm1rHY>i}ua%)O&)v6Zm^Z$U$eB&R4D1kLi zsb;#okx$LVZ0S~nNO_HFtZHjkZ|nI6m@oEs)t>yUOhU>uE3ofO@-M#=S5VCBlDGd{ zw{bOT>SBzopa1SQv*Y{bI-jgxm4D7dO<7WDsa9slBPHkaIUAa&%~5sy^b@?=2`9v* z(P&}nuah^A!TMevvpF))1lBip2k^k&;gv>}|E!Rb@?0OP-j2>==a=6DTG;2$w`du# zRv8)D0m>U_0-kTO` zZQX%2;e?%u*|C@clPP|krpV9p#NoyxpWN*{K)L?W>LbNFc=HX!C%bBKXbFCphF8UPqdC`^GLG&gF?s8s=lqJrAbD;a1`6$bnkbZ2Lp5}2QN z_6%Y4!{p{2#%GFvT)y53cO?78!g2xki+t3g)@0KqBA9i8UGM4o^cQPHjZR^A^sv8e zb?)75{82uWUb$F*8u;X1na7{6ad9LKx=?P>x0Nq93b@;_+!tx?FuvEx$e`~wn)G`| zt2B{oeBbsq>w_I3_}2qN-Z2wv7{8CUgN`?Xo0av#CEc9FrLkH=h%1ZDH!w4$tQr+< zAps?KJJGrp;_O--!S$ylB>PXEEnZDQ#_dGbFjBkMBKC9!Op!mYD8X^Q7G)aSv`F&X z4KW=A)Nv{2ve=;42?utkN69lNpS16}eH)*EVVw3YBcLmV3aj#>*xTJ570@>?`d~iG z0R+Mz@WtzS#?y|8a>L6_@cQUWgbPLwr{9*Fdq*D^5wA_V^JhEh)JD1%-VgD+scpHd z0-mbTQy_QI?yNQ)oc5Xata+?0l17>+Dp@nGdrUSiAw-hyie# z(By&V6R@w^;ymXIHN=i)WnKc^k;u2iRB?rA@3eBM6v(eX6}7X(A(R4vHRE;_;|n2R zQ3rE7=jpctCw*o@+H5=Zu$2szfz>|24LgD96)hVTx|y%bsJr-9J$H#|yKA0Nj3xVC z>xc%6>GpRAxE{8`pw{FG^Y7LWT}tp+PvyAa@kwN$cd&cAyK^WD>C2=9-li=p1^Ytg zv_}dYk%G8CG5lOKW1idOm-u?W!oAedqr_;LNs=o)x~ucHlAQ8kAyl;Yyo(H%e@9ET za~|p9qeFA&W|U55fHrj~x-CJXRkxf+(3)<=e6SwWn`;fPCWb5*IEUWPs4_n&Db_H& z@Yb^=Z}Q5VHu0h0e>~$Y6qNHon7xr0w_0GDPBTltWFkd;$TkV#e&46@n`d(#thLp? zTE~RZ^P8eAUUP`6P|Z*|uPJS25$N_Fi7z}brP5zTtF6W<4vT`k<4+`HhiQq3awR{& zGg5)P>@PpZ&Y1H+)YPbWUuaGj2=LX0wM)y(MSA*mDCNDNO4yWHDX{EEos155aWJNq75mZI4w5SJdvrapdwwHJg)FK5JDDGUL<-A-S@v zU7Oe9QQ*&z(~r8Im2bW57oSNbSP;&P(B(*H0x@VRYF+f$A$>)#1=ldl z8Vf$%jy)g`{+Z>{jr<(dv0!?KbddX_q)Mdd2L*OFwdRzN2ZZ-P=Cs@ zn}q0naZ%G?s$JhqN$$XCJ+&GU?gslYw{AQ1`8Y{L*&?TZNu7kii3+|jz(NlR;3sR zL&$jOis_2qUBFYBWhRj=BCA2XPPxRkb(8v~Jp>P0L_1+hfpy(wy*GPo zCc?~gtF>n4CvD-@Vl>5ONMhYP_{%N@_Cns%G?Rm1uN|)&6$Pt>ID$y@grv!lS0t(s zS*a_ZKgnBc(X8rx6j&^1q2#}QovW1R#fEfWg#+0<_0&Hc&T2-_>fw)7jhghPS8nSy z9AwuAP}JiSvl{BoAJ;u6OUngstLm9FBHh&59LF)(TC+glz7rW3H{32bryAryGsXWn zjP~~5a6w*K2u(UMOK)y?G5ELn{L5V=`4D7e?oJ#AFHA(hgR8OxHpx}89p^Tb>ofFH^n zKkiiJqjM|ID==^RJhyt{hlJ5AfQ(OsW98U0!=CAZK0Wt})jfG|xGLi3TkAfqs;_1G z%y$wfAbKqm;#y6z?X)gVk|QAdHR!E^$w~Q}Gy5_G>UAI*snLWFjr{6HHcl-=rjwOx z^`S|pr1Tf0G0;hG&@K9W?kuN6@-6L}>BSIK=U6>fi>-10Rm=*VZObislYqqDZAbYb zkj9gUt!kx#KjPo4yqkO8B*s|Y;;o^U(aU%K;KXcz%qYi^e{q zSHs$D`yh0+ef%=bS8uAiyErczg|#tzI-tP))^H*2d8_*E2*SG8=Usz<<8X0dXgOQ7m>03)Fx|v)r=-W7G!c^=b+npyf{jiin=jTb*sb~4&3508<+Cv26zf5JeWBY zImVIbf^^l;ntrUV&y~f}mFp!}U6ZY7|9beuslCCnPI73@JELAza8QVLV>A$+>D6r# zQ_78O0RX_w|7~2gA81@<2e;W&8zeS4v|KjSGWeCb2=9{i4a(&^$&-N1^r^=MT z3M%Q1X_O({CCG~|A%DYg)y}@WI6iaLff29o>a%yq@G`JjD_lVQoilUpg)lj_$s5|2 z3Z-^U5aFX64!*rAMVX!6l?R&s$m-KHm#X`#{iTZ&3!jkw(Vv}`?BJ92g3*UnXOBYo z9ZZ{7?ubNqp(XRLNUyakE01ySKs&IVUg`P;n6HJ&u}n3p8&Y9=ZzWn5TB2!Y1q?m{9IOWz+*KmFWw%G zY&bppM_xj_DJK7+MS5~vX(lpy)b;zSE99NGbhFlwjTk7rMsP`t+vH|r9!zD?tl;}2 z3+sSRb4+)bPqY`mmjK(hra9yU;wLyeLogw!&Bk_9lN~Nlu-ZAGh*@Zmp!!x7>n>ub z=o7%OP(2MPs4L6{@3h|h<8`o}#a?Qk$`4*`;1Q6e|xHXJDRrs1p?;vC%(Nm7gdBwAM5B3_~T zF<-u!zkzgfwftM)b90xL@rGOU_*@H(#_OFqhLi2@w z!oR2nbbpyqiypNwEMv9zewx*)!{in6gWt>R@045)=o&_DVn+O?`jJ zEn`=|VMM#`N1c9Knk)Q<<*?vzd9AQ~X>7ohI^B1Lw(!&};hS36I@UcxWwntUtDD+q zH%G$MQO@it4yCV-3Bdbm@93ivo4+rO@U&|jc3vl2rYrwJEn!}D@1qvZ}N6)m#ZK*{3mmil8=zvg&JA5D3ng zL0P7l;w!UON!2j#yqF(JV<0o*`fkRmHuck01SV#OOlQANBpp}H$fQBuYLB~sv+9p9 zBn&OkLD%e39NP>r_FCz4IpY|Sczw6L1LuKJrBgc*jdHD&+16B|m;zuberJV7C2^|o3!DO4%S5HH! z12T>)Ow2yWR!@mUR>YESmQe;+5vL5pNcMZQzB^Gb98SvPJSM62+H(rtbxS_;`bb;y z*${CJs>#!ut8XIT#L30!T7C*F4gzBn^u;ANpGDQ@fn3jQ1x6o?>eUq)yt`j|wY$A) zHwzLIkq!T`RWZG+nbLk%Jeh)$H0;LiVX^rxz%(ycef$%Yf_-V>Yn_eO^a8I*A;FH_9syae7%?M z4KHrDHxJ%4%Wb~RD-sxc$9sR9aj0)xsr&OAEj@%TC(T}R!2 z$6K(X53_Szo0x=iFR#5Zj#ZdHjsZiOGg~-&>%k>3K~_G@=~S*))mU zOce+qNOp_70a_8!l00*d^E64^9{ujcZ(do&<>(_q#>0&Gz;)q*{PvKTd1HMB(x%(TS~Xf@|2KTT1<7CN4G1!uR^tUY`sv-#!(lG-s=UJT4+4C_tVv zF98JL;dC<)8lXUzI)XG7+T1(^bS!r8_>rp9e13rX0EjN#IsJ&lebl2%g#kcx?d~`{ z;o;#~{LZaCEnthivFy((&oC^dsqB;`o^T!yg$i~(5KyYsXI)Vo3VI~hCM^9aOCl_{ zPq&Umxi&{dYqeg&2Aq+br=0>)tx)dH4aS|iQ~BiV#oiNQAxUhqj=TT+zBPEdcEvj& z-V*0e4@%9qOZ9v$FuY^(-A-u|+NL1>&otBZ*PYF`Nl|ZDNa}1m#L4J2_9jKU#Y^ho zo$LbjwIHf;C~w!Nn(Ge496w|`-!=?+2E=!9{&W{{`@NMZ8JiXeYHUL=q#S7R3++KuWqMS443uCX z75nKLv*SDZ(>hA%uk$X4)vgH#esJ&IumIunH_N^AO=>*{c!{@`S7kgcY=HvQs{0=%7q0`q4~OmZ zg+m=(m=fmJUDOLi3joNNth^7JijfbiGz?=j%)a=`ohWxsDz)3?iYlnw1m=!WT3=SqXAQp=)Va3AZ?BicKsL60@=s<3HL@5@^RntOySPVIHzQ)T z@*&n=BW2(!Yb7xf;O((Hf&z)mz;S+&Zfn;cPE$%kFRF6xr1o&DZ`sHY@Llq;*)k=7Xc)(m$W_ z!@e7PfsaB!vagIpK5QAORw0OX+pj!Y_4v@AzSw$%EH_B2r9hpG-=pR4Z5IzOou%jF zmzu6WhlD1jzHIZpzQ!Uid^$ND^Tk2mqqa^a;LhZhQ7CE_9FS1xi?7e=c7+|a$S_WY z=Dt8PUS=#Z29aK78jO)gVnm_j;ad z0BiNDzT4e>6RH1rwL7HV*P{|1Wc$Z+(-;R4tJ~3k1s{^q4LxaOEJ3l$9L9J{IvFYr z;B1;a_Zj1<8PFkJ3_;gBx7|c;m{01 ztGZ#kcfTON2;*mIkfL1112%8NYoX(+J8emL^3A#nhN^Ifubiu#K0A>(i-0_B5&wWP zT!2ZQbjP4a#ipf6%;dmK;pZYHdYa-p2O%nYL0)T;2Bm4Fju03Ah zPfSVJPF_l7`6^{X`r;GU^-Ac@m;jqwFteQB&H4v+9LEh&*v8(MW@B5Vf@*aD=ejY1 z6@FV5Z;miuNGs`QilUrm>41-QWg+t!81!KYLf9L%FT0s~)1_o&OSmz;WZbe8^!?+s z(>Rq$qo;si$k!s+-NzZztDgcooA?w-zbx`<%TQIpu0=9@sP1j})9=Op70)Xk%Q5-g zv>nge|0>UP`(fTh;%%F)(zIlxS5{Z|Yfx+7pZu*ebRNtty)Z5T|9%l`>vQR2B#k6XfjU-z8KSaxDQOmD`^(3vx%P=3X>B}j@cDdpH6BW-(zYi6tz_L}+A1?FiynBaxiYHapaOxH9u9<0hBHMH8 z8R|QNV(M{jP`TD;;?6j3+1REsR#b2Gv&5>mEeBI2o0AoFi2&6ywYS?+KW4Z!#;&U_NKtJUR|H!o4$ZtAICMrVz~uCGtcz)3fV>ULKl`k~mUTtfPRh3d z`r3HnrF<#!w#NrApW>MDVLxudvNy4iTC0j(5 z=~j8f!L(h&;}8^fC?xLenfmOf_nFk`42LLPR`1B!M5z)Cu?@zghP7l7+@+z{TDzF)H@)QKcL;R}x4mg%8 zRrQv%=|JEMpv}0r?Kv3;`M$4VTEM|D1N|UPn&gn0iF7L4auadUTeZ(~4oSq;D4xpiC?js9;8NmLP4p?sP!B5bhatW-L^agDqw`xjJ$OJ@dpqKa`o^JGz_ai+eae@ zxsaLQ9^1DI=^lGiA7&(Sz<4rz-rhg>q>*(XP`jErXC5M!6!L7aexByltR;Uba&MwW z2$W_KWKx2Waytf3O3m$O>RE;D$7*TqKC)Tm(pBQIYkw@|QC-}K5GOB3gpS9f7TVd0 z3vQ-5#&5%&n2_7M0p%AXUvv*6@OXw!R#nRyeL z^?wzT)R%=M)A|XnBJMf;afLxipg7oR)X6u%n4cAU2X0OXxeBOsz5~?ZSzbvU$0?t# zu5Rf-5*#0KL0?p;U_~|DC0lj$GD#{R+!%3RC^#-%tXsB9m#J3?GALWpI#B+Efx~jO zQfd5g?H$veafiLa)k7-UQbjUs(2o9Livpm7sFBTE>Aszakd;ETczt-9&%(aYBd27% zd|$@t!zkdsJHsPvz;icm@@%H_T%#=#Ui=|S#m?s!-mOH_m+gH=(;6jMbx`Hu#{HeL zNuk#+jqei%wai+o!!-k9YHYCP)?Q>r3gbf~k;HvToOn(9GwCOO;A`KPITSaZKuIT~B=AoaYxZT#AN5=or{SR zQU+HJ{&rJW23=1-tJd(eJV+8wDo85mj};TB=kQM2%M4rH<7VnL68&z4bUEJ$V(klT z1p`}_8>XJWUcR)J%N|D^OOhtF2IedZ)0}%){TM0AZx(nnI~xPy?hbu6|M29y5Ie_^ zw+SK~8VgdIv7$O)z3!WWekY|v$qG7{qs~`3D?ySor=?UBA zc*r234noe<&`pi02dHCdY-Y$Iv zt#NSE4a#{SKyWD@^K6fqoqj|tmZl1!zu$#60&x+K5ByI6|fO*c)NSB#1pN{Fxrsa*gGprh-zNl-Ac5N;XO#aWNXt zGwOz=Uo72NWqj&<6-|&l{OUR$)Gzhw)rDK{xpVEE?Kj$8nVPg)?o=*g>^dt>Ls<%1 zswJn&#sl*uQxR)s2~u_9qF+o~A|qj;=FqRQ_M?@$V&4-V&j!>UQ)SELI1RsCe67D% zFU&#H=tz+dHIg1{M*DsH=G+>A?WOXY`mM)?VKwe)8CZ?*X;V>q_^5w8T~{D!@)S># zcc~s|mJKo1b$vF(;;O>gqa8eXzD8Hxhy=LR%5g{IF3+OR>&D&J@2r-+GGtKujb=q< zyNH_0euMk_q+VoaKV1r?KkvO;^W~t0yO6U94K7sx5V8_|&obnFE@bj3*a%6Pn4j#6SkQGOI z?vHMFM9fnt!lo8W=X((3>!&hBO=p;-lJ-(4T^1y%3#H^#B=&)Qox4D>y>^QUJbQz0@6a>I z1B6UirBUUR?Y!ptJVwu{@@?JG^pg9i3M(l@dvnRt>=*lPKHIQH-o-j=zw{cZ*>Xzt zFowa}QQ66KDQ{1>hdkishu)Kcr^F324z-@MJTwDF4Q-xaYAEyQi6A z#!Ve~#{R?2g#F}Ql(M~)@*?p>J7Wby9&h-ff5Vf|q(pI38r-PYFPIwxDQ6RhUSOG9 zdK6ErXlx2Stq=c=;TL0pv)}zT`UeE1^iz`-Zj<%_9a4Yj*LU^oN{KCw*(Z3vin%>= z)s7(yL*1bE)Px20?1%jFG}8Fmv!va_Tlm0s=Ht2e!qC0_EwfWOJ`3!g@#5jfzK@j( z?ZY@P!fOCQjUR6s3-JP4h4?}WsZ1R&uf5yG`uh5PmqP^AP+*orNyT4p8$5ZbR#3osW5qnZbgji~DjfnU_kscq46)MjRF zUG7%y$p$?j1o+H$Y{`GpBHk-U#89=|KDJ|5mMcEqd1Z<_QLt&lN?ANneA3{1(PVR<3EZlXIY>T0)Z$&GBa zM<@=J5vwi-#ja6#&t#$g9mq8977Vk-u(t4gIPP7W@wOYf$Owq1z>(5IMUm9nVe|8l zn1!S59wagz#TA%2iYdZ<)dwU)_9^T!aCGr9U(!q4s{DZKFjsun7)cC6aXk z1Gi_mb~zvK16eT+Ydet2uIO^Ih^@$JrP-UY;7fkC1dtRBvda1R)br}+=lgsfyFJG? z&U;Gu`ijgahl5S!Qx6})q0fk3qE(dzIb9SPJC<1On;9>Epj$Z@JV??ZAKX4DStR-m zm#um3!(RP-D-k2U1Qr^h>zoN_=6Eu_Rs>SjvwXhO1NwA+wVjXVN32*_}xWfVJQ)H`u?$a(?-$x_(R@T9h zv+7&4$UNJn*&P_kBkKAixgU=7XoStj^DU`QEvAowcP-0bqxh|3HLC@~N{w6$$G z2l;nM4^(&QHr!#TpMMrcM#7}5b-p@S#<+ErN^9FSSvr!|7M5IBu=2yKv)U7$!>9Dg zM}gnZ&QCTLZz|4}a-(AVI6@r$*X4+~rTTt9U>h^D!O#{q8uC$r?XB27tF#)N^bVp5 zDD6lGj*n@l5|f~;7}<^x<&p4J%6k&(9EX%Jl!3qm7LbkKi)7$a!! zO*!6!T&wyGi^d-VoA+MsH<}eBVyXQPu{%0@kA!?z z=s1uSvm<+*eOJTxpI3YLUUt(gCA~v|YI;Ppr@>>P6`k=Rlu49}yFq+m{+LT2p!-rd zQ9Z=w*KcnQl{)RwrlF!zQT6;sYOx}*j>X6Szv@(qcX=n^5CpGBDr$kh3S&1*oevpM))o# z@wPsmrTNbU!i*Z4FQ<~GT6ok&PLVIkj4lV0fEg<Jy2&;{c2Oe}q?Rf$7Cf)Yw?g0{QFa8OZwJ=$n=LiKeXy z!tk>!s^{qmu0aR^wOTd_&F;W^q6Td1%0Q|Hmrc}s1yC*yy~Up4lZ`HYEeVC*_wwig{=TXFoc4+!DV1UJ(19r)C? zSK6;Bed8}$`Llp_{_mGc7He;dxGP{vInU()-56gYYL>=`lZzWQ2RAf2#<~ODV%<>Z zZ8lIuFm{5aWduULs{W}aTQFwD;1F*5dExiA1km%p3+%^O?Cq7pU-~>~)M-QPX zyBM)kNe=Zeiu_{Gta3Hhmd9IDvtlt~Hxc1okj#}@0LjE=> zc%{t70w(f475z`mm9l6h<+QvHjsF-{Zk3D+k&W%PhI{Ln+1nv`TJ%z#Tklh4EgzRd zJ=Vn}sw&1;OHXYDmEg*9ct9;p&%{>u1dXZ%gxCjGieJ7d^tF+kc0iQ81(Tnv`irTu z`4Ef5TChYWwRp4u457yE1P!fdZb>=)N$D*3LZf2m8x_%j3ZSHR{&8#=dPgGMq~@8? zlCvwh5oV%-S6fJ!RM9Y$^3XD!8EyO!yMb)T)U#i9UfpTbZ-u`xv~N9`fW2Sd7|+4B z2_9`%|O*9Cr1agQh>oAxVBU_07Vopw2d>Fl)An? zq5uL+TRGyBJ1ye?T@9eJp^|`B*33Z+qs&u_k84@5pLm~rCa>%SAPnO$Dg$EvJY@CZ z#x{$6i}!g;MGOa{DIKL#=EP?w%#j#H;+J~UCc8!g;%qGPmBZlM<}Xr@epf zIRd-4jogl%f|VdY1*weUYht#JQxH}2q6uy(uY6JevYV*8dO=~andP&%-$Un1RJ6>0 z#f%&QYW;>fFQxREL=U3f01Yc}*x%=1b_`6eWfWTK@Gsj}WhjaGwh55~ded3Czys8_ z?$==wZ+hbZt4Xw(oAta`uF>9>4m(31h#ofC@u;Vft~l85-}Jh@#fE$TNkEs{l>G|v zK5cnZOj&3J5XQxBt#f}Xat-NYwH+(It=TB?+&B}y6ma>>Zqf2PhIbWO+b>UT_;YOZ zBFMMO9;3w?(}F?L3Gd%~JMRU$o0OfOguP}}45gyd)9*BIxec*2*W9esP6QSGqB!m~ zTAr$BlVgX}dHm=ay+)Vh+WpFFL&Qk7dvN&ZIvv7YHhY10KyGZK@3@Hj)V?KrpS2}s zX+4h}a_yjCD|j$Uo0dN$2lw#LxrPO0R~VqWkVW=hhzy zzPh|J?jg1oPi8-+ORnO5epvGbpJ|!ABBJp4)@KwzJP&FL4jd-KY+M2tgfHkv34wBo zBxxww+46XuiY&SnKk;PqW)j41=?HdWH#2*C!ND7J+@8LUu@~qde8Hq@OD{LzPfaT^~w45hEL>c znAic0dFfA=BW00Cld4@MWkm$EeyNSJ`QJg(6hREf1<(6J{sDSR!Qyo7S33EE(LVHA zKNBpo>_ZlQFnjI(31nZgFzAwjzw^(3>WnS@OU(+XA9s4`;sh4}v4$a^%~a*qr^=wk zsf=6_P7_rUeAOn*rHKM4#$+noG9{p6e0|<#XyYqyo>7S)5Zv*P>KUY7d<-8>JLfG=jPy zl1++GO816=a3mFzQthB?QWlv*dq5##g$)x*NM*#OqY zHgK{cP*uplXI$nru2Q{huat3u!S-Jb`jwwcyqqSN=ug4NT-jR-qSU+^L{f!G;5f*E(`xcH%j$4ncV?nj;iS- zh%fS+*(dH<6AwRPVwMv=9J_RO)g-f;z%w$<|W_Oxt`hxt+R_t0# zTE~JiU)rM2XVK5+jVtuvu4cmzY4Zx9j|q7t@T%ET@iwt(1Tb;+YEKsEP65s6^{+_s zQXpgowo5wtB$d#Xt3JD&wtV-Cfw0+0%JPO{wj4DKh+1s!U9t6{-Np2Y!ASm?P^GU}lyE{w4tnZc{N*wP!dT?$^u3 zS&Dq>0*pCC^Q)E1zHJE)gLnIqD4F%MS7nFnF!lNuAG~-&)`n)_UZ2@yJJ9eW{F3() z^dl#0Nh2Hasc!OKq19OeDZr)L71$t=5ro6nc{OIHg%hb30_+OTP(EA8s0OlP&@{ug`i71h-C_x-9{#RhB@Q2JIunt;+f0@8agp{Pi2QUX!} zDgufWrAqIe5Ge^ALwOW| z9^t&%Cu6%COMgE`&#gfPDm(RdstqdmxtT9rNT-IX(J?TEGHbcUs3G%u;>N%+eQ*MD z2@82^LRdFQz?Q;1=YM_6f)A#p*#-A&-g>39y_2dM5?58UDdkX-5WaqmlZ=7X*lC#+ zt|)B{U(~_-Z07M}a^ZWb7nPD6C(_q;waJj{YR-Z+S=J5-JWj5fHI(oVg?BNv4-0z) zD(iV1xDVkU6JSXx2)oer8{>_a#?5dJ#SOv#NBd*m2<>WAU8tB zuJBUoF-~3NTud0sYxgo-qs1Et2un}cAbP_;>V9ZZxCzU{F%+wFpQynN_JPJ&3Gp{j zEx8Uw?1GB2E%QR4)K#7Fe#;CZ6H^)TMzOcRkjcw{$$MP zx}4o9aP(>`Wc}TWgwK4{(e{^!MFOEH=2{+RGnrbMl&p-eL|D3yyjEU)+$BAkwNtVs z;K3?Zo(S{~2p%DBLSO^Emz3YK&C*f~0c=Y7H}t zR=7Dd)TyRVVGt58CJvsA@U1e*zk2mSc7s_eRqi_2#86<%doW6IGL)7AvZ8?tfMpY0C0#Cq^d zn7I#IQ7c8>6!y>N-I{_^4VjwF9g1`Ic09t3dvYJx#P5MV+zo`=ZFw(RlsJ99OM*ev zJ9wDel`T2x^q{PFu`)ZieL4Fv`t8ilX8Te9pfTBQj3!CQ513L*$Jo+4+y4leaS*b) zt&Qg@;-%^sXM5x~>C1zC4>!*xBlLV)qgnDCpu2SXM{+<|nB;&6_W~Y*iiew%12anP z-PR=!By@DsdNcQ2g0d9sM)r`l#^qB%SLoL#9|gt zUiE{u_qUP#6HvBs~+Wk zL=A}vt~u~%5CkiY$jnt0N>$!+84$)nwm!R6r+ zW?w0CJUNOsGj(V{B9M(2O?_~;m2=bW$n{O;9h*hG&UbLp8iKrz6(&cmd%)pRd@EIK z=wlvwk#g!j;AgKy-4-;n;Ou=^Lnxd%eD+UpZRPT>Hfi>baA1=aVfl)20q_&$E5t^8{8Gf|Te|aZW~y;O{)M#k zin{t^#BqCX4}<*blY+*3g{{hN0UeIed1-vbEX5{KDYr1OPI>GzIlQ25+s|(7L{L#V zG^ypJx;{MPzB=dx4g!b*w00g$+sO?m@;KdjC|KPI{HClO=#B@t9POcj=D;Svz;SHj zGL-F6fz>tq(U1{skaToNi+5cH)A`qunQFrc3OnDZ;oWxLrRx#Vr zoc-LTqmx^+8&}dlQTun_q`Gm7Nqo+%$ey=V&4WK?0$ADBY!Aw@uqzQC(ASEzA$li& zB^Rq5!sVMqZl)Jpr&m4tE;J&u_0*453aMXpf7(NAYOJIJHmVs~ZUXfq+A6~^V$T`4 zT|eZNZE?ky8lspU-il( zb@8Pe!JVUn21;^g1(rT?aaC$C9ICuH8B2O|3$WMeW?sL-g>#Olt;06UaClPD(%p zMl`o#x7)vg7RRNymL}a^r%VD)nf$jB)j7XG8xPpy^`Z|?l7T1%yx(40bM3v0Amkre z56|?M?jvMY@LtIwn5%l1Go!y&vG?dFT<&N_MxAcr5?c!MD#?YVWp|nxZ1Yc7I(K5&H7&w!5f#Je6Z z%8BhvE*^WyLm%ntbFIpq=+;+s!kCo&N`XdH%+^61cunp%+6HLEl1=N~g1%3=kKAIC zw6}%EI<|T?qWxH1iPw?}Y(enHofe2CCyTAdH0GmW#1+m&`4m_x*i(GPJIbQPjGcZ} zxy!2^hsBllLC{@|&g|Pio!$%p)$IsJmBGMIwwlxpSr6cB?guQ(BzjyYVGmSKX;to> zvAp4~mqTc9R{qfkg6a==^?o&!77ESuvepqCoX+nvlrHqac`2vL0ba%Ww;{)9$Gjj& z{2v5~6XX3t&KisGPY&0wcrGp61m^=$iJjTHJl%@s=c#W|fH$&I6_|S+Zj0E5{c@+*E-`QSzdvrC(0(!^mp& z{-3@ljcS`@b_*Hewd6eaCZh)dpGRi{6&cY${MehJ=6QnAXiujzCr}i2ET_r;7F&9T zya~0FYpL1rr-7qZfXd+d$F)`g<~SiznX*y=t;aMexokHaqge^CD-JWnk5(|AKx@3m z@Jo5rC=w$-{H8@ux4m3Lqk)4sn;gF}(NW>d}G+%ig$dSfnmRL~5|d#>bm_g?Az|J?sDoM9MNY9Z1u5UlKMHA@38R$Hwc?yp7x>mzCK7= zWrR!hm3p3!Z-q|i{NSv+^48DAX2o?nkEWQ)mX-Cn z^8i(?O^SP??^ZxIg0qG-X>+x#%EQ35?Y@Eb9WtgJV(VHEDH)Vp@cKiQ8cuTH#p@!G zTOYZ;eVx8rCLmB(kP4;qps-&~>7b=jGz2O`KYxupURn_XAE*}|nol#R#NtM0~UO-3V8dt^q9XcWJXAUGh2fuPvah)nOL(ax6q3gD&-jazad#>sCJ3P2Uu1GFVLg;8zDTn!Ic`(p0YvEWPVtR2j-Iw)2jUmb)r$`|=lJMK~P(`toDlTB?g zt#_EbFT1C60d-reS3uoP+Qi5!cfK;ahwHsA_2dtTZp6`5VW%SpX9uopXKrGo;dYK8 z2I%7)k-p@%9a9r%&1E^o1ohf`!;4DB=CET+>p=*mo!e<|gLfu8$>2)xt+#p-8w5mJ-PzCjU zM-}{-p$1mA&8C)K2Ttz_Lfe;#0h`nng}sCG71+;RvFyQ}T&u(xhL`V$``G^6INqFL zWG8dlmv0gLZ4>OShCCiRoahxr95UWBD6ec?7I8u9~Ag#OwzT+IV1OG!2VB%zaJ)tEMJ-O1|=Ea*{K2!){jP7KE!(zm)z;9OCpvvJP^6sp;;mIDP*?EF7PsW-MRP2!%^U!at3qmjV&e!;yhWkbWK(6`9-}|80ne0#%_h4_H zC%zvZ6lo1$T1wm273QDN3|z!giO?Nc4PykQ4EMpRq!@Y0mZyiFg$aV zIEDcybCR`aIq}dZ6%6a2Dw>9t32Voom0)rm#FFDjc8!~wX8~aYB1w!YkvrbMnK*Ek zw!^&4OOa4ZRl0syp^e{K^@C2BRxi|?6BFzQw|#zS4I46j7V{+5E~!kNe92Rsf(~8f zPw%-g9vy|hk(U49a$UoY(YsJ}bgUo1lyYAI+9;NDT}h!m_pGeT4}C}Q``>}TXbprb zrjV>Dxq`+gL-z*51K!B>h+yp-n>TbA_04)$gKe72ta|N^e(AjT8W8bpDD`{}d1I%4 zAoj#QZI30bX@4OV$mdCe21@UilZd9N2tKvE@nmDK7W}I|5iefc3Tx?GO|QJ(v5?&Z zdxVEhK*MbUh|7?t+;LZREd0kncRv*2-j%cx+v%LP+-IL{0vzrWtlss=L?YXme?w1a zCUokTU!&KLW_m``-qk3Z=G&m=z1w0rcT#_)6^fW`=T~HQqCXSQBIG-tcu014RA&;U z?@li4`9vhVQTitFW5ItsRY+OHhEnQ{no&)6bWv|k;4YuwLxywnn@yHKiG6Eb?gYAQ z7V!0X&1lE0a&qxoT$$jY)#oCX^o7@KruvYgx@}t}kX=!g_X~roBRdVA9^KV%FyIj7^Uj+PV zpV6uLY+UO!BzJG?y?0Ku!4JQSMPwoO*!i}=RwB|PY}2rUT=>a&oAokrBMeNd#()Unf3?~99rRfIT7v$!~E@}MB&Np zE^jAFXE)pPS*z6Sg}!@NHlrsvVgi9 z@K65OeOX#3@!S1B-IY>G3K}O~=lruzx!DZyJhd~hP%d$MH|9~B6lCeJHr~8pUKT7- zasOKT3n(Vhvqi{L*WZHwmjU(`x5wXTGsUPJXkAg`>qtJHkq*7sYU!T79e4~*E*UeHZ>?t4DHYu+Mv!z1@ zwPJa1F-FOWi(8*wJkF_B%mZ)EJO_ha?Hq0`ca1uCZkNTA|y5eU9A~2oNB9>Ax5Ce@FKQtEmLa*D_Z}iH$9b{- zO~{14YB;0mWADw2_qup=75m$y6wH2mEmc;?oK^t&%{s@wo;! z;vUCJArQ?CRT>wJ8L)G*H)@NGENnB7MBY7j|GA+UdA-e zLSU7ZN8%))0hU?$whh(}XHP?iP6M>O>f^ZDi6xI893>%_Y^tm>{Ow-9rn7X_t6VAI zSBoxjP41oNv2-22UZeIQr+opW$hh=LHZT`w6tYrW{Sc;XD(?zWO5w69>s1IVy)3K@ zPY_&=Hwt;2)01@;nl%*2t1!)kGkaIJJmi|0PYMoH2#va?a1P4rh9IMtSB4x;UyatL zeH=t>RO;(iHC8VYlipT$MmP&E3m_YJxV121>9^#OHol0Y2&XGHx+aLywqzIk(1 z?U)yzFug1teR(VKZ)yW=I$r8(q27<+(K?cM7CM5qA~C?v=z%KDs{k>Qp6z*z_u92e z8fFYYQ40T92ZHjzo$NF;KyO{=13Rvg*s>1tX(-~!>?*8<6CS|Vp&PMYAwX3^ir5OX z;xW#JDS(I$q2_U~&C)SeMWHL#k~KX>W@pT-gDJP99P(H~cITheS+(tMMmi7{6q^Bu zLb(_c{C4Ch%9tzCU!9!=eMtqw`JH5mDwfdSHgkLN%|G_Vv#7dD1P9UO{=bbxPE)K= z0#34Y#jIrMMMxsOnMJ-+V%+deY-|TTKn&cmWR?(|va)Hi>+1}u88TXqG6$0O+B!2f zp4lUhOX%t)mQ=$^>5&4NEM<|)LTN0AZjc?5o~&$`J&tv zw?88=acLS z_+()T3=nBHIBPRi?igJ)`jx1Ypg+2<*dr^soo8Q-WoKWdb#aSdPIU^ru*y{ZE;nII zpI2C0G1qN9&=$a#S&MvY{104k@Zr93W^kU@vqivr@W`zN=JVkWZQ5w8Lqp027U;`7 zTHk@u_DAq?T<{tE>ONnCfJfOqdwVuz5d(lVU1v4qcWi9PQM1j!DmQ7^|yC zwFJ?R4PQ0H1M?-cJR>hDc?e@;gOt%?wyU8>c!Ey{noON4>DSqR*z_?EmPq3X(^d($ zVY>UzHxo2ssAK(r8PF=6mA|^zvnJI&k?CXO)@-zsXY0)MHM#hUmVW518ON6(b{6+x zXp!Uz&SzskPkD@UAg9Z>AQ}>X@w?Tyu3sQ! zwc8z%&KnP;c7mh0*yW6Ovh2*46b2Jmrw^R0j0>mCcTk&q6*{dC^8~0+*4VeXWvR{a zm&en&`Z33v*HN1pJJt~L6sPiMyB%)Mf+70JJ&)JJlrnF#8voy?k)DLA-khD3!+B{z zv7vNSfk(=<`0Kn&Wd>%w^;R26#imjHIyvPDjMYtlr7j@#-}UTfR~~{cvopOFQA~jz zCO-0Tjr`*nC&_ykIE!n>hScIOsN?qGAij_*Hdt5NeB9xQrEB7Z=I7`Nq)%j=X_jrc zd(u(j;PA|Ouioy-3_0_whS}YSzXLq9C-js=#Z9O6ezTzjbpJ$ZMe=66DNKr%w5`Gm z)d2Lx;kInh(LUdI0P_f-#;UTs*NXxCa%SUwyI#W-RHeI@rG-V!jZq6c5Wi~~?M%I^ zcvV!{AWHdDczpnmRe zc8c$$4{5uu5h%u1&ta}?Zx@a|uy&!$S3CkBq=fcCdD6tmKNtcb)|Xh7?Z%GC?0mQs zej$?VptJ!(9_XJ~b|EzRw&(+e*gAO@mN!KW-Du5N3Ew1EGk|uodqx0)F15w^fYw7) zXw@uVFG23(0h$5dTuWPQmMAwYuu#fb++#cJUJ{hN_%Jyh&h<_A(mDg|?Q;e2WrA?GWBUn*(OE1LS6G)ZVFv@Pk5nrsCZ zIV*q6$29V~^@E(4Qd(p1%exI=fKo@w9J4L1{u=h>mSu zH*-Yr!&Zm`@8H&FWn5Y-_=|sLyC5i(k%@31ko@I&1|(vprom;M?6kws+={Cac<_x0 z;GS*2rzfjezl#NMbn6*B>QiX|*Uh(}XNDJ9G3!OaPel{SlbPp`l70?V7XvgEfLg9V z%zCf)`esC>SLf$;syg{+WsdH2w7wMmoHYEnaall22DtiXZYu@XzKMxqx4xcnYHu-$ z+<5D~cSHa06-WCrSN1d~K>%=Hx-M-3F22VgY5{aZ;7Q=Z5EYTULWYzvCAx#=y~^AP|Ve^2d4F-jWO?eeUW}-rGYcoT=$~52Q!{ zmGm}Qw*hD-pPgx31N=D}NZdZ;WFK%DQN_wX(+w|I9fKN20Zy|}zP^WW_>;^Tpvg8^VGj+u+3ri zFE+cam@WCWzvZsk_v<|@uI_oB4g%Uo!Lu?8_vSddJxsgKs>44PpAq(uS9OfjKb6lF zW>|3RuG2HYr5lKRu=P7XtcZnb1ZJgop**v<@3RLYR8eX18Zw5x4ci_uou~2;A z{APo7SeHdq6zGni5UCjaeqY6Qk^~{6m-Jh0e@%yK5wZjmZ*YdB*$0F5+c#^00ybyG zou-X-vVUrxY*ASrf_?;73KVPKXK`V*#PPRT9%EMhm~hO z!MyFh0Ut~ zUT>i6J;0>5xIFX;2GWDU8=c^7l$+!AL?AA>OAMOz80B838E0p3h!Jk;eGQ-}Dqi0S z9#RFw5=w@0s`aT_V-U5Y0U(6n*lV!b%dMN5l@0@F=77l&*lKQO=Dx7ZXl`s=5gV(+ z%qdVKexJCs#0wO#haA^l)j6R!Zo7@B$_K5ij_^6-1KcudW&e-iojUb9`O$dG>6*?B zHkxbzz{3P!w*=@-F954jLBF{{T8yPj6W#%^R&r4sGc1$w2vAA9*<;ZA@+YEK*(+12|Cp{ z02lAaVl}0s>|qZQ74o6%>G%r1Utq`Qnv?^_ikahHa>!rdb-59~Q71cKLydc=vl z2nHNKddDO1yHYB1_eC46bd4sNAO~L0kL}kX9`0VAmOU_zXWOr?Q$DnHa#{jgRC-?k zG!&p9y8=4L^Q-M}(X|umVHA&BuV$X$QP)<#ywNbv6Yu}=(Q|$PN$xa2eKrQep8=8p zE9~-p0|Trb-WPyEP+%P`0zP8UBMn;6313uAHSOQ6ZCS=w0drQMZ_VxY-6tHTvaeht zN`+|AVB%$NOjvB2k5&ZKq5YxmiJTqr46gk6C+lE@TNEwN#TPE4O#?RmAFul=z!0`C zUm~gX3BZ9K@Sp8L{lH4@xyyA3pmu&?vLw8BMN>&sdrWCWTd_l8nTv;iq!okgL*Z-v8ySnht_492SK34*! zeSg0W#mG-b$il^a&mnDXcTFrcH66h9)1)Gf)Ty}CtqA|61xNGX;3%d3p%Hwe^qK=s z*_fsb0rYnP5F*Z7ZazLfn&$|F*OP>ZjkT(eogCEw`nYE+6ZjKy;f0UHb3w(@GgIZj zW4mH2%l_{xSwU_@KtBMbkcyi}k}F_9;3F1|huU$sl>*KSsY!fBhW(#%7Pf$#Mer@p z>4&t1)Nrm7`@6unE+mxDIm?Akr#mUSqnWsdsu%;HCIwP}W&|LzfI7if1$e~-0$BT7 z!0>P}yD(zj4|h18CKUp1MYI5#8tPLa$>HIk z8`FFBLx4xXPIKF~_d8XA-9nJ695vZ2uNmR6m5^%?tSw~WB)GB@K>$p~sY=tc50L{b;UbtFKkkYtUHodLM-?B0_fUHa#EmQ!g5|o3h(r7h_wEDzLjF*kGgg^vf z4lYs2IRH7kghnV=Zgi$0coPIsF5dtsQdoO*c~2^4OQC3Bf`la4*abFbOZP*LjMN(?^wt`hwlKQ6q@1I{O|G(m1{I6QzzfFpN?ZE%5wD|vztmId~ zGi#ZYxw^6()qsW1bu(ukJZj6;3;6*kV-59VW8Uv>&sypxg_D0=u$!%otkrIxK^_@# zZ%)I$Qn^0zoCER`jX|yEfMXyfb?#Jl6s%KVR6c`hHuEYB@c!-(DTxA=u$Nk8A3Yc` zZV_2!Tk!nXjMKhn|M3;GqLM|}7zLD%s?f~B;9pscarLL?s*gM4xq+<539oj`ey%)8 zIdW4>YHJn9!!_Ka2y@CEJ1pGOHYrQM3O<-uv74@e`m&tLe+8HVqy9TAgvCDY_OgW4@h$SW9DYdTOlSQuqNQR1cT$l*d%Qs`bt> z&4K)ww8336&!{O>8}#|O+B@<1oe=66NO|&FCY|@7)Mms=NuAcq)*TNSdfgd(#Rdn) zzkrq+grQ^(zw*mhQ*eQV$m}x^$Zm1C3^5yBSdv%ciB(a4zYcxX?rk#X^g=-(WFMB< zeAvXZhH*d|nFKk$_ix~{OYF3GoIUx1cw2ITal}1LpQLM!7|rcRh1`c^#m>oShW;R`4^t7`X&enX;atLxks zep1sAa{O1_^W`kX$b@4C?(|AW@ILnA#&8i`~bf$DmM6@S~GJ` z@ZCvG_tES%9afg&0deOst2a>Jz#%D5N;oFQW@m_;Kurw$%SQ3e9Ukr0I{yYdQLndc zet#O;S`;FG5;2n+RzQLQ!c{PxoYU|YtK$GjUTbPVM39}^gQ2#7s|fEJ5g_nkcE~fG6&HDlMlAyhK)DOCB z-v}&X1-Ay98Tq*)*3iZ4I$h}W@~byFBRYYj_~2tCld^&dq@`gjwF7b9yyPeZCx7&< zO%GzXwEe6cXU>TxBC-@_R3~M!?1R;ahY2`g&VVSwPT@rkv`c7gKqm39Zn&z~%YDt# z|BIYWm|g_rP%<@LdetPU-o!p!qvE}T|5+&L=&;fqiplHKr3fWYcKSaEp2srlsTk&I?vdm!a@_gqwM)V1$3P^SyzzfiLtT zB2&I|k2Wm(m7TI_n#2Ek;Z>aoJ9D;zpu7P`Wal-f1kQqjs#q^7BkK2x!>~~2MgQ|v zcIGLrE;e=Hhd%?EC+?n$v(1OG?3=$V5O{f%=Tdq`CW_ATvb$frM(WUXe)%VkHh+Oh&*y4e6yjJEloZ*OB(V~2ie|i4yIz>>)Hn$ zE3cP6j^|FF!<1IsvrPfK6+a7T#M7T@ml#_|p!%k=RSS>MzC?&)v;E;gv6remJtQPM z+SbW6NLv8C;dFU-pMnrA+5_Thj%r|n`CaAcsss;e^cCS*+rP+(0GS@SYVu~G_H7|>Mnkx zK~+udl(InC{%WfFP(FA7RFo~Z{kjW>1O5% zEaD1x{j@+0c3^g0qqdinwzbu^*w`FJ_%xq`a)-N)1G;2+lDaQj6q%}S5!bILxNnw8 zs?6$Q-Z8=_xEl6|`a_9E_wUvgrHp%B*XYFt^z7dvz2{?rX3E=V2 zJ&BHRhqZrqA#3Ts;4!h3+QqH5xbjXr8WM9*3D7)Nwo_lau{(Pgrm4z*a8Rj>W60Fn zyJOJ7<{yCYouLwCYK!`0pWY0KyE8Q@!Oe*l{%YNKNH~T~E!+DsaAB~BR^f1r8pMWm zIjbpLD-3u44H8Azb)67&V#^VDnM9QNdh9^avOjQ$&wUIX=QtSM<8hLzWUE9 zZ7niy>DuDX$DX?+{*nHsS32WHJDnf;*5vLB>zU*xeY++>e#@gSK>5wljb^r~_<=b{ z(AE)3USzM*kKq&Qx6=D8V>qxZih3=*lM-57?3@W`MYI=5xQ7)cZ7?LcQKlk=n0(2q zOFEY#0-=6fBA8=7XTigqGpYRmE}>O$t50c?`l3=w$E3^{s42_-8joD4yst*_&MC`D zVv@Cvk?yXHyd>F)yszJvTHIw5;aOT3pI9%OTW?UG7p@Q66f`o<@Oql{Se?GrA-Shl zP!82gIUUMUvG8(9Fsb^%2aryu#pHzTp+v!-K-r;_0f&7taG*h$A0S&>i zp5h3fooVQjil3;mf zaC9DXzg1cY=Uu?2mg<`)=Hk*=v(R=DRy-vD=ex8yUTn@CR#Lbr6rdrA9GgGNlK9nbXd^8!5+wmHY&5E?|^-kPU+ z9G_S*e_Y)avUqrwR4!LT$-)wd&=~V)pgrJitIPHj2|ul%bCZz=%<7X{7&fmTvXxIk zR-H@cL=c4;4MOHiZC zNrdIBR{V=EW1{a$#|{?WBoiJOG-?n^9<6Ntu<2D!M21=ss13I43H`yx_p@9gPLf0$ zp6I6qhOH?$qd1BHakOE3{BuN%ac`}<$#+P|+SNp#@xcuzanim*RgI?`8VShA9bCvE z`ObNE)Z1bmybue;TTz0s4dizH$MT_@2%oatb~-n$ytx+9v`U%Ewj2l-X!_$0?wd2a@#{zuFelf=6xO8?$_52)+Y5n=HpYVX#{O{t$SdU0jd@7wZ4tfOqK zytjDFQet%~c)n^f6*!m)#_C)XjI}zfJx-hLWZ8Dy@raI}DE0ceM{!)q&haP8k-MbE z_I*32hoFSE8LaGz92T5I;2;LKi<~;Ot!5FyrFpB~1F3@c-u>V%9ir8`$05P6Qlyqi zjfXSC6Yba1alkGfT#o#Zi+JdBAnnlrN-{Hq?toAonCN?>B%Za{ zr;I+>I8HEXQ)NJbFC2Sp$B@|1<8G}LGHhc~w$kE!X+S2GqkwfEby~MHM**s2%8OezxP)%!vryC9Oxt~C@!1_Fw?Yd!RXvgd zNPbC$Ul9ZXW2yV%KH16Z2k~d$heXLh3`>-{)0_U3?BY+!bnxd#y|N(;c0j~+_QYya zSgAZ2lMf%wefzR!05RRE8^=d;}aaFn_*j253hF#fw zGs?L$&az0_wWldj@(#~emX~Qu!Cx&z$Hps!0>sQm*Nobwz0;Px1~2IM*C|R1XO?`d zZ**z5hvkfp?ho4Ysqi&M(PBt~$G@(DkN{jiI7q3QzN$Y;&6E+!lBKOWa<0qiW8}5E(#FHea zDmYkkS?J0l3d2d}c#R2?Y&KPFU5Xe!>fu=%-imV&%AJutkqnr=7Bq zev9`Y?Q*Kdz|FhY3oqw~+9_Dx=^Y$(cOh&A0JmvBqf~STrnWcx4&%6)OFRnME@rnk z_%9RT(wQd&&<~gpX6<_ge~t`uiGyWvP^0jldMM0 zHe_^vBp0zUEEIkP{w8ZMO5|c~9NG0TGK9gAu2i{1>AhR}hhcRrgBjIp z-~K?O*i@Ai3^_C7Mq=-s!P5044ij2=(8NzC9Gi?rWf~+2yjuim4L2fYS?nwdzbx!> zttjt?^&jT1Lhg+ZM@?p=T!0K$q(=kPhuI*K@!WM$w~g#R8wr;tjdR%gHyGIJm$+M% zJJ}>fU6VVCdv8he%g-h_^Y^6H7lGQtgql8f#^uYDI=0#>X@Pz zyUnspNy#P>J^FmWxa^TE+GDNEzFofDXOjUxT3T9(1Is7iYR&uuWtCO!rW>usEPC*j z#ZOc3!6tAHr_s}%InfJ&_b{I}_u0AD_&v9tdbK{Y&XqdB<8XEBd-QFVLul-|;GuZ* z5;5~Zu=UY)-{-jLV-)Jh-ZYu1!!zOTJ*41sh>mguQ|0FYlLw5VlJuAK95#j97riN9 zKkruOuueU3C0zdRM}6(?oMWWSn+Vlo)x= zR=*Kj>0LEQnZLm)_jD~T`*H-gLS?h^@zYiZn1Md+4I&~8^~`ebT3OuIt`ge)+UW;1}!WK<-r(}BDK;=1L|56RNd7P;v zWJ@GR;%uJ(UFqIe?Bta+zhrufx3*1C3z$ za;z|aS>V1tyJl-R4TA~yda)+PPaiWGl{I|Z|J5+;O4j`MIR&7IR{un3?42lm8aW(q zOvB43EN6QtO4gTFg0)&t5PBE}%wrGi;s=M_cHwca4|T@%E}%)eqdn9qoWJ&@n7J3# z<)Tu$7j!KPvxBP5wcp6NC` z7}gg?kp3~b(*%lPiB_3%7Ys?ozI|d?g^MJbx0q>z+Eowh@OzI#<8SUY0RI>CLT~2% zXl*j<6N$~rLyjihR5L!K1`LU0{Sd{hCXeS!sxw? z;y_^v^YExc*Ypt~-uDj4=CSO6p1>vCh5|olkch=QKl663NYY1=Bq-2mHa*5;bS`=u z5w>u5!>S@`zDHBuuk()4!fd#)S}WM-q3%FkB1b77`*_mpNksShy?4hw~a{mpx=rtL@}fMF?_Yjh2J0b$>*2djc2b`$-x!F_Gcm` z=W8<&8w)6@SL@4&Gv-wn$s*6;MROmPa|%s+kP`u#5wye;u%8YjwQ__2OSS?6m(Ypx`Y z0xv{qk9{R})Zw%+#C$qL?1K)0Vc_J(aJh{J-CpE-2`~6k16z;}m{ras*&b1IIpSOp zd+`IG&hlHB{iK@(!I$gS_TtZ&7HeIlXWji2);1RO28EJeMT3pP zNud(k1FiPg$IQcZ@hu8UR>>McCVvp<2%{=cO7HJ+jx7@-L*-x`L$9`6!;_2|PI+x) z;*rtjkWFz3`ySz0SX!r;uwOVw)5zvMq}kwqOr|Bcx*kGM!MeU`-z^L{8RM}%Pq;(l~|Kf>` z&e4+PV51&cnbotA<3Z*F=Z__=^@$q7Cq`;v`Yl?mAwMG4uME-~bY?Zo`47rCXZQ7M z7THH=E&XhfZ9SR*Co+ue8;oM;!mWz`NaA6nU&Bqxc#8Oaw9j%2rb?c7MSsoRhDZ6V zzmOU|=)R89PGW)`F5GZ>V>UVCLime|txnN2Um=VzvujiG5L|Z_Gq`-&uDMT)xqL&G z*dMP7gFF^OS7u!G+cQnoIUjcrBrtmV~433 zC_!(G7*u-8Wy)}+*{{zt8nxH}mbm z_ksWv)hM*5sNniL9DJG$bq@zfZ^+9Ae}R{_&^gDctGl3yIK2kdH139VQQ%T4R4#Q4 zE)G;^$x40>6}9{(<&nC>{QAtYMPXC464sEpzpRn5!*8il>ExHZdatd-P-fqR|AV7v z%L;b-+RE151NCk8VTiog8;yJCMP59a)gRu0Is3A26=;MvSn2NbtX3{PaLQCJuT8Xp z-TTnle-Jd1tS`nbzBpgD5y)r7A)kgr7OA5R*u;-ioaCnX_*NIYA}?9DS#2g{Rjz32 zjlMy$2=T0^)GQx7Vh}&v$#J^tdB~E}aL=RNJMt%>!n`!?{4$r3KPOx|q%|BNPhA;} zIy+z{3;!*yEY%`Ss1N}cKP{Ou>!DQE@UXA^mob+A`#wcn@$u%*H7!R0!$)@gTIMg5 zN5${_bv(_M{P+j6u>CdnjJ>fhF^b~RLtdz-9%(S*L;Bi)FsYRSC5XIDDZuLe(`9qe z5L)+wi^|7c`=)(CGW4VMhum`ys~&39S}2CuU44y0^ZR7 zqN(zeC1l!hEznD_Y&J#Rz4Cqi7bs5<)x!OWV(_mYPl!R++IDt53T%e#>s5u(i0BWZ z-!nOcb_~aJFX+0CnhT%7J-ehOUyfE47PKm5e9a z{iJQ|du#)8S@6LF3eTwpf2NR{n(dk~BZvcQjkbZo@Q=_E^w-&t^Xkqs=EQ5G1_|F} ze~sutG!sUO3pkmkzUw;uG)MsWV5pB28@bQ~doF2RT}B%@)QXK#m`lba%qs#EE|XRc z`^)3gH3J)A6@=r3>QZzt$8#kM}Ba z>mcISd9kO~TOuCmmHcR%Y3>F+AI1@6&z0RJBS_~@G0I~@MT^IlT;w}#@SOooAWVMUc-IQ5dvbJC9FWu)Bxv6em{Z}VgFr^-X5wEJ4 zEBGeiHl+oTs531+tm)~+KO1L>x|drO)C)8F^kfRf+2Q^XO%@uxf9E)d4Vvt7Wr1bJ zJev-|E8PrY%&8DSB-9>mrX+ASa;;7UkfvC?CNt5*lxtAyVU%l5K+++p27lbnBIKSU z$hX;_;JD{kXDI3Fs(4p!9%LD0Rfc>d%jkuxno)tZ%i1Q-a20L!e1Nzo{Sr~<_ax{D zXOl8CL}H(FAmbg&JO@mFlIr$cY_QQdUQ1m|Uje~wxz@egvo~8!9GYHek110PwEF@r zuhwem>5T&G2ybG0)MwbUF)nQirZNCN!4^iSJfRYolWkt@E>6#?XySN2$n+ul^)c^! z3Esf4=7U*tw(wsZ{zH9T0yp}nmSG}^jF{qgj=LjGCv2mGhNr>(P8?NG5lw+-nBL4k z{S@;C!VZSSu7gc_tNGMZb&ONC4xYBsoMN69)!z+90&xWoA9 zncrI$pFoc3cGMA@5`GMtyO3|XM_7rq(37wZ{N}Z4$Xc;GO?{>p8g!xIY}*29hkGrj znpc~=XY+b39FIXXP1#6Tm};98OKlEXt;`dot}FlmCWz-BGGZ@Kn;738-DqX zj7;<6^)&dVs^(k8peuTfA1-uTb3fk;6PdkyNtIMN6S7gEX#g#7)Z+~1}_=DSQ5 zi}0bH3$i3a`i6kXBenC2ce#DY^@HBIVqn008{NXx_;a^E*iff;&kfIR4GBqiZllzu zO(vY9Lb?^)D^;=#@bU-h?b5z+N^BFFkVyCbv5oKD<*EK8k_uUK$-o}sk|B3p7zgXR zthrmib@2bN_nuKrZtMOiR+hK`3#fpA1*C)0i-5`k1f-YHQIVEVqy(g^h%BknmEK8c zp@m*lq<2UNBovVzdM|^6r<07&z8C{_uC{<@AsU0OE`#v&+>bkU`-gjvd&Sj&7Dv) zdeo}KsS@P`J7W-~*QA*&P+i#fae2Wq81s{z|AfN?3Db_h&r(@eHuroBw-YMDwsNj5 zhv1ZwpF`9aUQtYLmp*Hp(;mRQ^@@GaL}rdQQe;^AwoD{*{@8gr%$mn6Y@8S%%@CVa z^+&5wa4c^jQ9W-&+Rd7WdIHfLJUy6w^5Yput>8${OqPQCo%LE#rvZ+zBm3+}6-qq3 za_uEB*hNS+WKCyKdS)s3wH^qBW!DWMgd+jM&iv?pXmmU(>YhlaC zlbaJkI}lCF-&zx680fP_;d|+T`UGJ;&QJFHrN0Q z%-%yXREuYGcO0wMkFWR2&e2TBi|6Xb-66E!|HWi5Xy7gje4{;HAX-*AeT5*+diY74 z`x{eEC(MS~`}HJzok~dIVC+dZ3)_K9jdP(R$ ztBg$E0ATp|CTs}o;>V0%VV83MCVtc#IaRR`*Uf@7no4w@9optCyyE*7iy3o~5Hq+r zQP|h6*JNLr;hOH{bgUtuZ&OmyW0J%qm^z$&TFAtd{J3hVNG9r(#H39A!`!ac7=EWC z?6)-rE22l=$BVbO7ruXG#uJWpfBV>)3>mt0u{%*(IkBKI^OtH!?svbLTrJ-0zp9>l zzS4`h`A)2j1xepf?55lk%agG^t3=k(Dw2Rv($rC@K5?5}N-H6Al$Q zuWXB1jXLxS!Y+|cKDnP!n8FCDR6Z#%n0_ENt$Kioy3k4b9kc1{I%v|T+z?hc7#S=% zCz)WPUh7u=&Y^+gv>;{)k=EsgFy>c&vqZIc)%jEsZ!hi;c+@dzI{>s-_TrjqR@y4F4g^4<;k8 z`p30WPBrw>8*p{H4ZN)s9g6H~>ED+V~z81H)}~?}80vRze>e z_BwveGv$%sIyrsQ!ympb9P3DhEqY?5mu$c4p`SdMsZaV zrKIST1bT5h4Qhox&#EThKUp&z$c`erJ_vIBHg~2^kr_&_)P-+0hVEz=lW>pY zxEMH;<}qh1OJ2toX5*~{2HTa(-64V+@=u;bEpz25+l};Cw7>D$?-ABTX4E-w{lVH_ zv`7?ZO~;nW4Guf&Zf|5+<#g(F<%ge?-o@=b+;%vzRTa&(DL6{|w|aiScH2HIiHD#) zI8k!;jiqQ~?*;YyAIICJWK^hU5x%JtR$;xOzKd{LH~ifZ-7#a9MYlG=u=`}q+dFwv~+dW)WY{d$u5Q0vY=qP=LBZd?7Qq`h&+68F;cGHKFr|V zJKF{;gyzJ9nF^F$A$5Sm>OJUzO#-Xkr>_sQ5FrZBkzDD43(BO3;PuSDE>d7w8C zMSF0=P4|FxqGh9!{tYBA*C2L)OM!CuctYrLs=IepnBA^3L&1ov|G)=bn^3F7%eg(a zJEN(gRw_DfU5dV23ljJmOH|>ITyZQO-7|W#;RcrIgGw+aB&QIH>@1uhrs1cuc!Kf5 z7V;+H=W*RD+rhDI#OQ=H^?bTneyS_}T6`7K^fy}z%uo*P3xmzf2YGLt-#;o+6sgVs z?OlPEp#gy(sPV9rwD?vHY@4$yTHIr9Zo0aPbrIceXM5K;AHr7R_8G1}Sj)_8b2svN zC4F@Vx@rm$&`Cf)R~9_^S!p~B^DUtxR36a`%cK>N45ryP?2Y)86*-jy{U$W>uIr7@ zOb*bRh&MCeg|b_Cr-QVZ{IfkFJ@eyiaJ=X4;wJ%;TRjBo<-Lk4EV?SH7L|NTbp<#Nl^O;lH;xJ}vT!iAFd4pZd2V(AuGZ?X z`cz)wOKys^yuD{PXQRotpKQ#--Iu&t)ysI@$`tx)Ja#p_{C_SU|09l#;bC&JFYCcK z%jCe2_$|UJOzhc)4UN1X-eC0_#(0daE`?Pjq8cdSuYMIPpFcd~6Wv&rqB$2*aoW7Q znROz~DEf}ww~X7>zu6>i7DZiL2^qPR=V1MCG{)9}Ibd1f(y$UF-7JY zI;OETP&?UzG5+>k(bZ_H&+)+E*EXi+rxvoHYZ_}X5?z)Z4TBzU#g7`yK7@-rjw&)A zE<#OMq~BF*Gmmf+_v{reQW0byrioeb1gNCH!Q*U+rSLN4~uSL$lD=uv0+eG9C+G9 zzX_Z36A;wr?MC`v7_{nha5#&EV^YbVEFyjz{DiGxiL+9ng=57Ei{dLW9B7zp{EEZi z=(9s5wnU05!to_UEcj48WQS8#74ud83alfj(e6mzhB5gQ0&)AIbd^o?tj|{U+26e& zgSey^F`cQSwbRSw`&#BBiiaV%k7~pA0%Yaj`WNTaD}9y9Qjoa=EuI3Vi{)Bne@=+X z^ZQo23y=+Tn>hT2#M z6Xl?}!=j`1C_(mtj0O35oGgX6S?pmh9XXTH)n=iY?6ja@GF+6BQ;>uRDrmpvtzQHs zP^U|0z~YMjWb-=oMH3_v>GtfE5~#IPgt_I#NGecGZ@q*6K>K znW)bI$)?inMC*lcH~!B{FqxL?yl#hk~gAFwOi zGVrZO1ySTM?dgS6__{-S-`y$cBltnE-gosCM;=v`$SfBqzT`t5K80I{K$gtd9ICZb zp`pM6$kOf)+wJ1r1btE;`I%;TvSh?0HAqd5l~ktK&kr|>Os*Lep4VLUGetVfpbm`(Cf3HM2h-MVJ%~{4mxqJG*UQ8H6h#G;sQ2iX6-cyIT6Yt~6szg$yb@a}nHb zbMnC-z-HRbkCX3LsjK;$<*f=~z_lyWD~>|>TBtJEdbrJA(1 z^HGo)Vct7P!&t(Mr&q0es%Gqf4g+I_KA#6AvuZlOhQU|0b;o`PB~Qsalh|XmWb@Eh zEbEN#^YgV$$`Ole{aZtgaHmFf4~z(kg~ zk`52dV+us4(z}@LQ^Fv&~y!?;zL&`iiyYVOhA3?Do<>5cZaN@gdf5LV5Z1R?IJafhB&*yTCu{Euw-9o8@7K@co zi|2#$tW01lDJap7Ugqx~a4R3B zn5Cb-^P;(^~38Oci8s@wH=G;f!_& zuH_mSALqlM3P;?xGkjuBU#}F(UMs9(P|40i;?|xqzs!Z7u$(EsR|4^c+oiBIhe?%M zs0nm7lH9zWssp}AYkeBF@Klm8X`q9SZVCNOFF+@b#G@iz-TI=wy>!KV1$AY})9IF` zzdxEAHqygVVLSdd*0}26PYvVR!nnK~^Ck{U zh(_jfR({mzA~m#YSOaSKO?YZ#(`7Vp6jQ3wa-Qq`s;Wh*yhB+cs@(W@A8iFfOj#fk zDkWq9KeLb;9hgr~?5hrStQdFjBBFaL*Zkg7K0%2CsLzEarBS!bpRW7Wt`9(WUvY_{ z+4yvp!}&UQb5{xAk;-?U%8s;ou|_9$HEAj+?dZJ}Xq{0BjlibMDwlirUR;*DR`{ut zDYf%C8x}JY_>39TwbT`9AAZVnFL`GCJ7l|{7ZfePuA(q?XY$KO927@`knD92^xmrn_+BKJ;vmy<@oj&@ZhJR@r zKu3`_&Gg!9uZ#*BvvrQ$L?XYiof38Jrs4df8`~A+8T<=8LEW! zj}!zd=A~_sH66X4F8h?Qm`?6wCi;At^?#$ zV_|O4Zrd;#M~>A}_tgok!g%*dF=BMJG@Qs6wp-?(s+2+;Z4#PtBn;7ro|iL#7Cfl^ z;$BH7u%zsKo@bVrci@2;YN9`DH`;b}>$|0yet-U3=ZbGlSQCL7+P*B0_X}Zf$WX|H zS_)ecQ*s_B@?Bzw-kMH;IGI`WRk2*ceN%;6vCheM79#{+#j<4wf{HWW;J4a+!8tl@ zR3HA9L_457MU61ygov%7&q6HGc4cN)Ur}dcw@RKRh_+eK)`^TO+}j<<8y7y7rJ|cB z%-^?;zOBRCwpC4fWu~Sk7zhb?5K8cVW3+wBQ)dxo&pd0heYU6PuZnS0<hy4RIfhQP~cpdEx_FU)QV_x7wcQ3$G7# zwja{|*7h3{*IyME?o-)^qPC+UUWF#U`lzRsPVq0JJx=-4GRc?*7+WXVYjMZqp#+6~ z$0>u8PNW^=%`MNqx?j$Ao+zP*`WhexAEi1oF?$%oN0@p50OeR{X8LVuB(gFwc!bRP zDGMPIcR7In{wXjLqLO;PJxw~#{HvdNt>q|R(_arHO1f%=eDCGr=03p~u+=}D0!_eb z8vV_(R5T~z%gaSO&&)+aM)}Un6R}$w?&~%~onze}>!@B||8zJRFYQbW z++Q6~c%Sm{lxT`ZFZVk?l5b%gr9>kNvrqQkdeG`_H1rF^My0j(czPy4W)WAR-kVHG zEHW)Iw`HMnDe@dVTd{CP9@Pgf9~+ZYkTv}x2o!gs9k8bQb$pk~|L%uAe!3gPGoIYD(BMXCml0=Nx<&1HjzgZhKD!By6{6JHAdsvAHUG`stM?d97dB6z&u7>1xU zco5KmZ zMbrlKy(K%icX2&bFaH)ULvhBq90A^DIMP=fS0Kr_DV?Djl~#=xL_X`4Pj|7BwMT=i zC*Oy+xHnpdVUe zm$SiDZ0h=h^vEa|b(YE{3_DDmcSonLa2!t&-1eM4QC%h3^-C6m>h;M#hL3v{xH&59 z37J)Ur}u|y&9M0{2fr@emu{uMe)Q`-Q9WU}2R35*m)HN$yUy^-1cCqjH5fngYk$OF zpFX+pOZWVL{_gVsaJtj~KHa}*_b*&W_5UMAsmjXE&SnaEIc?mKU2^)%A05qwEtmfJ ze!mEW^c+vM{HNE`|Lr&fQ;k%qRBQgf2WtGsX}(ZA-2Mj%5^RSQ4g3%N^7H@hm;cpf z9MkaM6E*&~EcpLTNBY0-?%y)|Z<+lkqd`UWzcw5Hmf8R3Cima8`|q^-#<|~t{VOE- zg(KG{T<6!E3(2neWPF8%Kf83!VB{RbRevKS64_#OVmk7cVlX09nMZ#cnI*G`9U2p0 z=A9pp%Y*ESPZdzn-29jMH*4$?yFoJt*5f)32e1g|-@d3{dg*alw!bpuKpsCLc{=UF z&3{pe6z#^to!s%1jo5E=*Tv{gaC0#4jTiN!@o)QFHixAwl;F2;Y*QCrKN9@0awmZ_^GY9S+An$f z$DRLnGZ$@oQg90O=Gwz=GFxs^RsMOlp>h!y$bO;fEX}$9_N@I4olm8WPf<>s@Q~=w z%T8tLq;h%f2?j zq&Kyq7f`a`&M6<&{g?Z}|HG`P&b<5Ar^qm%RAUWKuCaf&VXgA~*Yyw}q8vzJoK%#D zK0|L3gZ|sWWI4C4|C@u|rll;;eeu5lW`xfE>&jIks`fftF1@DQkX!uHt?)0=s-yNX zJO5vO3m)vZfL_FS4nQ9}m+wC(fisMML!rc7qxmtsUXlyYK{KH1&}K z=^Suy;L@TOD+C#mjJYjh*TyLt_acI1IK!h#IRS{H4TtaOMef;e4qiCfK0hz zPdj>DG4u>ob*02o+Lgm9Jv+OkTB;w7JU1sx$GvuMk4>Oa;5^ku07L?PoJffl4V}fE zF|=DVuUW0TZ|^^w|1)oj#Xc&}`c!HuhqFq=o%j)Vd|GJ_f1QbL%7`RrOuZzy7%R~N z`|<h+_)4i_{H#kQt)YpbdTJO4)IXyji+DDXQKMC=+VYe~OfvX5dV zZhybPN;~(0@fZ41Q3Zm@h&Sj13l4M}QRYBaz6dPz!V|^Z_9!u*VqRSD(B;xh?tg7# zG5AJ7IaJ}F4t=Q$sIj4CY@8r>^pnM`>Lt(~RFyG}^lSi#x-;$Fhd;hL^8wyaG3A3W z-LF6#Xb}S3*k&0Np){YkFV7<&(0zRDyS=^B^`x)AH#c)#3wkm(c;M)J&o_!pbEHUF zGS6@F9$NU(BagPjK3Df&6*#j;Vq$;J`|~?b_owYb9UYxtZ|^k)K{L~d@Yp4ZEl&00 z%UvqMmr42neB>i{c?GUobr?Yuod?Nj-lgi_v{{@o*iiwD8Ny30o1R`WmYsV?DHAr5gG>W;Hn z@t=Co@cF3wr24@RT}!FxG1zrm=;G=sxttN*{q~w3$gvPCDbr$ti_Y&(QWi3YL1i#5xQQq{=r?PE>nb!6D|S3^TRO1Y@Ul&Djx!nfPqBN@(~wOyt@>Oi z%DU^oKt-h;m;r7~Pm*l@>Q#YzaU!11YgE1)U-zzq{WOpo%Lxe*Bum=)iB8Gs8)9Pm zsl5jp>rzX3zZ6bYZM*r;%dw7ZhJf}Uk8se&K5djyl?Fbx~1K8E_WLfXDeOu+|>m1BrXurThw;waiG1RmU2TaCU*i#pE!vfI|d~ zc4~ph_fKYCtnkVXHm8AJOerj<8cE!))Dettc1pvae8ldPa~Sm)Tbx4@!-DP zXP1nQifxf`g@)Oeb8m5~wN4WC^XK3ExFL%#3(3+JYOtQfmVjM#^^p8muU-wBYbylEtYVU6c5~x*o$R_#&3!kZr?w@M3<*kV%9vxj?*U!_{2hipnw0q_AxJ&-m0n8H)FK`jyl*)D;2qYzseKZ^L~e%9916eer|Gs|{j6PeJ@XXTfGe|OQSSD$&Swdc z_q^0H%fw#S0ie0<%_6M{1ZAM;YNM{J&+at!F`$md#G*DXZ^pl%Uq&~FZ}w3EFfp<< z?gO1d_hU0P(5Q$MM6;R*Wxy3EkX=_fgC?0pp!U=|DTbN-Qxm$6zFAEb&_VS!`@dI? z_l^0fvl1zH?hxzkM8rJEnsjiH?gY`kpjEOEVcX#j506pE6`?`uRG-hwrN&sqY-VJW zh1OHTYg6iLsJZQ>8EX@jfdn+m_EKMDOX-W@)?*8j%rm$>CBzq6W;K9RNNZ`hr)O^N zF8|FHabs6s1Y8R`P9Gw6v?*0hd|**)KwB?HWE>mIFe*~O4c%BGMCUGiNx$9lOt+}0 z$jh&9%B$2uGgi>7Lo#XZ=hS7_a0T5QSM<(8Z61NGkX zuBSjX;#+(Ui6WQPdbSSnJ&R-N@y+>qh(g_g_Q)nGH$%LoSSEg%y4ddXh7%&chr3Z zO*l*t6Q`4s^j@j+k|o#O>ivT$$gw*5Z^ZMXzhidsb~z7fVgDf$u7jq@Fw;3lFHOT{bXG z-TRK|0|OhBr1!^W^6)^iexqe?kp`tYpxIcUg)`TLbq*!Bq?@X#st!@c{VaqU$p+!y zzH@0P64xIJE$-^W9MFT2+92EB2lTYnxmLLU64UZ|8DQlH7TUOF$z7eyl$G-90{Pev zx{=I>1KhMM>v7M8nwf%5H_)Qz|!mBSJz#QoL&@w8u8(QQ(Hx4$`lsG(dphvDo!_ zOC;9nTuo(-%oKa45=*7M?vt)FmQrfZz}7nVe`b~N8);mxUS*r3C}iAq7%a!=b$_nC z+X;*WwyrSYAH*i^<)?>FCCt~ftn z!!ujMWn}yFgFURU`LKr2e>g!8o{28)w}O!(jYka+w-ewvWs!zn?LOnU)^dN_;86Z7L^*8+w zv63;_7>r&RvxJfN4!hR$XKva3CBAAp4U4L4`MB|%_6J+A>>Gh5hV3)8?KeUdj9m|}# zHJ3-x7Cg8jrcQBnQ2uK)b+%;#Za1}>i$_DRb&B`*-#eI_*CzOa3?t*{qMA()f<>A?%H@gydNMOqkl z!cv6vjc#GPKe}|Z2at22-p*oLr4P?5DEAN*;m4)?(8)$4B^U#9(&!5e!Qrf=!52+R zp@TrYr?l=!xLS;rQC=&Nom|3C4oH>!$hArkkyz~628KRCa(il#e1BN&iR!?y_s(mY z!UC>f=VUn4J66#>CNYY|=K(1kIa|5A1UF4F5J-@swY9l=C??Iyluesh$t z?)efYYulYF^6poEH=doS5_?xb^X1Xy!xx2Alv$1VziU&upNy(9;3O>StVpDxx^6je*`3nie7%1|Nt~fHLrnv8dc!%~l-r4e; zz6q+S4yVc;=FA0XjU4#rKIrE5+O~8#h0U;3z;^wT<)VFG4RO!l#aLj-K=t{7q<_hvcFX zlb36Eh=x^1+jcIi(@2qH$Eoyp*@-S+G2*CHz1#t7v(?4-jcn}xWb`+>LrZ?b;SMR` zK7D*d>R!5_^~JtA^LQajejEQ#CZO73g1B%TDiORpd6>x3Nf)k|^m6`ialz;zYXDxV z%hIW77SvH6sSWhVlH7JcUyV_eUbT**n1fqx2|wdE2QOesl4aN(_-&pqzcsx!G#SR- zwrzoObin2rjTy#quuA(p(Y8rWop#~>`R-PDs%RW*l9a2)q>&G`VzO+mLQn)#C#cU5 z(iDRwd8GbbR&Ya}mh}*EpD!ksBal@x?~TH^a8J~2Gj`kD3BRPAlG|rT90OA3bAa7u zvJp7+k<}YtS!s4YQ$Eo#2l)po?TUjEZwadygTo(rD|_mff}XSHg*l78;p3zSOY( zV9sDU^jAkI0aT;i``K_J!nlRnD$^k1t8uw?U`A$Wr#K{}XlkG8kTQ9nmF7k({&aa? zrfki%PCB{$pDQEa+>ua#$ z=-4vi04(Lge93Q?Qn+I`E|>jDAGt8!4g7R@wAd8Yu=gZx((N{BZqH`d7^oc!)|J{; z$;5!mTpBh^&rQnQGanfo+3^#qYHEntUr(W(vAqZ2mq%sZg=Etbty2fPQTh4#&hCk; zvy_4+|(k9BCmj%s4~6$aR1%~YIy;p$f?&a z+>I-t>Ff<;J!5-Mo5~;E;A$l46EF zsARWCHF|HZ9&81i%hT>&Vy9lX6dkpNm5`S_{kHHp{)>=LwB(oh4T@7zyV~t+h+7S3 zNAixxf>!(`S{cNI!L+Zf{5>A+xgHt$hhGQF-sVB_q5Kmc6DqN7rJK&cOqo@fZnX2R zrBE^QS(E8!%I11tyA6$DGfzP9g?{mQv!`u&6_%MNH{P-#P^n&cTnb%1zimw)@h1A#zfMT${?n$NG7O8LtvrFI_}05#r{ zzIcT_HO<1$mCfCI2ib72)l{huWSdbSf$S_~T>fVrpZ-9Z<~A0RT0bZHl1t@cs}ukA z@$EMx^j51>jXWY*HRds8a%xiBxK|DfX-e_OOV%O{JS1>Y><#6zK|t#`=9}ve=7#I$ z(!BvpuTx~^%Iu{9Tuyp<0XY6#jTf5NcxUQ*{n}_WAhw#IprDJhvo;8l!n~Hxbd#Vp z9j{`<<(`zfsT}$BM?L9Hc3Do?dH*?xXc}?_i%YFX#h<0u>t@D+-u)=m81AA2kI^C? zr-%V%UGki0mLE`PtkNzR!yYuw!cW7(S6aV2QLHquL-xLEzD*@{`9}OI=4Vk$OVBVV zU|1jkY)NWA*m*u@B|rCe=GI^oV@s(zQ^bJrTKDhuVh8#lcCz$7(%~F~`)kPv>`$tp zYY3jyvmodfrgcG?m-R24yP_D(&|f>HOf0ioMUYu5WeOJA%w!gDfffrZaowTxWuI$* z%<;=qT13pxhXjX&NW?jG#I9>0byiw7Xn8Cu3RL68DPWkl+mnK#Ydc&MUhwJE=9+Ux z`!*FfallJL+n_wthCvttVx$-6?-2Nw2<1RDy_|m95=<8@S9RfSN0pca%+uWsW0LVBpvrEa3iGqJ=TI+t>kvnUNDIk95tZk)s06^E%c zv%k?d27~Uz{f=54uiNQ^Ha)O*;kmH&(#^#UH1mD?s20r>D=(7U?4v@XT6N!4ufe^( zN7)N&Ow8D!+nFyNQM0|pskapdCq>Gaj~-x4>8UM(``?_pDE;!rBklMla*p{oMt>#C`{U*0@!#y7`B-74JvjaBkOQ5O#jJ=$yM=6>AA7#GD7F8TL<5 z@sRC$W$9UtQ7ARE11Ho!$^78XEK-)L+5ihiIMaG|7`hj~T39`R5df&DZbGa=tzN?2^4Z9FDy`CT+ts8xkS1ddv4m-$jQJXaj37BVSJY<#Eh1+EIjV zWE5MT-Vy<3P{N$ZupmLxs(CFnjfRZjVKq9j{DEw>_Wb8(EJxk|k&>=xgwVUyX{IoC zAnh_`u#KAZ_40P*exwB!2eVqe-7!n@ZPDEK_cyCj{7NGReOo#^b#*70l4n%Tc<+!4 zbt7#;XA)~rMH6-1cFGO_&k1AS%v*ut`y^i+OERkQFlkWa#njKsTXQwtbm*mTGrh87 znq%xV?lttWd?rfK6U+;4W#j?) z29JQBH?38+i>ok`PEmw-TMb$@OeSxGUisNUz4Ih-fhlcc3;*>u$H?3A_ZU^i`mJxS zn$WKjB6{hMTFxLGhk)XifE`KLy~-V2&66e3&1bYb%L)pbD@OqQTb)(beRPW>D5NC5 zyj2CaD9o0Pt+Tsr$@C8wojbM6XO1C1&KYmjjMc@{+3lP^nlUbmW z_9H`?Ci|AtZPXp`;g4sYp1Y8st2ymMJAx5$x={?04+BmWKHTD?u@Kky8-JKLG*Fr( z05(diZG0~nq8GJ&FU61fFx#TV^;3yxSunozaqsAak~uAZFYdW6Wn@ zUaO%bsv96Q9EY+G8-UH~fMDzB>TZ8+Eql^rgv$iraUwS;LA*xS zs`J$`D(LBD&H6(?f51#mzb?!w@!jcK3&ZNIwScd5lX95=C(pCq&I6%!Q0?jbyok-2 zeBxALsnt@?mdML1U(6ak^NY;I8efF^cUnW;Yz*RgRXjAmj6nzbaE5XG>9Ur^!_A7k zI^_t3Zcw6`B$vGJP(ccW^=E)x(@OA{4)U+~?pC)ntVgjCeHvE~x@t3>v2bSLt`CGf z2sSgqt$jx-@8A{esr+0cx1~@s&(fEhmisx&`6KX84g-CV-P5DMRn^(uF{Y^^XfpD7 z(+ImdlDhJ&_+N}DW_(p!~TJuI!W6I}vspyO3K~ebp^Q+g~x3w#^J+aCA z!4+L>nK*?dSP( z-9bhjYj5e_V&;mO4AcrF(4^$C&rjVwPX+SI8(PSy6|epM+$8reu~`6>LH}sYmT=2S zsRyD6S57weLTnx}lUme_x5no14P*&gU&q(ZLno&|ZSV?owobP=CPl6%FS_J7SSei? zHOg_bt4?(5sSrN@;|`Za|M=1D*dxyNiB-YsYO9HQTvKK_v(!10TmTM7Op2-2)aDys znXJn0gydP(3KGe~H@Ye7kmT^tjxt{kt`)l}6mKjaOJ@!q?J!e5n9s314r}mpYH9ES zaU)r7F9NI`ab;GDCNPd$+cZ@(6``JgWs&fi9shO(U=Imr$LQJQh@yR|iD_9DgG!%M z2*fX6n`(UaEiCsbfq-wI{uV5jBi7vq>Z+=xwT>T?6_ms6C=;J4+FWY8QwHSjFe~Io zr@`mV!3*Q!g-LR#&xs(c{oZX%;RL#}uYPus2Skkk@R%?h8uz7+0sc*iJ@0WKDVMPS z+*HP6+2i2)Zut%b8P(HB`iD|`{q1|Ms?ueIEGda{BqyY|#f!>iTg?kL?@2s$g{FO7 zx)>UnvVc)B%SoUt>%R%WwqHrC&JZY@7^0rN%Ao0CpCa7_Cfe;R4I$7SXztpfPu)8^PCkP#R)6uf&ZAs|>u@tcGnZ4lU7CRt`d=!wm< zX7%YT(k%fQTzym=d~We4XK-hy$kaDpsmPBX(<~=@aK6a|Cy}_M4fg>?gD5)our`J` zy0zZfD9)&zK-PibbE^yE8uf0u79ZLCtv^|J@0)|{AU7vxv!r**x>G;K(4}LrEQvU7 zK4@4W<--36K-SEixEZBgtcXo7pY%ZnSorewK0@Pr_$3shYfp|eeW%+AA!G9S`ERnSJF>W zhgLoYJ@O`Cjwp6mj=mEs^Ek{a!OgHjH$TWMXm06bufgSAVw!-lj;@F7jHHiQj}kPz z#G0!&e)CnGz@LSxg<@8Nr^9I6T>=jzNcnEf;=E=8kKr=)h5Iee-dx|r34ni2d>h-0X4s&{r8_G*ZilT+~`m&U@J1!O)p^0J%9Q^*)Lr!0k4 zS_g)6I?g4n-<0UebmL(ZG8i@NVf3i{$-Cgl_GcN$iRriVOPeHq2n&Ju)NNWQ_tLQ< zYt&cT`yGhoy-Ku)f`Tu7=Gz9`bRu+iGwY{SISTPSRGe;R135+B`Ipd?mSW+5~P zU6QyM!UEVd4$eEAcHK4VEv3L`Lv;Hu16#|sbp1sQ9Supm&=_lytr{m9SEm1QaZPD- zY1;xgn+@BTY}X%hO@~ORaLzr9J$U}GPwUJZn|%< zy^1LO3;Fzq^gl?4-{Ccm+UmVnTk&;2%?%j^9ld+Bnu>pR7D zbtKsQ+uxdvXWjBy5$ma%Lt9UqbU)1-G_3?raYFNYa{}@4%K}+*_O>hK_S zvPVEq#7xpb$fI7XQGq#v_S9UjzA6UFYA&MS+Pb5cYt1wz73(JWD7_`)>(}|vM#9P0 z7XeVlu7}VvM>TAP1~WL5FP;Y&w4X)&5CBDRMcGggrh}G#QS|v0&WYJwq(XeF=<_ZP z0ka03tAa1+qGrT;X=e1ksm%2yZLAmZSDKzhy572XuRZ;|o!rwHe()}x*ceks_^OM zO@-$=Iw=LW`6@4QCb>(+Mf)BoHFI)s-wT;@^YDOt9++hfJdO$%PwfJ1a#7+ib|LHC z7>P1e@^aJv3$93CL7gSRLs|$}_(#<)yxO;RxvKsGkR`m2;&~T};sm-VXf{^XO#g5; z^ccOov#L$c@KNVPMuH~enTqpT-Gn@rAUEEPPz^<;k(E_^t!BT*w;6R73B3_vwttfN zZGY=fb9NE+qqAY+bTa@RVM?Dsl+F4(@x2NXovJn`$_w4fG;tmAV&2$()ZKOGrP%~w zW%X?lTi%R`Zo|m9k6w@1)HBEIjfNA++T%iVC}wFXy~+1QKX@n8jk^yqHp4Fk%*yo7 zDaYA1WlVZy7e+i&a#i`@3<~zAJGQyVR4(P#b>2aa24g)Nqg1-7MnWyUybr z4V1Z0Tb3l7>(oe5iL?>^X2NaA!-G^6TUha#kS*NqkD;_bL~=B*y5_BN?p%*dx3_1U?mGXY z@4MrJsRAUXz4aSIA-kBm7Be$-wdWPJ=+}>-Q64S@{ z*3&%wK$@AEIK_A$r&U!jmD|$NsPvt6JSD~XVw#9ek6q`^7~Q5JBcH(&2NSetoD-8` z$fuy!u5aO=M9{FIyUVHqDz&>SU>d=zY}48t;NgWfMP*&-PDI%D--7nneQkZ%pHci_6xgM1N9|ng~y5a4S8_ zObuG=j_IjAMt~7VP8d<{CTuQ0au};_HS8%7gGoTY{J^jl<9q%q-JDx_nPlGjXe2F z$5Vug>0EOjfn*Te!xbRwZqxJ5$@dwNpFW+(Uya-M$5+)>Bm0xLIaI<{3b;HZB&PVK zU#=AkwwMo;{CPQ8(r-YLUj;f;^@dlE+X-~-{nslH&kBdmlSWo;2db`ug!sdp%J7GU zq4b^T8@0vTs7{=8C?iel?84^-f>r7#?yJL^YRTV&GXzJ(y7?B7aytQmkI6!FHw*V( z=GC})8Jdp^%y>=Q4NGRq>uY+?=Sn&aZF|Aq%1kv4YEvJ`Esh+W$Td^ob;!sSEW{LO~L5uF@yR%HqWZEJDS&!*v6wY!DN|hHYES$kcDUfXxFeb6q0-+ zc@4Hi<$Ukx^FoG-uci#miZ#ynGM*Rn>wl~s~W5qmK)B-TcbzOp9!9qq2}SUqz}%tjo(qxm(`mh>ah$X{D)Fj! z9-f_~UX4#o+@!;g@Dvb4b7`86A!9Uo)nU4Wtf8 zm((Xj5Jyw?v)%(_#f?{3_1I^}FV`z*nGE9oE={4y2W7yvb0DLOEev?yxK-5>e(i-9 zX}Q&ocyYUe8V4$O!mvhf6sbRNT?c=R7<}gcjVAL?C3w^tO@tBdMiDmU+_p% z(Pk8>rzFn+?c=^Ravn>5;#aMdtCEuUneylDr8BP#v{? z^RuBsWOXc1uK|?nVsXjGl~4fF2X=L)Beok8wr9PZ&&V4iv3!e9?f91Y|}_6_F7YkqshSMr3bdONA;T$~3H?EZHC=j1Yn%AS+=e>?k7v z0z?8KBoOkP(DvJYe$PL@Kc4IQUDtE{@(&^Jan^m`=e}R}>zv~;{{eCXgxdgU{tIsa z%9fg*?yfBQb*P5-i}?rxklB>L_-Lh9^)M-h!I}xY4*<{#os7ZOWIu{G@?-{?>b0tf`TL=QYcD)o=?qT+QXQ)z^2WrvG^NW|uxvQE_H^@ugRO zVphEu@J!4y@{MJk((0oascSz~=q?Rw5?+C60)%BSyUHS7U_1oDr9l_Q(YNBmzfQWEnDhOs{hQIB0ND6W7pbcrANRYG?7+wT z)>9(dPqMzwEpHR8Kl5q$p!_f8{ez!6#F&oLsvbstAa@g=QzS4TYBB5p5UIq_!WTU++ zzCO`SYm#;E6JPY;@iJ1C7b{ECkLJ5$d>|rCC+c2ZPI!GqLk293Jr%9#`zi!}bl`D2 zrPLmJ~?HDm>Z<3prG0FF=!=IL-GqONDNopY<$(++zm!l zfEo)MWpZ3twi;`U*W1|55qiGj683;eo%4|9Ro+(r3F>R&X2yjn*#FpS@7__-9F#W^8n^N zu%)F%_|e!Fb2n`>UJ9T%#%2@+C34`aOC4{Hc+;fgAwE z&CMw_eIwzm%r8zmV|lZMMHlbU{2!W23J)POIK?(7(3Fbs{A`jB_#wnPWmojB_IH&4 zHB~MzDaEr@_Pebc_VZRZLI`@kvlMF5%$NcRZ5 zA_?_Xp8r7d1zXSoe5Y#~q>r=XROL&IU7X^#frO~oRhF-oBjRg(YQ5psPrq0K#EkK} z;No2~(_3Nhja3}QU)3wb)#3Dw{_zV`CEu{({CnEH ziX}F%zNzz$`|0lX5A`&Io^#`MdedOc5N#)?CKyJ=x&&S1lbLs_PrbwUUg+>f@ct8? z*oNo=O~g8OR!`_zyg;l9N|Wjx#hIxfs+BSjudH}jkP>*QslEa~)ITlYB-Dk47gg8c z0M1cy#G&f2s7o+Nrd4nQV_SA2TH+GJOhh)qepZ@%qkdj^}3?~JHpkIHGZG+Qc z`u64UQv@Uj8nM$8bP`Can8$N+{6j-69(^YU)k$2MT>XBjrvz~H%s2~yV6?uEm$YxV zf5Rz?1>n@#`S}uEKm3#+bi`IQom43$RoDXNkM`Jfa?s4Jf?aDI!5ZT=-te+JeXV+` z%BmhSWZn!UjJwm*I95p)kjg8kwoe3}x{YP?D#8zEcn&voEjkZuOOqDXENUHA=>q_< zwXC^I${^VQi4xGF1PD?5o8urkZ0N*C?XjEY@&x%6g7Iha6M;Z{?c<_sk{-SN{`7Y3 zZ;>e+SoK^yjp9TyacV+ z>9q>$8-moX{M?@0ePDC=)gA0_a(&;w+Fk!qof^nWbWfoCj>aWJaW_4y z;nK@XVt28Jg~Fd!Yg~Vza}aHD2V0Kqpr)Y^HZKL!^_#wd&$D2QiZA6Aw4wQo4}iw7 z2z~jIAysNI5&jdW4Tc{k;^Qs|PpwSioB~@M0NHAIFM`$yxkotjQ4n~ALSMYh|I`WC zK7jQ$!cZa$vH>8Hn4{kQ(dyL2d;p~M7qFqh<24ry3@-5_X@*h;AS3XZ?Ol4ta=CIK zc|QkNh4CHvc@L2HHQ3oO0sCSk4z1)kD7ph;*hr&Go?!)`Al;MbAAIQ!2Snls??EH; zwr-H#-*~%$6fmm%ufEBCIROX)=Ijy)e}LUZFl%xFsShltikFU_;V6@FmSDjG#%HQT zI!QlYIO|P|kAP@+PbJ^`5wJGUeBVjnRP4d2QBm+5I&gz07XPQd?_sA`!1G8Az`RMp*8I?jOo`sj*n zx#N`Xh2D%bX@}V37~ki=O?b?~-J=?>qI!dJXMcL~PEjZBvAj&M1l0EF;(o98!?@u< zZpgz4BkgNpAFzIA94;xf3U=kAb@JU%mBBnC3hC?kd%Hc@`6t74_LKf64o|KA2wmUU z8~w&cTcgUKqPlLOS8N`93J~I}f!ONnXIXY%;q>N8Oy8E#Z#4hnA0D0#N%#HHJbN%7 z*8CcJyUH>kfSXhc<{zCc;tgTMy3_&aq*LcR*!MD<{GUPCIZ_1^aT!wpw0`)LoPxJ% zxDwzJS_0y?+-X3HGT`iZvm&{L%CUG}WM~FJgTX<_?uoU_rUKfL{?-Q}vna+fz%zG? zG&6pj00TR&AQnq#@pK?zL1EcAZZO=cLVV=OyuCn)_4{YPisw<8_(xpejp*+z3<+qE zYo|1U=R4$r!*+qJc|5mo+Nz8jR@T{;1L(ql0|}_Hc1TP;51cf0EKrG0y|-XTd`SiN zd0Jok=0hfd!dAocUaBS?=?66XB_@7x-vDT?pafRfvY0OgP2Tz@OLL#f@SAY3f`hoR zy!$|$mS?vHR=^CGOw2B=jY0&RS6~PQzF}8Dz{TOlKmk;_ah2jRg6Qut$I4C|2ENX! zH+kHekPbQlU>m>_vh2vOv&EdnlAbl%MQ2feiKzlplQjwP=)3k{unnloSP9^|747rm zpB%%dr{O6M0f9<_tzG{9)Mu~g@^7zWqS1VYEXH=^%n26Him~u{RX&ru+4FT%eIXD^ z!@_G#WngV0XZnT(`w)kYkVOrQpMao0(v3@Rj`eJAY3;IW;*O&3VG;B{hUv$&&P=x4 z(z3Ro_%{bs%2jMpz8Mkz{uLQNR=NNAn)+tHNz?KC{dPZVtUcUiHo;4&GJ%q6KZVz4 zOK5Dg{J_DTHA<-e<;*7YguL5(&w^B?YmXldr&}hR-)PY+)xGn4HsZ?%Q6Irtu+nfP zn2;vuv)4v=T9Cq0Ij{^H?Hk70M-PEj0gDM$)J0yBhj_ecF#Wr7!1quG&fF{|r>Joq zp`N~Onn94-*nK}xbg71H1RI_yq>?EO6ICTGTVZdmr3Gmn)ovJ|HSEA&N&fCXy$)rAkzOjpKyMapg#UR#Q< zf?D!){j`oQdT#mabKkF(19I9oO#mqdo5&6N7FsU8REeCQ@TBt-4i+{kcLlAw{(}j);=>XTF7kI3=CTLz$ zJ^B36dD{&070Yt#b3i$=bweHb3hq)0SWB>G=C+HGa8HWr>}@x_Yu?MRor?fH{Oix` zA#X#}x%Bm4=(kk_HZ^hn3yaz-8p2X~t>--}ey*;HuqrJ$4aXykC+w2B?8QnU1QY;T zQ6yB%&JA=Ew$Xnf?nvbBX^w`st1_)oK{#5&fAT*kPTxEWJpsZAQe;YpeJD60Gm1X) z9MO{qgdJbW7`PB#{R!|gjy|t0Bz9fNENcu+%R6{9+$1 zQu4m|m?t2pvkE=@F1#NFNvMeOjBv%-?E7G?2WY!x;~O_Ys_Bno#V1hTz?JzP0#Cyj zo_JsU8$zN$j%FIZ739+aT?3e@eY{BR6@zG;xW?<^(9Wc@D_>?E1Ndje?wI1-D%D-G z`+4^7u7}%NGBZGb2}l->;r`Et{Kk{P>L6Q2i^h*I^U7xhz}O8x*u}kx>T4dZiPnui z=Q|k8kkGb#8KoV~Ymc{yi3xbuSMhrjbhyi!P!LifesAPQk6-WR1Iy%I{DXiMdW24C z%MW_`1?6u{`;A=5E#uIsk@MRRLd&pOJ+eu#@BWdnuLr?K@D}gp5iC}7VaKVJF?P~# zO-F9?sQTx_M&)=7uILbkenCnx@yxl?HUsBsY_ZPq2FS+iFuiT4Wy!=1mDOl_3W0A% zuAC=Yw(k=<8|Y#T6Czg#plkZz07x-`h!4k{$)hiM+7|}6MQcSiNw098?Q!7JNY+1_GDKbV!A5BL zX0!Zjj5TK~FDESJYKDTf%71@aRpvQX)0U0**h}r?qVMBL+{|~;1mN7 z)Y`+1{cjKk@`=T0rRj?%7Vr*5xir?OcTHQnHqWFD8LQkg7QQdvpZ zKZHmD7}m_I+w-6IF^JKj=G|gWJEj;)i;Mr7cuv&2&H%mxv^)N(&Z~yk#w+9KJ}(r{ zwTKrGU=Y#^62I+Cr_;4? z&YDFXTC$8m$2+aIu<+|uPCTX#zlFkYVN*9zyB;lTRUTDCzL6UXxq?^ibfPmV13fwV z+naqvKXFtbA77h^qiA9Tjj)LE4>aFiR@Caw`10nqc-SR}!W5q%z>ftCJ7pE(_Ghwy9)n*aU#c_fGs&1ui%zNiU6HOcIQ4f*TNWAE;X+*7Sd%!pmJ7@+(fCx-f$PC%@*^QcGy94`wb`A4~htCen3)zd6#|z{luq^mJ*5EEo+|PIW|!G0;7# zoKJYC+-(Ne|4I~dYk9D?v((LZ0@K&B-K<25<~cFxhy36{k{X?)fbx*lW|x)#s_1QA z3ruI%Wz2=`nE2cKU_7HoRXoKBdOy;S--V#^4mE4}j@NlrI|kNylQlb!@~%pA=jZh9 z6NyYTLJY~4`8>Tmj5dj7>8w;6ZqnJS*}Qoo?bpbdbS#|5kPHD!{#X#LB6Hp4XNQTp ziukOUP{P)X#~|8-Hgl$LkS8@2AQ)CWBCIE#X^k8owhz9ME34*B28up(1=ukDS0uHQ91w&f6=2J$Vo zxi+E4*;v+F?}XCQtV9b-OYe>7tW4Cyh^rdE4vIv7{v*osqw`pFy@S?Ib6@{i%tgbT zkg+!&MF%udg=$3Q^ap(xN5$_*fCcY=Rih%MTEj>8_X_78Pdnwmtq}P8&mG{O>(~Ch z(?H&T?T2vjtAFpZ@Zh`u+CD=5zc$Ld20)F!i>SNqJMs9zTTE-96h@M0@b}LTPL_IS zNF~VUonYF>s}!5HGf#}P|M>S+Av?SwbcfT+8RDPlxu`V6*JltIGP}k#M|=*t|Fg-M z=gVm<1N-=|ml*w1_q>NXJN>-B-~L}0#MKw7?|$X^P><}~1H!7mOZ0rX3H0%Z-cIXX zG0)2frDN_0{=X|WYWlC1*;Wr3=r&t_Vf!u7fAr1xEoG-04*%?f)*m3r{Y3O2pmwXQ z585{DGQvY+_@7~q-R?ltYc>8Z=;GnfPvK5y(jVMz4V1v>{nMupPOknwdvLy|IQkWM zyjl&l`6&DTWFDwO@Bda3Q&N9txi@NAq+PxLouJZs=jY?VonQ3+&v*;Z_(=0a zkJT;Fgx0u{%FQ}K^8e1zy`dtrn)e3>$pY(q$6|;an+|NF<`=PN1!enq9rPmQwCp8d z>@r)VeRyED&=>ndpw4%^-5wNqaU=HbtJq-Op#$Bazb<+EqPx3P*{S76B_$;b8yjSI z=~BU?;JqhsXs?tI--!aSZ;BVC(g8D3X*iDdwzF3{cVXzkU!|nBNY`1vBlRCK6Miq( zHF4rZ$!lw5nvxZ;L!hKq_kot^?V#mRgNe{(Yx}xx%!P~jRf4=zE^`V@T()F`ywt15%+`B**lwPed0Q$#dRGgIObFrwYNyj9kC8u5~ zUC~%4$P;C*>w}Wg^>wn}+muB!p+3DOr?6+5@c4vA?RhxG9~-n(7rpp{sZ9lXV6VIL z(kxWvcUOkV9qz8 zN$D0kU@`3@$+vYb{Mq`8CUq5T)*Wv}AK?RT`_)HAMnKcMv*0RbmTs1U%K16yg4KST z?Us83kziYM*UizXSx)J8x#>iR?@(dLog$xaipohh7x!A)pX^%}t?&6&H=Zjr@fvg} z=&5zmpj%04d3T7^cyXt0i24r#k!ihMV(81i2l~~*(k87wUDa-6_RN_w^e=8nhE9Tv z%Y$@RyJh+%6JY1i-Md1TmX?Kk9f!+FQ&JjwX}BGP=rnH;6CAJAdb`3bOLNgtLfNtL zjk-w&E(e4Mdxl$OB>^qxHc_=V(x9y>ELNWUx0pDE-Ot0kUu|3NUOsc?ww!TO@QTkx zL61E+`BLyE5;`!s;MLvBULiUu2Ob2IcR0D z>+}^t_jukA^jM{Xjy#KN?{)W1kw*WYPic&jxDnOpV;J`=tDO)SkAC7rkArXWh&ER37Jo&|D7qiiZ(o!98*=mG5Eb9H$+U^hyB*R0-B)(CW=h+J7FK1I zmFDe_(~OgW^f*}`7QDdrY18g)@S8B#>9QNT;>K9W(w}28UWWn7aqAt)r?z{yb(kM} zOQ2q9Xw7Iv_wF>GCG%1N$K{n}Eub6M;VOcXJ&{XX`{3xR)Q$JHuV!5SZnakh5C!AkD_(+4P;R)n^~vNP zl{(Tbc%Yv-!fHID1@_EnRCm78VTP-41p|M4og%Hs*k$(U&Uy=z${fnu1Ciho@S99@0|rwu4A_TAnd z!~M)*R^t-aF*v%K^z;8#qQ%apIS;-)T*5z80wkbpcQ5IuV#zbG;_X`5Aj+4y>2*am z5gRN)L7siK0l;V+21cVzX3xlhUm~2!3*k_~<#LhebED0_SBw><@dip%k@9=|0^5|k zBIV^UjE2(0^o)zZiasC}jqX>Xr|gqJRclNfN9;{Zc^ph!%s8of&)M!zUMP9nArDjl z=n;^Zk%fu968gu7S*=T4XBFh1)^Fl5X&AKpm(fgL$F-!Vm-d#)*ka#ETd#3Rl?^zz zq^|@OvrQ5FqEo#F#Hi19NCv5)BGAPL>3(LsDh-th@p7+iQr%v(VcVp^!h`RlXMxy2 zGS@o`mb3mWT3n-El$0H;nMU1RrW%|Syw`IvbKt?p8s@GQa>lk2%fjCC5`j%RV3|+@hkoTyCg>V#}?Emg|yM>X10fcjRvF+P<>w^d$HmJHJ}xUI{pxwP{Llx%%8f(p#$R ze|dcWzXSGn&;5Vz)BY9X{OowwT%c4W|f+N86?)Eoe8YTDlVeDNh*=YSf(*& zOw?$J?IujF1f0s!n(m$1`(9S1Xk4GuH0-ET>`f*JS27y6E4A|wlo^z)qNh3 zGwxg&F9ZftSQP~NHo?YkmMAlPtzxb|j!S0k*@@Bgx;kKaH3cg4dxh2{)X6RznZ!Gl zM9j>g^kwGQz;@3iP@>8j#v>NT-8v;BuJR?%-Qi2dEbP-}R6UV(d1s~XV1?5g+DDAnP-TOr zph$XYA(%MP-vZNo$_M8cv&Ju)@AlW4M|eQ3?CUN!^P{(^S^4-EDNp%V{lUimLPCAR zg9qI}lY48SmECQ8r@q~*$s&9s>@xcyMwm4A&50^2+9U5WX0frQO=Dfdc`wT8aN-Ay z_S__9an!d*(opb{ic2PR`Xz5!pFT~)(IyUImt3aqKj;8}vBlk|In1XySa(`Z=(XhL z&2b41%{!rX0R=y9<)Fw9;C6A|Ho%YX*@yFnCK9RNVy4fsbFGo09=9r*T4;F~?bXUe z$jHWTUL(jgbec_5bwfdoIWGAU)Dtyri0Sng_!a$w=zk4g7VVEyvJiR~^kh%s@>FEK zWI%spz=unWuD6T{HT}q-9)fOYA7QFV5GE#+X;p9a)ia6YlQb4tls0eW*ptHF_Q?%f zf`u~|J=Wj-h8MMh&sFc+_MpaUo!F~r`Q^VVY7tk}Ym!tx9gme6QD`f!gI5!{)@Lhp z*wF!QHO;p>cYppUn9}Y<|697qtAS1}KSA-cR_y`Fb5o2-2ujA^{-|yP;;4QBB4m|R z*wB4tO;8~=jL^kE?YP9KbEbDF>uM*hjFY3Nsm`3W-+TT95J`E3!rlL|gTFBQ7E>99 z)2WvlYZj|W&|zIOV0i*B8sqj<5mewo`k!*)1yG=gqHu)Gb@4ibjc2>zpI7PYG(|@5 zLt4yf!+6P>uHQ(;g5jd(8$R9p5fQ^A=zZqLyojaXo&3?00o%j9eEPV@+da2cGgq;) z;*7AZOpGx$Y7?P5S5DTMtL0Ceigy~UY`B)LTHd&4!!MfLb@#@Ixnmq_6RH|cSv|!z zURt44aqF|!)lh!dCvJ8)vQx4VU0Vmyhl#uZRUQ>7d{2UsuT8_{2Zq*6+B-BAdyt=w z&Fja{$?lJ*9_y4zZpnG9gjPN5CyvbTAgJ8ho_|-8642rJP+eu%1Q|A{7}#Fh&h0nl z&K8QGPwgVI?EYZx64Dn$ zG)L^lE|_n9>a{PvRC~imzZ1;qt)#L&E%ut^eTgxK?ZRuGBPI0#g5{MU#(ggPxKI!5 ze0U}uV*pp}RzgIc4wTMJUdu@Aezq@GeeR7|c;Tn-k7XIQn;;Ehf-1Mn{P(H6{p~9& z_Zg=IOMx&3M)*fq=I60KWuzXeNO7(I)mNhLJ}$tESubXH|L6-cl}hTlQbc+1Nqe*0 zUkt%GhGf_O+^-WHjT=M8Y!}#Xv=a*`4`9^twIugT{`z^WK?{K}+)E3+_^U5r6&s?K zuI{=uhUE75-VLwCvaOO_7Zh7;l|9%FwlmAW^gtLiO7DYjQy{R95$mt*lNAv$UU8CZ zT~C@n4Kz2uY4}2=ZPMPqE4BINUNSwakDf^LzDh|U>-Ap8?4Y6WN7XE*asz$v$X5S{ zZ1#F%i8XoJ9yB+iZ9!7QCn#oTk~woTPh()OT3?HYYX9mx2%v3S<@q!#r=Ct2C*q(~ zqsU1dF?}c^~wYoZ25?6l0nW8p-E16W$n`uU9Vd$kj(MYs z!>wD&#I_{8=Sr14M%2dpDz{>NgKV|jXfJnz&G?zpijEmnV&8lG$ubou#*pItLnuMn zUSa+T?y31a)SZ>WVos;OalKSCczuldW_v6s-IdFcRiE)#PdH3+nxC{k#~d_8 z)HVot4s4|E6Vk+$iU!gwHE?-!)EQNK7~CN1G_*kpCQ6@p{je+|QNmv)!xs4vpOsCQ ziK=N3%Cr0qb1-wIqOgbAztI`c6}k(FP104;-PAb~`&1u7+1V5cV6heEp?)v2ztW;0 zWne8@^%U0i7;Tmo2NjP%#TP--oy>V=et7!JoiHX2d4D~JlO&-)TVj}XAINx0jE~EC zE)^-2cB+j?D72b>;RTT<+L>gWKGDKAx<%N&=A&|~yNoS`razn00V3elwNM#~(WN*dTs`e})xy6^)Gkjyw zuGuEJ#U*ASZ0g;7)7y4C;5vBUV%?L@-AXZyL^s@t#^un8&3j+;_z{O`8LpT8&t(yy z9&R(1R`bjWn%he$5g%E=L>6X#$cNFe6u!S|^D_6zE|twpLtu4^5%Uvb{#>o~N8jc{ zHjX*(`xAIosvD3)OL)Nhej#c`k)xO&=R4rT@aV~T>?Dk1b!l^HO(l);zR#?&1DA(Uy z>E4NU=NulRc-)?^fm><5Ml({EwZkC7X3d<71Z~8X8rysaR5lmq&glY1T~tl#_)&fT_bq&37{q8Cs%eKRvvB4i_(O>4;Muw%&~JasC;n6qjW zs>T=_sb7EI7{zSJ?$2-d!Pwp7oiCyF0I(AZ3HO^$OY$Hl?~p0jyA#4!$yIGQWTaOK-h>2&5#2#>zF4FN6`(a zfP8D!tfN)`6n|dUe9QHqq+}$##zXk6|27N^>j!K3n-Rc*OZgPwu^P) z-5bD;E_A*h^fU5FgZnjV^X+Do zt-#J|r36lAK!@%-N!?n<>N1LqAaJj>D}A+FW2eO;2}rTezg}WtXerv8J6*_KGE0x3 z`LMHt#*9xtUM2x+f7QzwnX~r?_g&v?)(!nRW@mKgR;uu*W*c>sm^BmZGOGvMCv-Jg zFETRbLZET-=3+IeK&F*6`z&yx$fD{l+C7er!oe^5O@?2N*=#wH=w4@@Y>vCn=^DDbtU^c zW1ah{jXZkHbDFmHRb%kxt8&)tmXo5#RcEaD#%ekNKB*SP$dkN25olXYlIcHkB0-&2 zxz@K}j8T>-7PW|3E?;$4B`VdDYpQNF7GOHZ!VoC-x+19sUmxdEbQ&E!s6^0)?0;H< zr&uvE_Q|#&l}Mv%Q?`-atn=&sxmvqVdwod$2ZgG&%X?piC%Mj8X3&0jVw zX!HwB3#((ET@gWybRvQ~8pY2%$KgGZ@tF5c^5EjMsF^*4F5^ywT)gB)?(+KT^x~Kc zZN@BXxVDopMw`MxK7M3V=Z?kA3GQoS!#;GArHKrWoeLDayQu+x(PfAyrF#NCuFj*N zAXU~T$bc+G8!cP(VCtZj%fn;+P|0&|^)F2$Qv8s)vQ_7$$;xc^zM7C$V=K2E z!`k(3Z&oI=3YV(QenR}<92+n!Prr}K8cv>!9!m@laDki5C+md|X@S-O7tE>CV+K5P zZ4C6japOV)${3$-H2*kQ`=nN9%=Gap3A_3A<3f1{BE4@{@)v7u(hJ&RI_KVN#GL(d zv?*wrq!1g^-(u~TE{K<&PK_V$$@-;z zi|YQvK8)2c$^MwCx1RFte2Q|aZEm<$V()`M1rNY;HmJfkzAjSyj6({y4W=aousJ9n zDs9bJn_5hCcW6`po5aT$PV5+W#Y_u?$8aRCci#5HD!p6ez^rDs z$YhD3qJ{R<@Rb33|9AaIwuUpg*9;+ZnToerXGHnVKbuRQt=p4$O2pXfBNyBSo*nl< zkXGlpq11N7i)Y6Ukv5DK4bJOU?NrQpG;iJ%jGU>Yu8!eRnapFIRdAVlZA~*+_!_)} zyb+PLb^(raw!ab;b^Tyea6qnd%WV*A`yH0)MNFR6hmm#5?BX2{&081+mElhc)qVe0 zUh}0!X{BTIYcdbt)D$rS((0zl7SiHp5*cU7_OcVowa?8EQl8q-xH zb>Yg6$z+OkvexwL#f6nRi;SR&l0d)(kp~d4=AqtkG=)=rkgT@bA=bFH0}&tAYyq}6 z(ulTtm$T&`{%J`zVI&}J9peAqBcOeG<~OhiKz9Mh2WfNP6j!dWVY zet5B8S2Sa|Rt^@!_ty6RdG-f* zFh8NO)$kG-&e(6(d!Y`YiZVFmG#VW2HocM`I3u5=S@spadsjA)j6fk{vByP+*Qp?S zYZz$6Hg=A`Z3}#tWf8y*Y(HQKSxm|(x_`Aig*gl86VvoU<)4sJI5skc`GLHBq6ZnX z+xn!r`1&OLmULsF@cukFfiPN&PhW#oZhySVAU^GhrpX{H3-Ns0EEg#JF*z}DSMPw( zC`qM@0T)LZ2i{iD-RSyo*Z?&d5w6f@oa`qSvikan8uA=Q`{cBiK?W>R-x&2olFgB{ zWkpa;u}}+X6zU=09(lre(0_YlX-dn`TsrqxY`MI$4J#rSrLAuvos)rY;fAD-5H8jk zX84WKTVvIC7V?<{jcC%<A3I0_HK4i_qj!i+wDr3XarTx zIB8$w!f#21JD;jrQ261A^rN~VJ=ml72pEA;#`n}6LUqp`b|k)O61gi?4`VxQ_P&&n z&UQY;x)%Sg!ZttSBq{37LW2VqB)Twf3k9&Zs_|`}-43663tw!-Z)$N|Hx+A9SJQtJ zA+s8DE9(gAO*$e$o4euoX8e$%V)meRC}q0$P+d`H^|`dwq~HtYnh|P6 zJELNn_ij1no;84_YkeoN2&JY^Hqd{Uj9h&}WqmgxmCP_WZ%|C4U#`5_l%xsN{1=#Z z*UVxDb-z<|UU*VP9(`?=IZ>8mO14a6POoJ8B#x~s4Z~j67G$sCI8GKzcGQC7W-Js=V=75K;4Y>VmccY&%i>5sLi>T z;Uk(EALHf1&skJ9X99~ zn49B;k3Ns*x0Ts!xcf5B8plgvU}WiN^|{$tNHsj^AT)nBI^#4yoEsrwvWKj>xO?Bp zr`NS@j`@?V0}l0q$xOgexZc+`V29 z*mB?J*d@A_OrJJ=ya1Nm-6+Oyta6)idVKhHhr?T&T@wDpX>-SkOw?VfuM)5AD zJgjUQV+x;HyM=qJ)>GN&|(qLYBf%^Nb;M`3s%>H>D?%o?^@-II`{pj-|xru%pSHjjgIzPNQz_0RqX#Qf0h3q={)cGvA1oidg8`=yl`k)b#vXd8lPo|AchPXC0 z`n+;9MV8EF$$);;c7dkkXG(x?-HHLzBX$$#hJM$Q`JhcJ=hxJ1<@zJ9|ECuI+HBBb zw=*>xy)Ow;W$^4dW&FX!ej%SPb3ztVoKd>66#Vj&sCx-<&Q?^;Aw~DzLTHz7623_X zh=-C@<&tntq-9`)p$U_Q?VwG1OZWC3K<`@^o+5(&+@1~OS(qd%cV*kPWE@u5t$frn zx@F3-!(mlwmP@)CKaO`mJ=WfFkldk1jUSs9ZLWvn>93YpdeL-tz^X>5Tes}t+G@vs z9pl@|kyvWY=x%JB+3B*m{*$6c;zFRB zl9bmqvdGik0w>Zm8v;?MQ*VgbYo>H{Fqcy8w`(uA-|GvR++y&7*QQEo%~U4}FT?<;(JM6OoR)iq!2R`PO$t7>!jwH3|2 z50KELp4TFp22;y3k(IqCBwSj5$XR~~6X`CkQaG>ipuYxY&YM;Vr1Qn&atoa#yk`|Msz8 zXPTn*$~Irvw8dCQ5f`GkMa)ZSW_Xm=0KG#YJogJBpSI};xnpp|Ii=*~`>oYcYk6*vOPoQsx9Sx@V)v z+7gFg6KV?06}fyNBlZV zVj;`bj*E_3T?`2#mHTMO+ui<)%tDuXO|h+=zZuLqe+NR5edtO_G57S3& zffn|TACH07`bi^q+qYH6X>%i;eHIq#oL+@Zc9ryp;llR25Fe&X(aZ1@g;dFjDaifa zt=>}lCw+))t)E1Wb0KdfBYfmp!OInHv4(QuYjlhHvijAq1z*+Z_y z5#DMIjJPK`O=o-VRfVohX|=nV$=iukl7Qf4ccUAjhq*y(GgxrEJdZ2k|8WS0{MnypFAg%*{_E2sKOTzUQaMiTtP`_7EvFUu$3sOjwygQpfr zUBz+B^-XN6ZHNLXtJ=AEe^TjKrx7>@X*?J|?l@J_>H1;1tQ**YGLXTomKRL(WMLTb zuD)?@^Epw2TgnQ&PSftXghPe!jFo#|=QI`bABnn-=Xg{~|4{kzs0 zUV_;BF?3`)6uUCG{`p&E5b^iy8Ylmi#5ts*daX4*Ai%GAxA(|&aiC76xZJ3!1A8IE z0A>t&>y&bM7Vc$OLkxA)^2 z)ijB1t`~vXb}4snwk<;Ac>Ev|T?LI<*gu9#b$`g(D?e8zlz0Y1xJRC40x@kfl zC(OL_f_4@B{LEvZ%|e|uKdz*^k^xcG)1o0hxp3}JMcd!M)Ny1rz1-hD+X~`4!$Vr= zen;}Od&;#YY;hYKHzi_g;VT6D3oDhTC5OWlyWUXT#x2nM)%A~dbF7|pYZsIJI-QN& zwn{wa-XuWNcZ2ay4!}Id53~G4&i6d7PcHqL;+$bPQP9^Eg_(M>yUA8)`A{>pMBK8w z4y=Fo+#)OD60!FK5oROxE^2;SR~
814(*{tPib$L=&E`IKuL27&epsF#dixS<3^BYaPbnbM^JE zy+un5-~-&yf5UJ#a{cJcFlJcBKFb+mRLkCrxN>N@v5B#{yuwNHsv_?o;vL0e2nQOM z=(6fNuQP+=bHc8uHr>6|qF!y+r_)2FdDIhZPxPwV*7&%+Y0KpdYpH&??16gWjMgu$ zikeLj!wR~Cw zhqu@+ACFJSjffbDoR-?W@Y-F5?Z9inv`I5cN~A)5*^D-Fuyhjfj0Ox6&HCsou7gt< z?)PzH@0YS-CZrNQ&Q5!~R_fw>Iz|g-4P*m3#R!n{U+`HpbHJ1vKKsLc1_Y0U zT=V#2Of{M)nWlEUp3|qx%%8c~k%I58fNLtt8+Xp)k=}UFIZScJ%_ zpK9dy9Pm+)M-8O?Cg+7RglhfBpadDy#dTLu5NLFN>BWsRzF4=9H4K?>5g7pH^aByzQiREYK&T9g-moQSUSSc!D-Tb5%B*qwS z!V%foG7ium_lH)H58tbIz^R>A)Q5>@cz`U8F-0QhM)8qre0`l_+G$1F?^mh{OSHX7 z``q+@Zw#mMAEPxEbJe2oj~uUJ4YXaBUw1fvlCwbUmQi7P_dnY-E-c)I{;0wG-R029 z1mk3FV#Wrf{);TMs0ICF)sr(k-iDsfokfPiVz$~7>E|tp+zUC7&!6A8Pz!g^WB6X5 zT$iHfyueR}7V0ZhrNF5d-)cMGL2WDtTqQ`}*bGZv4!tzmx0<1{E@FOt<*Jc%`$ zMb=n_lRub7F8$h@8RgcZyEJ!X`wo6%x^bF*M5tABal{nI7#sf>M2p%o@o*iTmdCxu zObznq)TkhEy<^oIeqLk*{^G=P8CaMTsSDMVPIc-WPaHPdpC6;9%vm>tWagg2e&pC7Y*{w$lq6KLVW@KX^)k9M z2wqh$@Q7sb4Uw$NK+PU@JH|cmy$+Unv=82fa~_|p>s!$&X19LJS@pG0XRqE6YYy~( zs8hQR9ZEnK(5f#LCNApiKa_stir)GBPo^D+$RGI@%!&_Bi?g$jkBro zG(V80bN5(_c<8RxtCZB&+kE$2Y{2p%a{sew*0U&A)ZMkhNoXx6_F|g>Z-6OApzk=l z&my0^i8MIZ@Mz!fa$ccV4L-lTdk(3?dvuU2s>d_!x?@hu=9b7x#Q#BGjNa)wtv#ce zFpb)FzXBG|l6oHp61I|uf-Cz5#Tw~W?RS%tp7tUOoi|5xjv7E{>3UixcY?0vmLsB5 z7&No3rW@{u4M3j3wj4i&dW4271WAQmyOQ3VG&$NN6XiKQc8gYJRW%ZO%rZ@*_=s6@ zb1sGdQdJHYZJ-CFEEZVlv-j^C*o(?>Cz|yfLa+7HP~8^6d`9H;rn+z-e4mcQNLeRyuhemjk0h;M&ym(e!~lwqUG z=&1LPo)a}L;YlSuMuB(77|ONCny{YN7in0vp)E)Oa)oHTj@4RN6*IhS?2-r@11cgF5b0YbuqqHSl!&K-khqZK|S z%%C=FeDYxWTw>Zpv3JJG(939)WcX-iyPh{vIA{Ah%&6g%iyg6AcOK#ecE4K)J%iQ9t zoSvP*q2i-@a}Vy8++iQt>0fQ1iPQb~Ecu7Uk#H9Gm94213!f z$dI-l0us?VwiwtZ0#=jWyKNC@i1+qtRIiCw5{FZMC#j6eV_AJCW30ThdnTTdlFHC4wLbf{5HF zI-l?7{@#Dw_kX`XevfY+kC{H4N3Q|jtxZElVe;}zVPhGEw9i`XHlzS~_v6N$71_}Db3vZF z)D{u2VtqAUgyDAF!+nS1lRz_0v#|jMm_tGEqpZJCYU@m~J$rhn;SBfOLGU_L{?t}R zB;?9ton-V{gJ{LR$EgfvB`OXtWg~yj02O>-OS12ogH`*iWf8eZa4rwSii@15` zl_f}1OS&^uy>xv{yfoaX`N|tIwqLH+Gcq!0(zNkAB}EpOG-Bg;z04?0t{iC15h8CFRwl2zjQ;WS~$@wiO@0`#@)wgT3 zfn<=5ZmmeTwEjArnw5FkJ`og8RMbA0YhClDbbR1W$k?w@jiV_jngAx_q`W4%yur>LX zOUpT=Qxh#*x$a;;8FduFCZU?Z;nSM?oRr(sMxM^`Kg)n8?Brw1c4vk>+|^|{qq!6JWvPd!vsV`HS|Izq z_Izk{;ZO7TFFsifbyTEHif3&3Q@-00Nzb?Nn#tHZNBx#Gia-g4VdoWRHG3Bck zgP$2xkml8GPwoqKGnPDFboKxA_{k)NF%NMbdg|hBH!1jT04_r`Y`02QeUsDqD{xX=L(BPE55fdC$&qNiBm6ul`)!*yv!f_dPXbRMy?yn`K{dZ9pE$1ep2~_QemwXKCcVZK(_Q zQBBf_@>I(fd%NN}s5ugSSRS#THQzg?j#ih&w>BMDF%p(h>8;Ec`rk+;^d5%ib&2s_ z^_mPOw#F4{h7li((-8B_mMNe~*G={J&J%B2)8p4{VZ+T9(=QaL(j%%IKIpefn8xdl zQb#TcYA$XEk$~^mx34Q(KFGg#(9YNfc73W=4Hu136=lp?6)-!&y_`|5U)ecOv3Fz2 z{!0`;yLa0KBpkuYU^M>)gWW4nc4{XX%C8H_H|gbIJbr$1vXmNj@sj6H&3je^$`O;S z6K3k~TP*-I+GPO9MW&L0h!IJ&D3}ixijLelw25q!3Ye~SCE=fo5pr04Y=P90%8_x^ z7Di9aR`NuVMNf%=iu(NV0Xu0WSpuGEeX?S$L`&W|nt@A+O6m~xe`l~0_$Tay8#|Zm z?wFaLvC<9LlRxUpwyF|arh4M1f6F1Atedc-PZFy~{&fHu|5Iy_U;mke;ryybOS`%n274tEb{jyE*D-zuJ>KOcwJFI*VbpDN(4>Gd4F_x|*;g9axy zXS^9LX{+NJ?_C-mG^g0m{9DuCeXweLDRrd-*;MV`Do6Bj6<7t!8M zkZ^jJlN+2*C6r(3{>@!|=O5a+TD(TO1w z#}D^PICQJOv)Am_@OpP)r4H?GfY5U$2cHxOK$r}t?plE7PIrCdW*Y23WW0Ll9x(dD zgUYf}E4W2ZkKJzMs>@L4)NeA=+wOHvcC+iipcsT8?R||;MV{EZhO6&A=udB{)R_3% znr=)x`A}B1quyx&%me8`hnc6iC34vz2tl_J;6v5f~s)N$Sm2vW(fYb1f{Q~TXziUtF<#O&TEfDylC#n`FR~`4hPHI!P|RLEkoJWh#zc#4JU;dlo*M zPTNtP4xtBmj879w2JPf|2fnx~(j(raTJ@~t)m8`@VVmp6`-YWhRKEjUK6|c~J8a)= zpv>}>-Qc3B36p%0p=Lt!O?8{tUUN3l84Wm9W@GQc(WyLsrMf1u`$Jn;k@@VJHUVLi zT;kJu6-)J&Wvz@5b4D1guZ`u7LAY)_!8u#&2-u;cCDq4If>J9-jL_QQOvWm;s*G$Px;~+>;wQS8v#h* zLW}` zY95pQdP3TF>GyBl#*LLYZW^gD)R;7EnoH3rQwEQkWW;n_pKqkjRe-FeMARMoj@_DJ zO=PueZH8*sxorI&M26rdmGGlKt$~RFCwV2HbigdmbhBiV9*Dh18bq*^RvSaR`r@Txf*>QUUZ$d z<`Tos;l0YWCOljaF0-C59gF=VZ$!F3j68uaJ{?ouni6JA70H3#Htep5bg z%}8)st8S2`VrzCcD{eS-ZP(N|q6%cT(?>{EDO$L~!Q8CD$h9vKYZY)DqyW|3$Q7v$ zkHD)34B-@=`Wn!AsCe`Z@bS9y(FR12ELshesHz|v5ETy8j+&_JmDZ>*q{yh!4|}kUd2@-+Wcp}i z!S4O;NLvbS_=4n|d4_>)rmDgE-llo|qkFPtLxY|J&c*{16177F`SBUgvU636d(~o7iOSnRnV|hK=2r-9A-l4PLQ@P8;t#tRSII4netg`>;iR z01*P{hHN9%OvvX0hi34ZY%Djr)oE`VY2utIPJ??>bz3ylN}21pk69)@ikf0W&4I|S zWGw~Y=U?fj1a2h3*eMq1-FOq34_j)RSu7-Yy!@}fSQ|l|jd!e!6*~j71UXQqB~5;y zupCn}L2{Ib^PFTv{bqp8^hQ&=YaMd`-NMn`N!PI+?#7@mX&D!;+BV4*BuXn@M26-s z*9A21QTNU@`W(M**&b!gkU#2)2p;X`ZlP_hHPthj$o6HaDMAQ6=p8Fd-+J)D&+(7_kqoo{@P;A6FuI_TlRtfPJ(1x47OuSmZuvmGU`a=fl{eJR~(_k%5#gp5!4-N zCH~GGGBG7ZHH(LM=FKr9kVHyC47p(q+WU@qT>l&?h(GuE{>V_Lkp-y}rvJ~kI6t#M9RF${rVWmo(S)R@qnWg|qoK!Gj-PAKB-{@3u!ntJ=eQ_*6>B zr&=p41(N-MO}~o;a4;aU25tEMDkF9a%LM55udp+GDB4&4Gj_bLX)Zz`SgmDcZ~IHx z5^2oGCY439RRKQVdO*75W5putHN`Vb=lqNTuA~=7LBD+F>q--6?v$hv;`7WIX;A9o&;?m~*_mY(w^} z`gjBdEGuo2pqjv-M03uxjousLc2*!qKVlnGv1?U2vp@D8j^LvZ%Pt<;M+zXc^77kk zh8}(zwhY-qS9l&2j;-kBW(&u)OSm*&;FlGR&I&_T>L)%q`nmv^(!lyX&+2}e5-Xlh zKJOfz*U9d&-5#TlKI@OlQx=0J3=H+zNP$y(wn|?23`I5g?CwKO_=Onp)3(jV4P;YF zM*ScqHo|vI5AeEN5SSB|cf6vzyB#&39ScS(rkg;9`m#uE8IWI9_~mZ3tuuX1Q_Fg} zv^7YIC*H7BQa2Gc=pX4#2Daci?aiAhZ63^~P5gdF2bG(TC3BU88v4a(p>YCvxfxJd zPhu6meEPO-jlC7rTgBfww-GHWmbFSo*kq~(z)b0fIQ6U>K0(KNoI0?gq^Mwp$Vayp ztAi%jY^}Qy<8{Z8?tun3`J8OuHe-~pU5^A|xWV;yx#ut$Z<4g~GG6u{8Slk};fjVW z-Pl1N1V=3)pW}qUOki`Lxuo+Zz2NI9g0%FcJa|r>$M)4Cu#?YNJ>Y}pteZ^CFemw2 zjyvTs`unbtRJ+yfJa%<$2@VxRk%nnWHFkjv7Ol6i&&x$F*^k&6^5p>>LOiH^E2AKG zY`--59C3k`%kr&I z!E0){a7jHmgMIGpQ9xvdwXkh!6lKa4u!=L*z&hjAqkGt8xkNv!5|UqR8N`=MOmGkTm(z;#l7Dc)q;Gxihb1PCxNfj8E;}ppu-FcF z@><>9i0#&jEVtj*p3*;Kb={|=R9XK8=ft#F(0qg(K7yLC>&#oa z*so#v7iCC~dh{$i7zi0ua&bF`?Ieg>i~zY`8DM4mA+l{Vhi>;AOotK4ays<4Ybfo` zQK0r^*m^LsZ%-3b!V@RZB*%OOq{^rnA&Za4TsMi5Rb;WV9e#bM3Hr_5$l%1SDqTF? z*ZGD52h(Y9;RPkPAG>lJS*2jw`pdp>sJ7@UN)YOu(&qQO659Mcc`O1Ri_tv-fbHNs z?;{2u$8{MwteuTQcwj)_pfLI`xp?7LK+o*Dl-F)>UX<#a0Ljq&9b(gLezr>WcFX)S zC3K|K+jAF~(HX4s>M5?vlZ?X^-hVE=1g|`0>BKiR1A#o9QSgkBtsW>An0_KpHp>4M zguNGo4`BA5|Lz@hYxQeHeH0~Atk+?~}gfQFL9^CS=BcmooP48- z8*EdI0Cp`j;YP11qM2GQfkvIO@g}PD{rdUR%X^Y z)EJAFnRvI@pjwhZA`P&dL>MI~(__91PQ4T{W%}7U$i+q=xEhb6K8MOvPf)4kEKx38 z=RA-3anbf809v$GQ5%$n0(vUESMP+;}SKQl%H7Kq__j&wvKy|^hRBvrDS^W48H;G6$kxto7u+H~3VyTjY zSkNavwkv5SWU)Eq`Bt|6*l_GAW_@3edRo^Q=HP|d+R>81jlXO>`2vv*TK^)hTiupW zN2%0n7^nb2q>lSHGc20bX*OJ805!wvUF8SLdC&NR85le};>()|@-9sZldCMP%Lz*E zJjH7rB@z?5S0Ci{!VM{ZgN|NaRSMf);P%}PA3+iACX4U`72X)#!5sQuN2pd|JlY?9d9;P2f$0}oYwbj`*1r>4hfSq6eh{3` z9*xQF1WnyUOzsqbd!GyW#Nc03^%9z#bXHCZknfsQjsx|89|DTLkK>#M4H2zCn%1{ox`3D?57D^%??0QxZKseqNp6KIHWcAXR6`y ztAbd3sbTzpC0xI!k_<`;jj~RD)!Bh7P3gdmPfE#Ob}J1b74%-q3q)p?5hPx>lKy)4wpZZ62ojE`VVSb<<5Wu1{bbY}H6wf{sMNpY62eXFF7 z0U{`|%+-he8lgCLS$_iSlK;3RkRcdr(9<}A9o@4tpT<3l;v4(e4OUV#&)&|+4#v*3 z7&o9q)12mfI`Cgpgq`d*^S{rk1GvId=);%@H@5`pgR03nwUWrPWog$3TOjW0zwvAkr6r(Cr14Oe0?!Vr4PfI74H~#r7|=fk*idiz1QlP}a*SnUaoS=0`E z?|YN-5oxg8e>zEQH?fl!)j)XXC3ASZuZ9~f#zMChNu-*r+<#q-f?d0ak(bee*&6`{ z)lZqaoA3##rbn79a=)kB6xoskH-Yrd$B`6;TaIQquksQHUM}TXj4_vo1Vk1m3IM%J z?om$IuaJlIcC(pgDcg)TJ;4Dv4O88XZZ3W}!SMJ#B`u#5Z6&Lx`onSVFBJ&VHQ~qn zMnE{|hRxoZZU7;m?g_337wUZQHamE@Ghn=xaH#RDvasZ&XA|7}lfbc_<_V#waZ$@e zhRQC5OH~BsCNN0pdZ)UTY?bD0Pu;ZKLB)0dfqNBO4t0raRe zQWc@Gv~{!g?$}rb`+gG*AikoS049+9$A{vmjQRkw9fW5GqV|8}S-^B57}6tFB={s= z)_>>7Rj$-4B5@^~oG>ukz6(T&e;L!_tiYWrD|PZKf&z40pU$ckcvCbwE-_9Imw`DXUeS7+Tq)gxy#EZd_*~%iWqggn| zo!0rjpYQ{vnBlOsu#=A`2kX~$U2cZS;raejZa_KETfUzvT7+KHY$j9&T)?4I>x-hEWA zOU%$5pCp|cdh~Ml(KB0iNJ=8L1*VM54R|D0_fO6X;-zIQ77G%_cbqSfMGR&CF6F$a zo!7@P$k_u~*GE*}Y>4y=83;#MfP-P3C)Y*{=35`_pi*R=CJy8O_09V|YSJmH#4qZ@ zlN*$LJB}KKt$*G*LQH?HRxyVd(FSsMGj^9Kr0tWb zTyQdyQERz8g~g9GQHf%%j0dPe7akGhFV=hagvpibiXRSjU4iOXS=v;*)I3^T zGsj)W>vfAk+&2`4k>Lid-u`Hnko^V)p#u5f7{sSHgOV7<#^CCA@}r z$r8v?gGt=$7(jw;6aklFtw8Fz7m&UdPd7~jPOdzj$v_nEy66sA7gGq*D$tba8tH@r zp^V7x7q44jYMBSkY=ed2l3m}6@BWK$oSvn6Ba^4l4ZXWm(nxMr9g$LMT!W2%4e(0E z^7m`x3FHXCbB+Tg!lHsAwkYFQA#4|YVyG=UU_}KgkdMbO(Q?Lt*`G4~2O&Yof!)+j zz%Fl=gPTY-%fO=o$sMv&HwfJ6m9Dn;TGSHyJ_M_$lqGT; z+iQU{8?hWNvtHM3O_TRncB?v3J%=uJ3{60cT8jUYA5Pd+l1O~J&rERlXnxh&9Ph;# zwbemvM+{cg@V9ox|EqpZrn9e!IV)U1@g^TJ=fT8jarC^kzTr_Fw-T|?X9dX5Uhf}U zmS&>!D*S+4!>7O0Tb{M9{*r+h1FtP{1ljjoD1KV7yJjiCPWx6Z;XBLjbU3Q7jDl!; zF-9L~;Y15v#<~Eu)8l7)&4*ok;tIZTL4276{!Ac6O+@m3@@$Rypo5pKCmda3*d?pZ zm-;BYvdvLXzaV5g{d{OK;=JwPrzmQWftOs3(LIt~$h$}HfZ%Ch(YS(??w?SHW;Uwv z76&jzQ4&;lTT@0FA}*o62CY%n#7JGE^1oEp97`K2R~q_hJ2vxY^b)hbeU+{%@`8VM z)WkoNR~wg~JnFKEBr`Tb`ttWYw?K3IT{ed!%)4DvPsb-!DWOXkZ_i`;=8A!LrG3pb z{^@uu*q9$k#F%BO?_Yq+o#fX8SdD^URM%Hqv*m%$Vx+I~ruxj4(}G%n+L%Dbw`u^l zGE7<>$~b5SI}J|~wkI*U2^9AJ=ZbU5jk3bHW__kg#izmXU4v1|GR%rg%zIZq5UbL?KeD_}t{RPCfjE z(}6-8Y&K_T65l*Sa5&;t!W0(HS zWbG1S9#Vf}(6s4F1`)J(d#foVglWr!25Qj7svSFh_XDChMX2jzkUBzkw4ngpvZi<$ zO?=&Vo{>_BA7CXzI&Fgu=bzk@T~{G|P~-J%-aB1g)ytB20T4CBPYaFP;VHX)z)*b-0OgQ?y+TaPV?_C&n=A5`(BMqyoq@{}!nTAk z9Uzhq4~ktLjq7wBCwg~37Z5-ArQR#+J=cf>-HT;Q&i37Wn@NS8oU-OM17=bDlW32y zdQ7v>yjoLu@~rIky?9p<@b-wcOzTGPuhu4pjZ0hHK|6(gIr2hem=E9!*aCb3j^r^) zqXB$tt#R`X#5Q)Pup;KFCfqwsTO(Y*$7S;2hgx71MxJ_yeQ3Ro-ECj62Ayvz_U|uhElAzlGqF^_-8p$sX$ooQT5X| zjh?bZLEU^?`{GqlLYB6M4X~-@7roQY#6<6mrN{BBKVJELVs9x4M;gUBbGP37mH=S< zCT#5b-d1=IjGCtu0v==v5Z8nJqEPvRQ}UCvzIvro^nucT)xpzo;734ICx9ab6kgq@cbRmp78QKlN2Itj zf9j05aebgw)O=>|b};W~nZB|c58P_*;OHbzd6^Mg+v}}WugydIm441+ub2<=Zv=r%!(dKb zZfZY~L)W?wi;=Fk=%F*EtG-%Ebc_AicXxlSg0CQIG*?R5S@kjOFxduBgCK{z>ttnB zpf+b;ZZgS0S$2tLg|dT8_(cy_Sjw#P=6uE?q?X_lpJwSO;lsyPPBv z;BAj&zR)*EtZcn-IkNx+HT8yhhx%x90AxyKd5u!8E=*E0f@uS&s|V`>I?;Gt<&l4C9}%B8HaP>-itn1o2b4%Tt{VgR%@*< zZ+nqs#BswRt-mbN5OoTGvHV$zO)k@>5gBO5%gM&)E*ZR>Eg zdpGk>#x;wnZy#`7PYEk4fK1B!2;ic987H{RfjO5miPW2lw7uNL_Y#Y*lZ01hXhask z6Rh?sj^3JX#Xq=!TcUQTfs0r(oMB3NwZFTc`!L!Bz}0vK0DYn#(6|9`cz6FBZ*Fj& zw&T$OP=3ywl=K#qoGYAbByTDC9ezKVE*&hwO3uc`(eZ^AS`uDHniFAEVA(2Vfa)Ox zq`Yb$TbroU51MPxr{jLSrZ}*4+?PFMd>8=iPSNR`z*^Cl7UAW`4?Bq>O%U_Ci9nYJ zdUJZa58Bkmt2J=5+L6w-V^gR9xAz!`w58A~bDZXM-l08XZS5WIAFOq^Pyj^h1prxH z0H_@gO@-3fayZ-@>bR5Ka@vsCgYupa1C%|G!k<7@{i; ztvmc~Rj|H378^E8tEi|jw*^*2JT{_f<~Ov1h+~cb+|L=19VmY95c)$3!MwP-y8JT; zfYLEcSk(eb>VW!|e(V7NH3LEdC;XZL(J$o3DTTG7=cpUn%HCK>fIQ>n>poK4U#{yx zcFZ}Z&1b)&3d35VC1=?C+Dpe_`Vja3yuDF*bY+BLXAVnrgvJ?a_;y^?Y!KhDdu+lQ z05WOUn0^baXG|`f11!0DXQTHU&njWe?SH>Uma~ufa=(x+AmPv-=?0Xbo;Y!pPdTuQ zu22A@1f2p_Qoyxc1gHogY%DEhQ;4rPLYo~lfQL^$6H5;LDXoKL1VWVS1j8egmue|0q3(r3k77O@RQVGaH-AF^GG#46u6p0mgUp z+S~W|vGVeYJ7+&_3TQi-(~dgIf64%)1^~4vZzd<;YL7X6=m3AJJoQtC2C6j)*K1w~h&!xJwpuF_El4-$?UrA+3dj)r zS_d4b*D+_Si+xO*{uwZTf)fY{vQ9qR!fnPY(iJf33Ex0!b5$mQ@B!H7>~zyrqiNa% z@*V}Kx(w`GNX^IJYA>J32z;ssxcd{v0ARAEDx|wS!>0-3SORpC;*Y-p_q|;)T&$lJ zh+-|41T;VZ)RnQ#x%#kwP6TRV;txPVgtuX1^HodT-lm{-12TuT3pkHq`ZW*%QfQ4G z&<28x(K$fdUNV1DnReFpA1VQX5(ULakcp1gMkn{=LI~WzK$?C#&w&4EH3)wD19&j{ zrDR}g_5pv?$9PQ)JNvledU^s^zkzas5uqgd*B>hB3Jn%e;JCQ0nXJiQp8bFxz;~J} zabT&soJ6CkbNm!=RlCpYPpwh*qSpn*39Eb0Wn{=g_juG@CO<~-{AH45qvL5KT6Lj# zNKcnrxNxT7HRoaKqMM|Ei7-es;qynKn1$rWUBpC)3UO)ZRR*D)8L{BC=^k12_(R%soZ{NFFpnamc=jz zZ|3C6Cp@OJ7*c=# zcllj`vmVOP%P*=K%F{i5o7L3F z=uho((~7kJcY%Kt>OcSYed2Ux; zKT~{{I#^4t3M+z>N8bYkedt*CT1|$rJm^dW?o*DRgs?g0#9zNLG_+?B^T_TsPgj3s zz3R*?6l)7L#g4SKd>k&@lD;^-6B_oB-u(^kRa(_;L<>?dD?8KOmq%m`E@CUtoo6e+ z(n;h^Ex3=(h}5~p9xN-zi_vB>DgU2{4wwL1{dIvG@z)0L`2_i4`XhZ|}fgTz6{%*ED@H{fb;bQA&rfp%28K!fn)t=J9&?%cV9g^qY$gL?+vXu&cKSpf>6JY~dHwn#KALMcz*yji<4TgXI102B@E7RK?=@ zF{_aggq_4QX7w^p_?52}ksWq7z__0jw=j8IKO$oEpy4ym$=+YATi-t3r5$7oYOJC0 z7bTW{`hBWO(gwW(^(eG`6=7ekFm;2f37HW7U(HsjD3`2A!G8_ZQV0J!So75(t7H)6{&{@1>)0*J z66om!$jhe1Xn`6HozH(hm75E(BOG)qBglDq2=YijixCcIGk#pNOgmhwc>eeU!JL>OA!^1T=ppjl{q(V+OpbORWaH#$OF0 zmJZ4*W9#-D|6s|vVqM`!jae%aG+{J*-ke{kcx~_dJx6)rwWpz1%M14Y);Qp=B>NN( zRsMD>?^4B8pfUx+;4-h{!&7ZKhSy$!Jn4^Q^xS69xM%lVSj)8i(d@ioB$;e74H}Vm zwau(XWtnSQIupSqN`!KXNeaUjqE{z_@|OR#O~sPZinE3a{j%(dmGyoxqMs{sivLbj z*t-FJIAmhB8e+M4?MRqI#ks5i3(7NUC3}2m$;SG3DV2TnYa4|aw;b?B<+fOt!iYcp z#_P>}S6Lyg>lAW-^_~ zY05~@sGRbc4oc5ef9q=Z`CO+0<%Fa~`tk=ApBGh+1|#%}er4@_#XX*2@~s%-cC606 zsvi77Q-I;2BE33|2ZUk8)bXAC-`hqzlyj>*YK(jS*hU#oxvv~tqHd$!$2jpFhsD>o zDq23`yD;`>SL)`%k#Fl>|7J@VsC-|HycSWX#x-W0B?7UD!05F-`Fry)B=gG@Pm_DU zdbyHRr&!y^Dv!l&*J4ey=u)jiiTK#>r-1O~ZPUOt>()y$#@F8i?VVh(a}6IGZKZtO zm`@WqBK-%_$2bi{CEbS}w)qP^IDhH(xt`N&Rs}S_Vd=J-)Gv1NV{owW`s!7!?1j~> z{^Q-Y?qf%CM*=i}4KlELq$8@kbgRcawkpiWlch6o-B<%D3QGicnrn(Ek132HSm*YIGldyU|lUHlHw-cCGc_MNHum6VsR zY^4_lFU@lwaY0X~9>J1No9-&0ORp`W>qwwSpIsB(Y-}qlY7}!}= zq=IJ#3Kx66-m?QqjGmI)_EtKrYaNkQI(_Ga`Yi4*UFu16WjqSHoUe%W8VYA*WqlW` zJ~}+x!6A10{@d$o;kF;&efh&i2mH>j>LC?)@0;qUnQ8s)4lOQ>v6T;K7v-ZwRt&Qv zhf8XnLQ#TzHpr_!6S5zTZZ!5B=88iYI5tbuG=-IU@>E`r!D%P=eG*pRD}Y$DMK6Xc zcp?;LW8GI`v-WWt{0Zr1D=w|o+2KZfm){-K6OB(F^mDfw zQ9@U*(CfL;DtN?~pmuk6ZMI17#em6ThFaQ#!Caoz_dh91Y|0jC?|M$$IZY1qs{xf= z%86(grKuj~8sF`|hfp}ZaaT&w+ugGA``a{u^g=F-u=_6z-W(K*pdaEQDI=Q z3MY0!1|!DHjv*c;8AAnQ9maMD3$K{L@u!h7;Zq*7DYhKn#|=zYSOWw<;RVLBEwi9= zp%N)9I_VsQRrg-k#}0P#ftu83S3oXo!HODGTIZir*jIO~ zi|YyjDvrTd_#^aNmkZgdqb8+x?S1GuF634{3R~tZpes|Ck}?%|s-yxB7d7b(7;&A@Dbq^0v7sJ%*e_We3jIQ(tEmK?k4 z!=GVxxyU;Q$WTMEpdMqb>%zcGtthR8wW8hvDRNI!WLN{0V@K7z`MyZ7Xr1~@j^w~_ z+u8TD_WIQZ=QmF;j3vckZ^LpU@9KM|z=K3^;dpu9ENCtwHR`WD&-!q5v3IMdO{+X zi4@XSM)V8o4Ag`2G6j2WwV7FcM!H%oln+wV@K$ND$8{sOf$Aei4MY|(u0X}E8qQxm z4!4);W&CiYB1gIHeE$#T$K`SK3Thj3syzA1+2!-DDjHF_rO)gZ=rgSYyt0Xj@T%(AB?(w3(Z37K!Ijh)gf2){T5W9<|vLV`;GRz>8*& z{=%&Gj=9;IJgr>I5_%VQ9WJ`CeGc1QtNmacDhw%rtvu*oTbj^xN*)p0@Lq$(C8gvd zR=cWVyqLs%jh@*Z+rwpgK2-V7VzOD3t0T)aW7Xe%GKlel3gm0$W}(RHD&-q8g6%7X z#9>O!wY?WR&77CZnJYU(TfXG!dA(DJxwd{hc+N7H0F_XYKN>&4o~p47!|pAmKIq%k z0^Rb;fCt>s8t)X1_{LDjBG=-27^s1gS|`mF-6sTT`uO*$@l&5IQNeT05l>RAK~m2X zmZ}d>3C8oepVN+V?(TO5RO#H8c<)#9;KNFv{KFt%^6J9jqLw0h@gp~B)%!kezPUQe z1Aolyh63#s{D~%tW9hXpy06u_|N3H-nuGpV9okC%#&Z*0A;Y!lrM509Xt37EZN)7;*MxesE+5vItjB)Yl{o(%u9;{ad%JDt0ysaF z!UDcmB$fDfo;v6;AlQzE40Y*=j}qc7a?(+vX%_I zxMq4C`J}TP7DI8rOZm58u6w5e&8;-3=KO;9oY?kI)hlsFRoxy_&8oa!ZQR@4mcYnR zwC2&R;uO2M@dMosd4!~p$2x?vkzyB>j>262;~mRUSp1@l*F}j-(h9X*zfEXB5FfVf zLlrjj-;`XxB&+feU8E{WpIOG<_z1+8`EbudU4qZ6k!(g?T@kjwD2C}V+AdoWmG|Ru zXk?_~IYk-40DM$|{`h5UXFQY^1xenQEfdvVWH7Q!@?_1|={macVA|`6KgNi)-uxEH zC@=E!!G6zp>#Fl6&AysH!mZZMDjRVfe<6Oz5?Gr0qmMyyx0mWU=l@zX0!E3(tbj>+ zYg1*dT6hpCCO=Q5-%wVn|3>XV7LT6)K+brQl-X*LFmvf_SJ4!){7w-< zbOROuJ&CUJz`8a$U~YL%xFD+&H%;#DIqe_Mnq-pn7nT`?aV=4k%y5q`B2y{xHHVIJ zh}C3=)aN1=<=kq^fE)2<_FYb`Q6H9J)3>0&aybK`l(#YBw-hWvs~)gUBqePz%7yKB z|8|1T8GYpVT!gl=E3Y@@46HV~?9Z{~M23^eUtQw2WN*V#la$S+*J9c^lFm>8*b=_;UsMQv2m5I}rM& zP8ANCjf())uy;TLiAIF^m<3hKL{ibacVWIB?+4%qw1eN204vt_`opXD(k@jpc@T(R zb{^!4pm8=e_L8!_y2?TK{eZzzY~e3Ld;>Bzj5gzmG*IbSfN;gVE)^YrKmEJ_&m5-U zP_re@lGXdg3sZ~6F~(*CrYOmjy1jIQ;PM6_iBQoS5^o)9)G4Vn-rcP?7PGn*_TdHj z?Z6tfYH7cRi+dc_ir8ap+^yx{YK^qa8@OD?7G;4LYnHw6auL42wBXdb8~c~qt?NaH zzxZ?cA4r*_^1H)u7xC1wq5$ROxA}gs7|3?d-9)vYAIs8c#=O%Zk?%PX;=PQY)Gm=w zm#7~C;twLxnzGS-y?o;2l+R&KHi$or4U{{*Jgd_D3`=M8Erc5Hrw1k1=_XM-)>HLk zf$@V#(Xnha&f^gX6v2li4eg|+g^W`~gjxLxY@G9y5%ERwuG+(mf5)?&H$yq7!%Iey zWT$pMv9*_1bQ**4TIL?CE2W3VjNCTVZYnpW&6#LSar3TKt&H;`PuiwT124)lf)Fe%IIUnr>GYiD&d=>B2GJPsf@K;d@pVJ1L!CXf?{CB@K+J?FB z-Q5hHA z&+5SjHaZ8Q5+#0Dxz}ls!O6MMX*f5et5PF)my4okPh9Hj^cr$@pWx)@4NYGl zI;A6XhJ`}+uM~`Rk9$R8OgoeDBJT^D3spCxV2x(eVo5(gW{G?kHf1z)cz@4LZFkCr zPszL~-PYYnSfkAK<4&aUuIH>qG%!rZV=Q{BLgM)^nSO1PNDj1;{yn8mdgQY1Z)V{> z>}6z&c-9X{v$>sX(Hr_B`(3=_A!*i(M^;Ok&aYgxdz9+$!os!O!yn|u`OyY8hsEx7 ziZ&I-o(h$bfVEikQm2wD;jY94(IPwLQf1lroJb+(s~7wg2kkf11jay1UXk$Ib&7iQ z)!?UokKIp>)&GmV_l#99YLf?Cj=4*TY3vf?_dL@OQ_O& zXrU&d!&amVp(YRrNH3vCuYvQh_j$)V&b?#YanFbI>E3+E7$gr*)>_Y8v;5|7&Xqux zDbYG_v4c4sWLe^Qan7;!b&)oNbhL|=?@M&X)ia{eenVoYB;1;*xy~euHuHI3ApK>f!R}A0Y^#esdD_qE*evHWt@6Y#4MHL{*mWtYDu3H=brH;wVN^e1a8TRT zJF$un8b;4$g%jyTwOsl$3sbDwSC$Ey;yVY?oMyUS>eSr}&CPB@g{VCxb3}_m@mxm; zqQ3%KB(?v65G}sE-Y4DQUlZ6moz7Zt7#)5*^EY$zQOb<_`Ro%;#`yP_uNo7AHDa)6 zdS;PsY=-@f8u8bOOThMwx3ACJVwK0OJSh9DGeRT7;9%%Dk;;G;cFUA#u(RWvru2?> z)LMG}NS$BZOIc{#TBznm!dXf3T7gbx)r&x+QX6k3d)?n;!Zs#RAlWn%wcF_}NnYNF zrEUFt%S;9>sYgccR)QZ$SMRFyo#xU~+gis3>u;*^C*+x-LfB{=X3!DaG~~p=okWY1 zmPX7F_wZTy=jpOMf5LKKPz-MClq+7`VgV(m?;qfp8#Av7YmFT^&ghn=Rlsfg3Vj}p zA%#N}@NYZQ>y3mbqN!WfX>BM|F%*<#xl5M9cq`6Dn&b+e^zH6$dRUJ!czH^HB78B` zL6TnR%hktXxA5upIWfpegJg%v?P|mOqCA^BUxSS+qP$MwMfOEglbOo_<@yh@Ot5<{ zjdpb2KrZHQ`1X! zY}c{l6?ZCW;EI9XZxN`Nc(%k^(B%flxJ?+!k-kAQJvq9~VDOK-i%EQuP^fgd=aJVw{;HqQrp;?9x?BRfVXSUks$rE7$#HP0Y1 zNTW=mX%YlyX@Dk;?idZEa2LFUYJ4jcqNEuy^HtMxdB(~&bEv;ay)SC`LJKvKFh7pY zD-8OLV5=BbJdn^LY@Lg?+@bo(>^S0hH`Hpvl+|3$JW%$MJ_eZDLC+Wc9y~X=9djW5uNw{s}&>HP^t8#A&h~jKkY7 zvyQ_{)xvrTYv^`v0pX&tszKt$V|g3=(ZUh4b)?zKhuK2tG~YQ8F=(KJv2fUDd;+4x z&|I##E%aI;5#5NZ1L{fu#S3fRV7BXvmVfK)eYgGz*Iu`jW}|(4Ax)`jPMC_&YW%KT z(qQN#k*Qfq$$Hx=hq`nLsPjgmZc(}{%h)Ddv^;5K?><#F_r+e`jR}6RskR*8lyY_A zV|ttc*=VAtRrO`gWP^;e=o)c#{V*Fd-Zm zpqF5w!${z6-j>f=QV4f-s(4d0H9=eOOkvoS?)Ybf-nS*dJDSvPahMpA#bv*_OoC^E z%X%AZn(2?Wj6-`@bKy@EbdNJ>(BAgJn(g-LJ+Frx$e4hxG6ve&)i<@$XA$XE>Q4P8 z8ATk>?Ss(_h)W=RscXr!1z&og8x0=^&Hb#39Qyfas@sW)%jPL#+H7fMdp(t-EH<@<}D$}=21 zWAJhurt7tP+dB;{Rf39dl)v8-$g^K+LFAd&Yy2#Y%L#J>Oy%QoW<^eKLly}s-rU>F zcBoTp`T=vDiTiRojw?h9=Kl=c#|&jQlU|4-|CC|A{&Nzt5?c`?c=o-fsn)yE$_!x( zoa!`GT_sCu;I^>3-W}!q-mkLJa$Bt-QUg<P|ey&rv-wDsosc?`c@6Ru1wDoOyX>%IrbBy=^-4kw!%>PV*-9hS_)T zN@HpG2 z;dnJJGbHn@W}7e~bPp}*8$NZ*HKb;&ZBmINOOg5$6Flv*y&GliZCXL9>C2_&L!v zZ|~Q~Z+^e)jo}JXdJ~_{R1j;s5KwKR-r;{z+6}QkH@%ScS&PRpj0FO39{TSwFRjxRxPP(; zm0>H_4rfC?s>1uchsyK?G=Dm{px(Tj$nlh<_Kq+3u-E;46nVbarcF^rtjZV82qGkh z^lO*jaTKRr#R_*WGyfA6b*1CbJ)l_6L@j4QVRu z5Ia;?jZ}+~dXN8gxaej!HziK-9a989Q02kh1Th+HPhZrXwzJiK}cYcv^#gcYdPGzm$R2vNas8z zi_tM3Z|s62kzq*|!Q{Px<@YfZts@)ryIBVIvPIV}_wA&MZwc=nc+~KoHhJiVo%HSW z6ul|3fO(5`@p=|_2-JE+f*ckCU>h3!l$o{!_>Pd^NeT0stM;!Ve2W6Sg;HcQg}%zVAPWr7rHS zaJ8O9G9L3M7icY{i#SmbXI71i2jDPs=u%>Mn5@~W^&!tO{JR>SlHVW>D?pM2=ixJ zZwg`cYe5s`Dc6j7AH%GMT;9#SUwG`Z&zAiH`*QJ=HqbiCc3s;mK#-F&X2Rn?Lv#CK z`C1cvh%luyS(58%vLN@wamzZFO5))!Q9$&lCh477#hO-{5&3BL1LJ$8>p%&ud(xk4 z+5&znVC`Oxm3#?n$bB>m1(qYYv7Y+pr!Iiz4=O!tUZN+WUE&?Vpyvw@sC114)8JIu z)oPHkVRNO3AJ#*v2p^OuEf++V$Fwf zb)AE5@E$jz;UGb}oTg(f@N1XO-7OWp2+vXR0KJ}*fS}+p$ci3fBDh$K2TNEyv#4I; zJC?oJ)N>nGW2W@WWrW<^&eHQ-vtxF0ACGR0jvf9PDD7SJA(gpg&{P97G~3QR=v{ew zEQm)I^k@j09Meb=TzWDV=|n&$SXKK)#b9NecyeNk%pf9r$~8X|mRaJ21Yc6L_vtEy zGek#x)<5ldNqO6a2w)Ype%Cusj?yV4&oDLKpajReE`Q0pdvbQpo9u6+?l6o^xfY;V z?6mdR_ED?kkC=#AudF}TX{^lgEy^(t1?LJy6b*^YZB zFZF}!WL_>e+q%q%dL$bELmR98_5Q>Ua<8}|uuvx|r@>NYSG|S9b2wOGpsVul)k84E zxpAwhPM1~wwgGgflGCUgyC)Qs_XFWK&^RoZsh{e(`#v;@!-Gn3`~ouFZb&T~g|fyk zCCA_|OqZPObCTXSl_4OI^!oZd*|Kf`?mivZp`zm8Za#Ru2?!UrJXHr=zYqZ@1*W5IWaZI>xGmjaC!nx!-U8dxD6!*E7nmn+ zrW|kS>)}$9aA)F7%mpc(uM_><1<73uTdAVM+zG=&CoD$HX3xrL|QmYHr=Dxq$7p?!f`R;L1F0yQ3OJBk!>E!6A z@M#|gULX-uoJ#`#^rH*B2+h_9(ZzcQXXzpl-3Q0QqP^0KrC0&2n~?^{_e2_20HR>= zaKha~1zASD@;LA`tvL0M?4UL-qlDaR{)pK=L1_rJ-?3a*LfY3L8e|(h;m82pWs2GD zw9pb-9CqAyiU6{l{ybQv%z{3M=LYoC7osGZv&fc*$FI60$U^2C)!X<<{%*p@%nTd# zmZ?UQt%}f+=$WU_{fDhooWtH=O#-TCN|JQfr>KIeErn2Qj<2TyP9e`{uohPoF9%9@|ID$AxciJvULGQMIO{iL~ zY7WH`t?bB?o~taq%1tVUsHr`6^0xj&Uh6qI*Vm?CJ1Y{)Yl<3a`E)z%5|zpmz-KG) z3>sF|?jE+r0>O(xpQsLB+kO|Uo_ljW5qVSEYjU7+M^Pp@nr(dgM~Tb9Uvh`@R?XEu zH4=sCBS!{;%%7TM5=xGp>`BE3m@WRCZN2)9ET|>5pFhg0iM9M;>tkkI^=&@;Ev1kH zKuA8)JNQe1Mj9=h_gx6cklsz6o)>Mp?M==r0~&~g2E(}|7G}#xgZ`yq9$yyVDHbkV z_8U+}2$GE3)!i!Z@!C(W4GKL{`1C z)-|3gcLr6qq77x6oj{PtVE9nhN%8t-*67CymWD}gBT)De>55?&H++35Lw~teW185WV@NQmhHa^0oqm%E8#x)Cy05-cRM}{N-A`H1OLfJGb9|k= zZ%vyF=vcayVFLehOVXa1Yz7|2?Qdw~X=IWe7G0vrq$ZiYmRB9C3N~~#!ED=s{7PFF zq5OerM6f4XNt(H};%X<}!8EH|gIi=q+K}%j9a2-Y?56kEL&zgjRH3#O1 z(qg&7D`75OBn3F2A6Zpb6Df-!NfCq$E=uiHC|7KHCG7J#Htz$6x;=4UYp{D-&~wEO zb!al_IEFJh5Hl`(D6WhRY{*e3iwVNP~9NtOE&9PN(xqA+h%lwS=fkg76A8htXPSRr71i)4lbyBTh-BS^k0ikVhtG zAALHDyT&_Cgt7_b<}K4`pL&J9{?QUju+4zVla@yJ+Szn&YcLNhX^ z8%x8(ztaze3D?I%tjvdSi@p+|4ZuU7B20?=SOsgUe9eE}&M4RmudXdOTH{gQCKSCW zaALL_Q_M73+O>2}G73(}b=q-LKYrAfd1tJ^%%JzP4w!nwnTe!u-~usw*}q%05Vzf^ z@S5hT4nbo=;7xNTvqfMRJou*wrxfR+iB)iwwx%d2k7C|2bh?ICT7ivUNWF)Yn@nHO zpsmrmi+bF+7jIr`JLb)j?<7 zvbe-yY1m6y@{~>Jj|KOy1uZVE@kE6YAd1`=vW2ux`1%&FpS^ZnVepub^y%}JQgTPQ z^*I8oL{(J0>Ph(f6=F9}q9Ds~dxaH|Z!Yd{EO&!0t;b-t7=X7PBdYrR4iyT`)e+?m zpyNvbG$Y7m*?e}=bz9S^vfnZlUmWL4N2SOFFz>VVrK{xz2aSh(-(5{EG5xA?BA*lU zspZrPHRkcn-Z$*F*@OFG8pGV~FT!XtC2(jyz-GkW)Hw97wyd79WF8u?GnGEu(kK{X z4rC5>Xzv^zLBcLdOXCsMSg)byIW;X4PCM$8oGV5KxLv1z7=6kOa4KOK6s&S%X&ce2maQ#DP< z-R6RVF~G4GTGzN2L2c*IVokdG?V@rff-oNtc?Vx}OjJ`pI!DeGj7=SF($JBNP3bP; zpSP$JU9I(p>PxgT0ZlMsW==X8;a1~ewP$)oOFfRmH~N%4x*2ymn|nxJab@LHmx3;p zY(~+tHYV7bB_Y{qTn6jndOcqwAfYQOY*>P?GS!=ev+OTGwIEy)c#lfeFAap6Lt_&?f zG&9bjRhOGN)mM7CfX2_^(g=H?8K*4tbdGg|?5GKU%BDmB@mF3Y|Iix16BCtdUW z`F4E%XzZCBNf$AMe#oz(>1{h63j&KK>>l^}`Nc1MoB1-BQ&0*B=;HPNcua1tR2n%q zhcl)Ow_#E96GK&9wd=uBPg~Ag@3FHb<PL0BNZf+=#uJpsG>3FDW*n~3ir$u?tsdAiHEV6n6L;SYsT^8 z%a;qUI6KsxKs60R87x=+^gjj_vJR;Z<-syXuQ=E=6(rfJ0qk#t0*MFDSiR)&y#5`5cX#Ta_(gy>sIwPIR$F6?j@u2&C)WhRm!#>Ds?z(wP~0&yB@2h=h`%)NoEy2n zibb=RnkNH4Tfo`2IhCUqAuh{tgGzh#ier~$O!u4%KtSY*;!EHFtC!-RZ>&gPD~YTU zuG6I1tI}FR+EECca!&p)c+9gBsOFMYI4&`ioc zt0?57hP32`PIgH0dc?f)bcOh4y(ihQwe?j)(V^$rw2W1;R$xU3T4IkG1|Y4KA#jr1 z@ky&-YLccs(p*n>w(ef&0?|6?O}O@oi+|q)6Egb;gZOIKwPPq2vsJ6j)ja8$bc^-J zWh&=;0GE+Bt3r~mf2!T>8ufMiwWg+*7oe81qw*?*lab|S>g@qL|2&+1dkek!Yr6Da zA{!<1mTzxJ;=#VNdbtQ*hw#Ntc_@3@u8#@!-S#kRxSi|iB9QAhu<)FeJvRdVI4P_c z7)fk50M-X}3GVh*cg@SH10ch1$q+ zfq#hkXe4;8L5r$dC0aVZm!2>N*87J~rQONjmk;HblcpZQ`WM*17p` z4W%{Th?icf>@&q2{MKb8mah+e8dKz6ampfJmORm# z6ZjE^Pch#yUSMn zG(}_|l&WUJN+>3wAP$}-^u5AR$MhVLQbz#Q5b42zycX39%3vjfAC*QOUsdPD0mOTo zGkBTh^et(RmD!ZBR$Uz-xs__i)b#t^e)aR> zvAmrlV@d8#sPEVMzzBE??wNoO@#t>9+q8mZa?#Pr?oi4RF>~XXvAWfy=yxq^`1T{6 zPtQrqzViEAePXhzZ#n$Xp+DG+ymDT(n_34*m>9n$$kP* zns*am$7>!lxZ&ekVWO^QF(to>*~7iPkQX?!(KH~Z^p|gyqqL%M1#`&g%5FW~ z_+e&g)SjN7kG{psfpBs4Kl*%e(D0FE;VKZZCY(|J;fZu&0YD|^Ogp^YdQPx)ng;Zf zi+%a`qh5*O*69+DdpRI8*bT|6>PETIXbQCm92sl-489M!g`j$)96DslO~Gz z?1Jy{P!K^i2^Cj4=f`XZJh;8A8N_Bi|PwgeUJ(3>)&*TNjliw}&}x^yxAA{zhTk6)9i4}7q7 zMrGemKCQ+Pyrf8_ly((PO1A6Wn6R*6aFI)0e;$-K$K_YG`jq-n`#I~w9IyL62-T8~LAf=e<&d^U{CrR%Y= z!zufy`Gv>eKdIijJ1opE(xuq`F{=0C{amRtix4+=C5@!>QNzZE zrT%$^Jd>2!;I;Y%yD7h-h6j!_W_1y@j&2FSPiE`&PiV#xo&@$7U+Vmc%6M!<0U1cs zJ0~DG0QNKABTG74$D+9WP!#R1Zgv1!y}=K1qJMkECkgYW4OOM|fthcG#Zlz<-yz2{ zdu*W$nnU)@=kxbtu5#k&Z>*A3TK4hAwJm#AQp;a1HIz>iK(fVpR^9#d%!OQnkEm5Z% z+l@Y@+D=A?K$!>6?9S2( zKu?y@l5NW#pkOXz_kOVk53fFZ?Q&aE>_PI9FHd`r)I>qowWp4Go(=#@op9}@;WqxUO%e$OGL7d$hcui#_!^YkI#t@?SO788c>U2Uvv$R`Jg5t*bi@SVNywX?y!Lsya zGK2B5H$iGFwKj_;-iD)}zfLy&ce$Bie{j`!rkwyugOJI#I*j`rWgb**#8`q+Lx9y1 zyjmE_CHD0#>ZP*~MW1ve94#aA26MW9`$E|D+!zu7O%5I8;7}sB!t?^3e1u-3ShtIX zF!F_&OBW}g(h`4n+W@CnF4;YFka@icH!G!^`-3%+u+KVlw@p(3!tJC~l;`?%2_5Lq z=beT9S^DL`(@tTgBH~<`ulG}6V|YKc!3ET@E_e?GdT~PVt@aACJ9So*TDr}*a-U%$ zVI?-4HBts>Kyht;5toR|zl;Zu6m=Aa@ zZEO+3E<%A>5~&I`g_n1yda4}ejC(P>{($HJ;ZTEpb~Y3H%0S6~mKZhFCz<)Idh}T% zgro-{*ypBAt`mT@PH}3s)$!6mI}ZtI_-lpZt&Q#iBshuqq@)Kp2j-F#p$Khs5=X@s z`{SO|ueMVA!;E>)Dv@Kg*hF>O-_j9 z_3(k?iX?jW%NJ=@;MH^K!mEtSgVcW?=(O4VYp*_}oL$bJX5gXn+aTb8=MY{Me~P@4 z`I&pP(QBscY;0(DlkH{9^&5mV@;!{VS7mBKb=oR`K-v3B0A&L&a*pQ`e2M#>)%z_h z<^3vNOz;7}cScUrWryHv+(mFpWXCOBA&OQ^R%sKZIYPt2RT`TWHX^JR=tNG}7(p%y z>cOMUN*|AO`kW$S(ht80>s{I;{{{aEmDCEp<-jQfEd@w`;wy|LUpE8u^H`9@I&Z+->ZWYD7_n_TOsE8>H!6j-q!h}_b2@kDmSp~0s~y@T9pi}Z*>Vcg_jF$y6*lE-QA2k^(l;gmsF?Eie^6uk5zjU4 zL5fXXGi-z{et_(IUrbSS8k(1D%;z$UC%+*BnM&*ZuOwvr=r($U)(PQ@_ymR z+c-ImJ(FpA=jhR;Q99`c?;30~YmUM`FzrHrKVQhcLRp!x?!V&li+;4HyU%?i>~2wE zlv&IW$!>2``hs0TrMsn_CFcT^CYwasXkFB*uCj?1JCLH8|5bpa2Zs(3`NH~vO9Xuu33YiORiI8LRD0@8>7eD^NR%e(FB zqKRVhZ_>Y4ztcg5mJ~o1$BXhEijx8y#Kr#C3U@K@1L=m&6XzYLY~ur;X#wC*;Ew;i zir&aN)|Y;TKDk$3`VLZ3VB;J;ZxT6m`_hOkz_$43l3xIGZdW(HV`}^N!>*WFU!S^C zbxW7gy?lS;fA3*Dl8g)jov@KWkturC7d;3lCHrzELOMVfjH0_h2IQa1{uXfeu6UB= z&%DC6+2{#2)2Xk&>-8Zd4GJfL2nH9!0>0B5{GY-R;)8bs_Yx0^>eFhO@eP`u^RF;K z>wzSP;+V;iO1zoF#v&>Svze1C{*D>-zul05>Rp;1$?_?7ZfEzc0nh>{BNT#h7{8{z zAKW)r8!udFoBp&M92omg{+H^Pjp0FxIw+ESX_T5X^xrA}_xs;h{;MIt|Nq&4uK+(X~|D3!s;>u4py-#+G^Nd7M#O>s<`FJRg? z$|i3XYp84E7g;+Kw=A*c^Ck>+g!tO5EI;`%tw-NTbOU3g-JTm>TVL*-`6;4oWAwp0 z)fz>-W)<_9#Js(_qqU0-)8Fol*^ct026+)sRwTLS?73v6cO@~kAiUtsjF7K`8b*9 z2$7$OvnRj&BM4xN@Es_XAnq#=Z2gBkX4gO_LVM}6zB#eGh~Ou~H{Zl%p+2&l6*i*) zxIu6+BvC7~y5+>w)zQn&7E&ngMJ_)UNaM>tH(-A8fQCxh<5mSx42N*>9%MhBPHpc$j^%c-#-P}^uMPwh*^DyLcUa*7b96NeMfLx|}+qhuMyOqIn zBkgz6lu5AKKfmi1v!oIe2%BTr9FUrG(32%6U5gR{ zpb^Bj$AV!4w&|eZm9}wi!o{MWG$N23$)<3P@;b(t?J&|kJWDMtu+veW|q`2;0kpdnY*-&$=HbGLLU~G zK)ic?y8)v~NQ=T~(ss7NK|_gVy%;-NmFfGyD3pR4?iFegWMpdAUAbdJVcVM{COMCi z9&!Jzy0@M&yukB>M;oU-ksZZ*-?r3e>C77k=jC=S<*#b;-Z!q0nG75mWp2!1r01S) zz>f-U5GK2OJ-)c#0@hmQ9Z;hCw?H?M0l8&4t*-=GsA#`VRrFp&!j8DcF&OAqVwIS*479e`t$`o4)1$`=gArdPVE4IfU*jN~I7lTO5L zfBusAb~J0xLmV@eE|b}K-W9!x1RJf@-|UCEMt$rB5B;x@zssiX4gFX?N*x@I`^3V4 zc{vRetqAWSmmm~KmRdJl!N2R&sNoB<>5WI+9zBd9_*!lDLsMvxGvH$A3X8}CDchCB z`XaOlW+B=qFiohqrO_!F=-)fZ7KXOgEcBdIeWNEN9r1*Aw!BcTlg~>(n{u!^iKo_h zngkB9a_DWK;EgkrL$w36S^F5+@y}uBp-JlhPUWBOKGxn2rGr-A>(P^;E z?`dqNyrb{qrfs%qHUS^EuLw@{_o-X1pFTtwZ?H%}HABV08{@1H%FL3+=~+~DxjLe8 zwbrRTv-z66VV0urM8h4?E@K(9x%(oln{nQ+x=WKB_hLkQ>Jn_nUs zhmz0@< ze8sl)$l4?^C$-jGKCg{%P^%rZI;9kcNr*a`EW&)x^oKlY5GP21fu>V`XS{`n zZ^byRika`5+4j7Pj9n!a%jaKh<6CE3EP*9z-3?=c!uPv)%MQFk)c71K&#Yu}ATXbrvrJDUdC$QPP>~>PE zlud`Lg<4R5&<+KE3H5N?I8Mc{NRw3arZSP0NsEa++?F37n^*7NnP-nRk6P*hSy1WiHZ z9QF0Rjft&F{xtY^zwm++v>7Hrt>ANt`?~B``*Vum{=xKH)0Q_in0y>glgQhIj!%bD=Nsm-IY0K;?MdZ;h}bm`ysh9eKhLeWuRq09S}&s|x_-l4^uPQ7 zG=bg)-4s@vWqv)Yn~C#vrgd<3`53wO@%+=~f=5ZnCXJv#NYg8AP5mSeIWZXYd}O@o zDvOM;u+kGEs-bRNXxrIZE}&w=NP5bY<#>F!l6ne5v}n0=2&(IEw7)KR z3Ll>ATH0HyR>p5&d9?$l6{Ax{pycG1GCjdRqyR0XUf;NHd>_T>xmtW?tp&g)=c=RA zx_6QKhMF^e1y+4*qfPCD5X`O_T;QUSlE|4QImrmo`|1g>aVH~UaL*e8z#U7ejZaDF zSL5@UlZ7ky3%R$OIReub)ts?r48e`^usFaU*hO*icN>(Os)Huc47*Od5(SJECKYBN zVmWoH{LB@BF@uQG(a00b^KDc0*1T&ZzELK8Ulq6k>_#Q-CO|(bC=P@| z7Z=!vW{Y$@ej}`h+9VYzZQljRQRLFIjDWREDemD_etQPWv%0>HQpPtKUU5fpI8rHc zdj9@gz#PGGR7+FWJ74PgU9~luHyZSOr$#uZf~g6@h=e4MS@a;N|7Y{DgLc ztlN5EbH`1dBe3V&1#)UNUIhWjz&)GRf=^=5(N{uOKJAXaoREMtXdZzRPrU*Lf$^$qgQq}cEo<~^Tx zPGNa9{$iA9oB-$npDrXI>YfNky*MEy{9|O9;%zF$5I1t+faoOrT0|Q)J0jpBlLNDMuIHlDugJ0G1KYA)pO%)%M6S=ZT=$~VA z@9U9Xc79f627|>XClCU8#yX2(0LR>!cKAt-?d#qOG&M5?{`KvFzGCbh|0b88Ulgy5 zmAIQr=d|nfdJO0q<}{@@{uLN})K!tsCOru$`YMo=8u#KKRK=O^A3-zW!YymG;hA?9 z9|!&>`h>_0X?~MCaTr05YoweP&8-|?U=VWn+Wf-z8+daU zvONR1au(F9^GL_7p;-jhMafLTbA24R$K{cq5*3*ho-m;+wHOZHg^g2FXj!;sOPh@Y znYoC zBPEpti^DVGZ=xG2X*Ta&W;5+%O+0ao7~@g9QA;`V7V%`@b#2zabh{j4S@90m3OJ|} z2t2T-bX$lDNTwX@&FR;i{KqeuthMmn3i<7N_>x{kYG@3hgvOSSchb%5!K9F>-p%RJ z5(RGq14r3s0y6>v^0R0n;acnYK4ZqZ^laR>)T#kL)<F-13;}^?f>uAVF-hR?6CN&df-K5K6Cqzvhtfwg-g>QO~KWOk!i%eRt3TB&v z3y?kc++Q-LkzAtZ_ST%VM&xt)pk*{4M`=c)0NHuYW2%hWYPpCT>U;_ zNPTqJ0WX1SLrtenn1gMC-k~qrVzS`szA-PLG~W7OaQz|6(jxlG&~c6C=RRoW^1H1y zS_R~jy#C&d5#Zh?GdC)&&&TQj2V5gRRH90oeXInt7#cnCYtk3GpvoSy>qZK(r8rye znsRmL#U(d2=Qlz9yV$AT@vbtMVLK_BdUp$+3j{7WvYhi6C`bu4Q|e$mlHmOx4$irI zk+X|Py(f+JYHtA;TG4mq@F(M5E$409fbx3Bo&=M;vLDg=*G@)wOsjC7NwtwZy;EkH z25ZL9V16)W;fW<8{!y`-JoDbt(#U91m-Uk1d8LBmtJv>VuNpTcxcl*2TEZu@gZwY` zhLy{j@m9RfeQcfIZ+?|_)LP!BUR`L2@Sr%SJ{M6ef$B^}lle9wSIlJ1Cn~PEtXFYl zU%5qag3baG;;jK(b-dBbyu)H(1D^sFu#Q!HO4JmS+P*@4Js5^-X?S^E#vl>&6F2`& zoF&15LRy#J7uQ;zEjnELRbCj|RCIJ1)hmLv$IKw13<}_Mfh0r2DD91Hn#h3^EWX=P zCc!RXtfya7IqR0IFXf@N14$J>ZS8Bnyqj!>ec#ik$*Ov0a$m;eX~o)P_MYH$Dfd@t z?aYz-j?hXUTAe@tb?}!e=&z+uciRL}EkX@}`egy%hJK@)>*@z4r=c6e}*;nW4-Uw0oUnqK~? z0%5jqJ7b~ZC!O7n{I&LUGwHQTzEr9x~_dGW<{PIop1u25&j?ejG>)N-(s9h!2DR5n( zne_Pdc~AfI=m49Dr$STNKQ@Ov3qBtLyGlGhCnsBWw6*k*BjQHqo`&!9L@h;A? zil@!aY^~XVo-uJY?S9Bi-%pywZh%*hCcFjQc2YS+MNNbMg z<2m;}Gs{wAv#8V37&bESL`3ZHlX~xF)?&vI`MqEP^>)PkMA_jrCQf$J-1gOn$}9Uf z*I#qCFd(mN(khhIa7OSMtYEDi#ld4Y0~cI+TdP5f0YXM`IN6GzJboI%r|iA_*xDAT zn{^ny09N+1F@S1l3FHg`4fDKHRVj-%mWRN3Py0p?3!4szqLJ_)r&#LaL&NIW4e3GU;> z%4DsAQ(mtid+*ScA+whv`}W6+l^DG2nzOj5w|mk*}&52J;P@{PD`Ec8A&#x!poiI@OCXlSBD2RlepO?(Bm#TF|t%6D%_xlPM!Ml-uE$>cO4hd)U&5QuO&-*pQRuqGEY1Y zIhT_&B9KMiKR7bFirMt|6IT)>sTJsrEtKCt7B1?-E=-Qv(6*HO?tBr0SRe}Z?uD;| z;Iv4{QqZ9FM2)-ihRCJ}urRuDfQ-HyYVa!fU`Vl0fwfd6AmNas;R?>a%w{Q(ej*Cr@7;9g5|en zZUFPEP`|o=b+LPA&`zyDxcEU}#qfuY4pKp@dKfMGD<<=r>%{e{;`+YRqeEtoiYFW# zSw)xQcejK29`pAycaQn2)pv6>@S@juEx71{Ih+iG$Tt3Q4e5V6*41lZu_tP}U9&aC zk9Bvb6=Q=)6^w^-0^xo#3QQKwv+cfd>H+>S>DAtP6V*03r?GQSp#bE*HPAMXAvWXWq5ysgflKI@S3gBow6CqgSl3Yt(FIY3z0DTV!|m-F+QFBtq&-d z0Fmg%h_LdvlqboSC*yD9YNu{R&ruW419YJGIC&Ag>b)DTC+aM~-7CPO5XJn1pHteS z0yzk0Y*-CcyP(VOOm!$K`(+OUtamSComT_P96SpGUDsK?1ouUl;HtM?02mCtgFLc$ z1PXm?;8{Di`hmHQNfN-nI}Zj{926+4*Yrl1n{}ziJ*fiQo`u(^%fz%fgR1FhDAC5e<=D22NaQ9Ab@U}1^u`1%QkrSpcdi+L6>N}=C6+t9BTE_tyz2iN4(3+q-0MpIX=Xz_q}|=tqEAMShcQW&iAnXyHLVe>=b|xc)9UM{@HXSCH2J06=QK{kT);qK6x7tMU8j7-!9o6$-5?*vuxYG` zNBGl)oX4gaW~je}1EdwxG#~8dw)ozb+i%RalT++`Pyi6Lbnh6x&1~8PT~XXi9LgXc9gs4zR)i!ibD%iV-R=un7wpk+*E@elDm4TGav4e{Bk6AU{${z<;5I9|%_6rel) zp1(PJ5$)x&QS@@m^eSPhXxpw=We7LiZYwe(dFRd?ofJwDm;eh~X-?j-#Pb5ReCKf;u=zvNs>Lhv%3WbM5^$1FgQI2&ANZ>KFnjv3*+_(-=LlzW>>aF8;LU@ny zye{WK!}xJtuoW2RJEuA7mld@{jK1L?2NyNILM!FP@GsYJJZv5VW= z%qK*Yxw7o~WLC1Q^HHr{lQnmEX!A!re5D-MV_@HJEX!qFZ_2!X7x#J|EKkH+!9%*_ zw$%|6aRzr~FRUFtEYDCq9EPus$pns~hb=}d=cSb|U;WmXuRGtkV~oftiiQe98l^+k zzIvc?7^{cn=gG1-|3p)Linh7`D)@<7jawi$Wp3@zoe9{Ir%cDueG27>obUA&l00=L z#rK*a8fy=U(dMS~IN|#gIUREsLW=8P_c9EJ)v`C?+8cfJ!4CSzR4?LQ3sF8&E@*q@#O4?ixJ)A;f#*-RwtfH8za6%Qi_=x6ug?B9Kwn7~#V z{+|A4d##cQv+inEFk|agc_dggWEEGXhC9tXldoqetiI8!Zd^))Dr*45Iv$?{0wMFO zJX)iZ-2J?56Txlq!FJpp?Q%Up*lKge1j9m%7)2FFuXy2ALLH& z<@tA~Gq@>#Wr4e}e^7+7JQkFciULs8CU=%~H~K340Gp)3xURN&3fH)gYSFo&v=`mO zxS?l0%GdiX*YQSRaIHMERVosY6@Fr^bX%KI7 zEO$IEy(-=m^C#3HGTqiy$7H0{2tyox16kr1T(iOznLxqs>E|kyo|8y^;eM{frb}#% zMcyvmXG}w8aZG#)&19bfbS)ugMN!-7k_+=Z+8>In6CFx>mkv)@z6E_UOY@tURU)q^ z#=eRO=$;;7re0-8A(gL+=#KTViF^$6)OLk*53kbHgOZCx9-}m4=T^VDfliW-^eb5z zo^NjIDE!Dy)(m2{1#xu?{VDik^1m|hn3X2cm(Fyx6A`}Wgps{r@*g7vbk1P^V zy(=3UQ9K@>pU@|t$HcwvSVebM@=??V%dg6JQf0|+8E8_c!PE4C_1vAm`xkAmUA$%> zIFT%~B$o6ePji#yHhuRb*r!+dKLZRd(75fwY;6Mi%0ll1l09n7d?Vc=&&ZTNXoP1f zw65P#ysIp{HjCmvepng_il5!J^)y4MyS9YKMxLAL@32IW+?OTeKUugiLT^*19-ca? z%fq|~Kpk^K-xx+OQKsWJv9$ZA)RuzmqpS|wIQEUXG`(k+u|Z^edsFRO$hVN1gjmxFv_dSizS*m~F8a}%&BRim1;q8)>W`H(Xy$j#A zTwb4j{BHVu&Rd%P&}c>ZdWU}CCS^MGmKo{{)Ww@0`eH()$6yRp_!x0$aPjS8{LSm1 zKm2VIm4bGY575+oi(!l9Yurq$rf$r;^ucu>Y%K=BC)(bKCjRx9ETF?Sd0(JArsFY8 z|8Q&-a=LcrHD6<^#&%96@~HWPMw6V|_FH_-*ov_XUAK0Kk;bIHYuuu&pIi=_O#`a9 ze_t6Cz!n%YV$SeIUrD}-aP_38+$mp}&-zlHX{2f4*D!v-^#0J`SL_q;n|Qom!*tU{ z;pFmrrds6HGRR$Bo-6-|&U?n2?EVqBjlh~d2M_O57?t`BEYP#*U zG}D|>dRNCrC+DbJT+{jrRFk=IZ$$C578Nl{{18f|^mP~4?%IN~?l|d(q+^EF`Q^<` zCkR=!!yMcddKqo;ixWNv<3`^C2~+h~KQ*F}j_$Il_%uL0YvjAd&}}unWeVY4gFyT# zR&z_MtlhbS#nC#>lw~^mN{+G#NZxGwK!Dz`!BiK6akDrbOVzF#Gyl4S2jpeq*MfZ; zw@X|Uzzk#maTP%K_7bq3!v%NM;+Ne(6TU0i-=(-;~5UZ(lsf1b+7k`Ruyk9t+atf|; znRnOB@D3O_q@XgNN%NUalT6k;!cN_}43*3E*f)@Lx+Ws$=|Zo%(N_AElSkhNkNUm3 zXIBqx|5_WyK6(upD(Y*2Yqn8}Ntn2z=nt+wpJx|ivB;NeZ;bJ(%g6XlV#Orn=_%z3 zDBF{_12JSHT3IaC@#fpzv_EB@xz6F7FPg}0$W5YI7SuD^dzXmuVhn-bs*wIInMnQ5 zX+_XSq;2V4SUR9275iCROMgnuei?7`v+iFXI%2;8kN>I^0X&=k_4Vh!|G(?H0g$WE zjrKp08PETyHypfep`-JV*L9$5M0{*)LIZ9hzFbJaNJ$3Xh9K+qGA-@3@tb!5;IV}? zufP#?PzJ)Ae>XDoeYd=C)vdfEexoDj7Xc;+C<>R8GL_+Fo!1aK&X0glG0b=Im-XDCpvY$!9e^%@!gBzc)-B>0B$qoYvuy#x8 z{i0emXLq)rUv@uCSe|k=RcUdnfnA57|1G`Te=Y(-KaG$11s-h&?RyNg2tSiEqLaVluA%w36x zXATLeZ{5R6@BY-Sv-@PDstOr?HN)WF80T(h-1-|~i(MK2XZc$V>*29{tVQe@H8=J1 zqJC-kS$6iG*IW{=cUUCL0jS`a)_|FOR76lqOBbECvE*o^%|fM!iSB`jb5}(y%aJo0 zhWa@X33K$t+oBi)t(4X%zW*_88fC03dG>+X#y9LWG5}5$7lc=E4 zit)_^SI)l}1<$vu9*E}2?efAu)}2|Bx(%x*LP|+L>0#N4e}I~b=K4+j5D?5TIiSYY zsj*;Ug2SwVST1Xdbq*|AO|C=&U{BY%CD-x%4yLyKxB0Cx-B%}%?qM+a=bwo>ks8Qt z#{o|ChI{yrYE{x(h+(vl+8lk1Hf*ev!jsnl4pb4|tnh2*nSIdQ%|W9KW_*Y=S@Y4` z5#zhZ3~$L7RAll9p96Ti4GT^wc@yicq_dO%LU%d`8v+lToy_SNdI9>o3|pzO<-8O{ zADj#|Ev_jb%pr%1$`u*%S*No4?n};S`~rFS2Az5iB=+fcohaX(CdZ;{=fwnH?0E^n z(Yn^}ooD+*DIQVKMK~WqZS=keEZ^E<7lsHd)xM_Y3e56Z5p{Sa7pU7Dih|kDkYoWR z;IP+6jVvI+r6QE{$diIKF_z{hB4d(3P=?Pz&`nW9)2-;Dbzx!ECOyng&`{Z-tEQIv zRHTHsFY&zEHS;2R?Y4=Ge>pDk+QjkhJua(6Z#Y58Wa~j5&dl9#$9UdR(Z42rSuI}r zvV~ww%Ac{7yqsA*N2@}$INPMtUK*agCW8L74MpWdWLR`p)^E3H9Fs13pxri#u)yORdK4f!I;mR$8a0|V zhe#ED#r{cBc=yp)Kw3MYc?OhJ(fpCu_~#(%TxMrypUMe~^#T$J0{JdW@2@bR(?$Gg zn1}?=%kO-3I2@x84(_u3l6foju`tD>Vs=hzRo#WUy1jY&t&h+a1xgNZFPJGk___it!LS@HLQ}OW zI%%r`hRBLnZqBMP+kl>%7O(UfM&N5YosMWuB2-aQ`>g(k~MA{o%8g& z3jOt6*_HS1!N-@p=7QI#D}k&CI}O?nPfUv24^Xkm7@ zX`3O;vVp?h@~ly4H9Du8%ehjXS;}5`hg3w^-E~Ei-GvR?vT5UN78Lw(Fy&|%JBO9# znRVB=%77A>p3Wl21CKc|{l zdX}$Io7KBW-=+dNrj2fF^#EYL4PP69;8hbD9fH;uSg&6IK)zb%4I8>+pyYc_fFb-I zBprL9f68t9txPHO1w8+}p+J7%hs;q1^Aofri7+Q2ym!c#5dq%fZ#5536uNE*)?8C# z?(0i|GQTRDSA)$S?m6wGQp*Fzk!_Y`xiU`5wB5^E!*2-cxQaMK%+f)aDY98cHeU6I zS8c2IBeqQ`q}+UeDhc<}MenXZ0BW{TUvK-%+Lb-`?d1dELL7ol?LocZSlVIvv;wQ9 zXPYPe^vuzt!$E}*V<775Sym_QS9}`?I|-E~!eZ4Q3^@}oo0-)Ypma1eV3-H;WAS{_ zda28nE6B;&%vMjE>2iUC+@+Q5ZsG`#!bdi$;QltMgZ6+HsTB9;Y+aRjiRn#q>xzTO zoy)k<7CrpUFB^cNxrAS$G|)&%Qy)J&@CV2$H^oLqUca&8oy(!|5>dFha{JI=GkPi#mBpgYD!C zs70rCRYP#}jo{E%FC+B{S5qh-KTg=YgZ=DfH5t-1MI{QVO)&c(b+1la1Ge7ET6 zn9SOIElPuK#M=2=w)kDscU19&gnKKFWwV+&axgp?q}7<^TQ%Z2w>IX*|LLQZ+pCI5 z#rmo|{jkgIeJzz8*inb+)x`*c;KjQYu21Jm1KYt6dKJila((Ud#by|>^aZ}}V_H77 ze+OF?8;Re>m0_|2yBC8@zdk{pwPS=;3Nrc$e7qx8v}+ zH8&TNJ?8q!WG8%I>idc+&V~wIB@$vZyRwqTklZY4W3GP`VFsufVk{uQdBDNW{>gHW z@zfCn=(B+6JRW0Kl^rH;+11M%+|}M28y&lMN&wFpoF#qUy0x!#<~`WE@3h|_M;GcP zU#}t+Kw)1($M2+Hd9|irZ#y@^aUGK*_-NHMRQf#{;1!#Q(U56%DMoSHCD-IGTs7uu zeKiIqr)gNHtd#CPq;Ina9u3h9C4Lc#P_{MR{2?B+a$VChF4K)z1g-s)p9pBAbGoqO zRi)w{TeLo_<}+32eXo|d0{A~kVGC2RShS5QxwR?^(VgiM&$aQqF4#v^dCoN`8_?(W z7tA~Td`HLghO_MDf|`=qvHI+hSAwYWb2jMEgq*jLB{48vjtujL;;RofbHlL(9-Z;c zld!7GS`^4VxM{F`zbdt% zRAc9tFQtMn3P9?s)bTm~Y3)()Zgxz1!9013Ta77bXk9Jj1;#q3;H= z#nr&6w%=3)a!(w^)k^&Y<`?t%;nkXA0SKkzy&Ww_KVhXt%Pb`Hn=|0nU@U7rdp%sc zfWHQha!^R+*$n3HF2Sro7(Dzz@yHXVin~QAgblx{>oJ~x-_AfuSfp?3ZF_HJHWVIjh^Zgy$m~2E3 zljBocVo5;r*O*;pWLJtAc*4}-6^wR2L$nXFf~Y;;%$wSYu5VVQqQ$qjcUjA ze^Z9zx&&-3Gg0b^JI{wC|3+X^@C-Y^9fUmZcyVqiFre~`9Gg9Zxy$Y=@JGf){gRG= z+}Z*LRTbCGsYA3;bOjd~$mlH#h^Jig-+mtWsa?A{-l^U0M4%oDt6|_N^`>%b1Atct z`q{DAXv(7S?>}*? zy(R>osOMZJmheIqHCzz^y4{W4b&5KnBi4U~wqY_!_uw4zegTHw7{EgE39cI%kg2@aG+X8+;kYxHG;(0l9oPp0&7v#0 zeW?2t9UcWS0hM|HKo*JSjg5L~>b@21qVctjxcKo^Xai=>wfCF zho6F}C8N@&oX~mjhwV#c8-mVEnbsqVA6{qX&Ep&x%k8Gu#9qti+t~r||G_|ZDR*3Y zn0iT!SBFW6DPg;{l^^IqnPWJp+!#4r9Q%A${+ZngQl-YI2uL7(AIyQH3OF^gfe4SC zPScFl2EYks5n^vtmaTOm>+PeeZfq91DKPn#TsTQ=o?TaRH@pnM%s&TQ)nUSxP3hJgHQ-dWHsOnzCwA;92X5Ny-I$vKu+UOb- zzd(tj4)@@?jgD4|5APpk1jQG4Wiuph)l`z`Ey<0Ta%`ttsCsI( zkAifhas2@vVn;gpBOeK3|0ESE1Cd@cMm^HN!;^CSIsF?eFcr_0eumK?-E0@A%990T z+3fw>n;c0%fDpP8yJPdgwmYeA?I!j4vj$6YG@nrmPLq3p2gJrnDhg9urDD@b)n&oz zr&gD!cuqP);==~Ug%FGJ9ERYy39&x^zfIxYbl6~+e5{T8cqlV?bxuYm^jh!^le_5d z-_KP4I`XmM(z!!_8GpN(%6dxq%w2_3=g;5sGD_TkPvN!l-Gh2(xEo=Ap1=E0=Z(PM zVSk5?(ZggvZZXHJrJ7b~%}8<4Z=C~w*jQ?UptA_$zHBG5qR9<+ ztwFYPjxK#Tebd|dN3g>2Dy+3E!A4@cdE_Xo*v5KBWI_m3tI`cUU zR(vqAJO0_wg=l#^_5meo(huRed6L?Lh`nDWsiEu1pjiZ~6-^m+OULshjg%d%7)xR8 zyJlC~Q5D@W)xXJc?9Mtk6Vn#f?>RM)1Ssh*w=JC-Hz6SBbq(rZ@Eg4RGW^iH0BwjI!-Te)48|vf zHuHO`AB{+FIWxQ2)w&oLbFd%H5zjyUY1@n_+W!X{tU8E~2wMBYE1|sTiGzNA>_p2H zDu#)3(FnE5AdnC9Uhiy)tR`odooJL+jns_CJYx|_@b>o5V`X)~#DH3=4$blGq<81d z9ickyI0_f$Y$@?{&J>fCc`kZ|7;vgv} z+C>&hz@0x(6IX#1GJyZ#H7{FxaMH!&V~GR#PWU^iEN8W)6-a%jo1-7)>(^E&2iPdq zG&b5+^z-br@MOmKIu73E=p_iq+I@zL9=s3&h#bPVP47I)^e`3lMGOEJFMQ8(T>d5okNOL@nAH#Z#7e%Fz> zvEz}ri9ARIZI+)rhPbYFUMgUKX@)?(mwFZG$?7;9q_$+RX~4q5?R~dRefVt-w6ELr zb1$C?zn3+~qS)jtMO>9-UOfBR;39;0iHEJ1qhXSHe5;`dBd~^6u5j#SWs@0 z=H-E%aK&AHc3`EaM)<)2^;C;Dmrul3`{!GQvAE&cP{6v*e?1+N#?5YjVgcXKF>=|E ziyEWIe3<{lxf7RU2svg3-oEeXAYYxb=9GfySDxFy{h0MitZfc~^m4?S-Yupi{&3pe zGe2y`#S~k+dWYf)Ep_B#M9hZk7BJw$R&$xZ?KTCr(PiBo>nbLc0N z+n%fEgp}v|EeDprtS2rSV3DhaR}?OR;W0S5iD_~!O0s#&u* z<}W$4Nkg)%ytjZsZ+1||%M{i-NZ;Z97EP<|_y~SwngwtAPBUjd+WYe1u`LT1 z=|`sdeL9a`?y+f~H5LCgV7wsS&alCxFT~t9UMEYu!#nBn#Zbm~C&{8-G@kaBfl*S= z9109A$U(Qekq8nT+yRL6yzN(@;ZBYMV1v%pT zqBe~zlvc1QRbpY;my+tzhp@J>Gt4k}RAiTJO<>{{Mx&=Ct@FwPonNQ7H*=0v_e)kj z9q>`ES}eq6nn<8-(@?%{YlfdLmze(nGC>4d_cMmvu$2X@%40ko_*I`o2`SywkZ5GuQ|7jG7D#1z8BD&L4UtjMNv|ISyGVK&BZ&1vLBwMZN?u78&F#+-ki zY4kBR34Z;&I*?3!*iF0Yl|Xm$Q}TXcOYZrB#=kdvDDgMOP3;uSx(Z)HUI~Ac@h7>y z@Jj*}R0+2xapjkfP72mpTu$j;i=LOl{|}Pt-fQiuwgBkrCB^-KQ2kLCACGOv^AA>8n+qK zm3$#c7a@phPp++s?4#flr>jYycKVTzJ&hP+%iTCYZhOXP5-M@zas2( zW<5{oP9mS6qx$17ljg4Q+pQ+4P~6|p*|{pSKPK>6^;UVW@~fJ~<(gWp(I;v}0u70{ zUOCn8!zMNUTrcQ9kB5B{F)9W){^5ZmQ7Ri7Z8`WrS$X;4!m;u3^6SREVg4t7>TX@ z>-)-LJ}QRWM6goreE^^N8~NPrijz}0e=1!gRbY~XCt2w3FOyufFyw+xToYy1vV);J z`{2O4TkOkU{(Q3N9IP4cY+8noq2Irm^JC2In_j&Eb$0eY zK?K^UY6pGj>nAiecapmG@Qv$7WxI$OeJ`)P)3;`~p`a&qTvR*!{iBvz^=^ef88%w@@h6d;H*%+k`WPGD2{lUF|2AQNXwS3m(+!{`bpbxPyPEVOB9pO$bILW;-HF$Ta z@j=%}l0VjAN3fR}2G`DTjTa*YwFsK5F^pQng(vWdJ0{kz^1TgUu4EHoH;Hh;dk-t* zogQ-eb2xBpNiMEHdR}nTfd_R>zhF!x$cAEfwiuA7!ie9X!x~&=;jU|Hv<6*+G-L`YWdt)YG{>CW6!e#OWZS8BV12BX-cS6(iv| zPDHNtT+>A^ABsMKVnOd>hgIY2)xQ0}hF6OB+8!=BEom zJg*q0<+alGkB3hJ)KRW>;E3M6Itlxw<>lxEr@+xV0_VqF)D%zzc)`THXHuft6p2SI zVND$gw>VrZ+L`BK-Yze%7;gJZBifb1IZRq1F)d;E07;EF$<_TsNRwjR-1K^C@@BsV z=bDcO2{Gfxb`nu&vZk2`<`XQzCT~F8k3Mueh<&4z@|qJBpnGLE~ z>G-6pv=Zx$O-i$?VO|WTX1<<(-60fbmi8Xr_!BW+lSGp8<$qhb zZqrxqw<%a~_p&UrTOpj6WEhN`gVC~hcUJSMrN#1Z}?l)G@8VGoA);y(-_AJewH=-7vsn>2T7?nK|a$iI<1`}8Ehe2#c^)yuxyWA z>d-l2{+mg_{{jd$g?Z2#XBM(_2iT+hdbs-`kMf=?9o$n{?bEwwgZ?AJU8}v!{KF)@ z$v^ta&sFslr8_kFpsBBtM`wtgzTy9~@?Rgh1xJ1b{rjg9kX(OhzW%BE%<>Nh@VoZ= zp?@To-*r!3{3G=Kt}DCy4`cSbZs70#9oFai`^@=$5%5>y|21#qL$phygv1}?x; z2v^JY_IB8HUteDl4FhispJ18Rduu}I^{ZD6jg5PoaAOVdj~N34GOFo*0+aU2W5swW1oy(}`=U%&M% zc!J&({Qt4?0d=mz{#bBVRKQJrNy+l1)m1S4sUy;J(*>zJXsN$_t+~HH%<`A^zI$n5 z;eBaoERvyb5Kd+OyoyIhb7;r{=%xNrt)98Mn%MlFk#M&s`+!|=vb@|^9sfja`aC(m zn`L1Qf{q92k@Aat1$IYdpF$iM_~J;)OWPL=2*rN)v*99UU{?(G$A2_LPo;rPr;1CZ zZ;WX)wc#52`!%qRWF0J$EWx|Sgg1pb>Z5r@)_}%)eZ{G zkif8S`1lJ>;iy0-Z?W#(DR8#ZWtms*R|m56miHo*?%w(q*sf~$DELIKz4PA$Dy5azhE~L=lI@9{=BW zJYRXs`9b8y<f4Xn;HVDNvBF{QST zMP6X*!{ka0PIf{h^}+h1ex4Bdr9`sp`j>${+{)8qq5qJeGF#xS`oqui!L^(=7Ft>u z#>s%_W0bw;z5j={Jf%IF$qWXXQ~m*HPT@zUgX`W)6%O9}hj^KN#Bv37u=cNhN_ci_ z_O*+DiFXa_gzetb^ltn^H9vzktmw9$Y&s$f1HT&o52<{jY2`g5Cb56~k9L>6TmMD( zD10Mh=l{nWJv=;GH5JM~d;UZ??c4Xy8-I_`|4BNn{tU-xpG#^|8$u+GkxWiKniEy5 zQImS_+`snP-SKY+rdI!Io7zOD&DUn9+x-~jQ_baQb?L&phsh7R!q6?HPh=0Gc1l>W zH2L;V(wMiK^;72q{lA(^@3sAj)4zrx>$6A|b5ImVe>f;sfJP9WoMP)kBKQPNcg&?B zg!sczh8A*20GAOj*8%ao?Lx-D`V&;l4o6burR6EX7S1RJsWou#xe6O9|IA?2F+xy@ zrTnB3g{x!^1?MPrMSVd(N28_*Q?$4VW|4^gPSSEb^Hxh`OZQ4`XJ~{5_T=&sMOJBu z^lYbM=o#&AQu$#0z#gb%pWeBDCO~2ONkF#2ToVrSdI%l68F#qsRHtFEqrJIo)wYmk zDTvj9qGj=Hc8uhTboYw$+Gvq5Ib&mCFh!5GAYGo7Ld>q1;|0`~bcsP3;)KV7bW@Cs z?ESqS2oV0YP{G!WHG%*Ht_MN;$vV!7r0%@0ASuATEc^*Z)^nJ@f|57VnM>10Y0zb4 zzC2+m(f3zlpQ8S?lB0OU2;dcCnqv~#T)bysK0SvyfX{}~*F~z%j?csqJaatYuxoac ze0CYSsA@+0E0VgD3s-CMHOIlgn=4kXXgUUnni5|P@k@1BsqXc;O zw0l1?Gw}FI%0*b*>tEE6^6sDQFQ81eCoz}Fr2d-j{y^_uYTOYleh}~HvuUQBuzB3Q zy^NK?J6|CReeDM3P*QC zQ@R9QBl6l0kzlp1cKM)(bCp`;sbX0iZGt1u;Iif*3oj|yN^W-*=4XFlB4@^DkY>fz z`0DkTliw<{m@MJa(f9mYdkXGW49z0m)G?9HmC5jHloR9>MmUk2^s$?SrG+X#*o+Kf zte=Ovm=IUWHgfOVAEyVe$uk1S#SSWt?yZZ@*o6jw;Y;9pwj>}wyrEZ`KRG!m9Rr-x zvHU{PhH!SXs||&gzHlEYwQKcztXvuBR&fz@!y~&$_{{jkL|ldLeqTQWcw}iQpc%?* zs+OCW1Lst>$Mv+gQ|ciAG4wD7xPS{`eD#D0fHAz2V>e)Hk-w6ZV)#(nlZbumW9Tk) zxm%%YdOn-V8c6x1qKa#37UNln^$6;Gy|%4>;S?*d4Mt5bgq8qxhuk{=~H{KvN^B$TytPv=o4mL&itfl$AR+m~pRPuPS zJZO*XMSRhmHN9F=&zy`DL}+r4T4aDd&q&?NgX&xq#c2L*JVO~2 z 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 E086DfGXMYp literal 0 HcmV?d00001 diff --git a/docs/docs/assets/DashboardSS-2.png b/docs/docs/assets/DashboardSS-2.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1c8a4348eb4131fdf1f6f6e07006f041f80868 GIT binary patch literal 180593 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/DashboardSS-3.jpg b/docs/docs/assets/DashboardSS-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f788b1c50bf4e74f32de201d419edefa7c4b49f6 GIT binary patch literal 177611 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�hIgWq!E{RKd46OaTra94p> z?JtFs6#2Jh`ZAF^4L10eLw8(81%B{6a(6W^=Em=koLS%fyaL?kIm&?uV~h__qyn84 zGcqwp+Pq1;rRTg`K7Zt?(r<)w&~rtdm=KqIT!TcCP3C>6p-n7Bv!{B`b~ z(AcSV>UJdf>TxjN)Rjd^ncXrV7a^b=(a-^8G@tQPc)F%-Tp=PmTL+qPq^{cMexk#S z<(+O0u;Ma*ei^XH0DR$s-_R=<1wTF)X(Nm+(}tumoR#7Fy5w9fC@*e0`$~N}>7oNv zKD%>G()VXShE7U?-7pW34nK#KSzuj@w%sm}$IdWR>)}~uq<4a<%#~pR?BW#8l)tNV za@QUH`(yMU0ts3Dt71LS*fHgN6pp5|jcbfKywJY{KPLPo;eBXvJKr8&cpJ0`Aq_Sx zy}2}6v;=eB*@~D2ntweDaEI^-TMQe$w^(0hRZl1pE?6KTf6N#PH}45>6)f6q<{dA5 zvs3gE9~qv{UQi=L-KkKipO3%6`}73p-@=-qXS1E|Br6$9EAzTfhIht=Gy0C7T9yXS zCWj6&h$cnYJZW+nDsXCScFFt2aZC&(*7`kK)+owZ|D1AiBl9K|e1ke(if<>-r=+F? zzAgLyiMjb4M`JD}T4l#D3JG)*xNINNVXd#~EE-a|njG{9A$U>WRK_Ii43Ri_j|JW;h ztKc7k6B%c_Y=SSa;}^3PRXu05fS2m>R+eB}p=7>YL;P5zzh~9a;5T!wXDNoBw5yb# zK3*$ZZ8bM;hGh+z=50Q7wQ2fZ+maAE)zAZf)<{-xjhzZ#L7D!-jWf=M&QQvxr!aRM z8g1eajkEVTa<$sl+*>hqcjofGj4ZS+n%63G@=IP=Sp1x7TI}&PRxZ_f@UY#9EyBo8 z*qv^s*!Sz3%?<}&smTC?OJkBNOH975W+ih6YH)l(UJxQ1_Bg$f_HoFQeVZhsGrIK! z?g)9Aa(}%;*WrD9^}`>jYObfG4q5Ys7QKo?_mACZ-^Tdcf6cev{jl5BFMsq4hw(GSclX{ds>pzj z3$6?u?j>bdal8r7DuUB-E$KIQPvzLUx)xV0I%`2|PK>b<;LgK~-<6QnhX7XP4e2t( z0;O_Z;4J>SFo5n^T`TZc?P$g_MV33;mvgpO=7@0?Z`L}$4(|Qf+qZA~ zvZgi8EO0oM`T;19vI z%UKmRX1$p+3H?*>%nIs?O}zupVfS%qA<;OeliWA~!NXOt2hTkys&hh*D^|Lm^w8>A zeZG48pUz(K-+q=8DBZn(PM3}VOaO(;K`fslqn7*@FHneA**B=61AljUK3A|El6TvkQ zVJ%z%f_sVzbP_x@esLbtexx&s)x(bFmHTyReLn=9^f2QufY_2AVIIgZH~~6$3o_AV>6qJ3zIpe9(uHWwNWNIHn4zp zT1TS0LC2%LvQc>X8W4Wik{((tI29)=)*~7+VDqY~{fSIb(r$bvt}|=j=Ug%|F?O|R zvc6v0G6*=cKO?{5JF5N=jQ#7E!lzRTw_=YEtDW0VSOL5b_2BE(trh^k+SdWVC8h*| z6DI!AwtwGYkLeIcR1d-uJBi;IbCv?5&N7kaRHZxPBQ~b=uY-chTuTyW3pr{;o9|JJ zR)~@ig(-Woy_|(?DU<Boo}Hmxo zaB`G(|D{%-_{$VzX^+q3>i(M3ceoxEWusD;brL`1QMsp^p9^D7 zndhpiCXh(d$Vm2k>H?nMW$(+U>lZ&|H6cUikge&d&mDW1)`_Gqvt>-Ew@%hqRPrlu zR@E4PuU}|}g$kk@Be3M9Zo+9Xb3;OBtbQ zo}C>RLdEJpzQTmiT z8yfyEdk-{vrC!^+5zB-G-T6|qpoxWNE}tCj+Vld|kZan9ujPGtBSKhURCPhBxb8a) z`sMkh@PBOqL5Od72FR#_Gmrs*N;M98J?$r+p&r#glTg1uIi#>7ydbfwAhM=rLU?Q0 zVSYWB?UQbv3X!gpOfcJOWHo>V1P!ZR$uF4}pOs{09Dh@Nh`$Q?#*;Ny9`+3!*sx48 zm^vdyBLoN0IAUUY?~FG~ZERv}>!Cqd$%ZQRqdrIR1)c47Qv6sxnY@QEEPvC; z^FlOLEV;9-5tlEo1wrOVGWm>@@oRd$J~FARP#V|k#@a1KLg(Hozwo=XS$|3WwV zcwf9@%UsuT=)L;DruRZ#6A+@G6$5xuDqx4iRbke!HJdkeNm^!?0eCb1XCC_k&~^Xm zVTh?+1I1!h9nqxSvO@X(f`T?v8NmySePrKdt&<1%cv7`0)OGisB#Xq8c^(C;qw6xM zmLxW+=j?2#w|$2Q6Zl+G)}vK7`hOLLjTEh(LYq%On4>g&J5a)$e9;(#%2r+X$|>Gw zYJnvE!rF_W%2__z?AlmoY2Pkd`tSnWawww=UVuiliW>zMC5>*u0+7+1d1^Kj=|V;# zf=%NB_>mq`I(P2Dqw|E}<9)zS99hgNho1S&Y!Xtw?>WMy^q@LYvw)MMzvh?j;JY}f z!3v^Z{_C?VAB-UL-9G3?xRKDsta zXF6aj_GE0%Ort5~DQ?>`u&i(J+Hb;CBF0OmSpK$%yJJxtI@8k5Q64$MnSDYX@E*&C z^ACCZcq?@dKr87IwD$U6Hh#VTX5(k9fF@lt?i!73^w_rIow4Fy{D|!dyUS$!V&ujn zy`wO%_|uL)jVaWv`XWqtXO><07bhyK`C+$rTuIWLDl>Pb?}riJf2(wFa_f!$FOPII zb*Di&gT7pk_`<1qVW|}XZ5===ve)qv_xAvhA3!dHkV@z-1SEF$eQVa?vz#-9oFubL_B5mDt`C98bI6KzelpZL*5r2#S4B(!Jf@0N)%{sMbGzDb5F;a$ z75A;sA5WKHCo#0OP@jHuMa2au9SZ?3v=puc+k|lTueR(>3OuYg&I8&+^L;cRfgd1e zU40Nc;S(KlO!*TxiZtZ#lPRD({D||@D^9A$PiOrS{5gf?r2F}=zIP>^?MC|;{yx@p z{4&7mf%y_-)?*(S?9S{4ZGr2hBHRKY4j8A+$=wZDs(~Ve{J>Tkh#-o)Jh(|@5?^{Ghq3r zn~7ltbY+TRu0XfHCBeOK>UM~-F@PlB9e-Z3lX8L@Bo*t>2w|*Gy_296?dggpK@uuZHrq&R(!EWX7tm40*zX&Bwh$g{9*wXE+ynoa{V~Lr z&-1WRUZr%8TbA78`gSRxKZ} zx-ZqYOg#m(C1g*(KDIILeXdWT|5(BBEhv&dG?vn>mB~L#ztGT1R7(P`z$72On%Q0F z%7c|bpB1}XBS*=X$hl0a?1*P$3qBSl`I2rhq>5_afZTzaWwr(vU%5IoyJnOk+^Odm zqkWireuM>#t@hUhsK{Sco&ByNW{G4(Jv}Q=UD?A^V+#GP?hqO+48?!{S6CrR1Xh_)*IIKgsLqwOBOjZ_a zRRGI36F4!S_B6+xE{~;0>ccCP4pLbz=Yb8iWrFxJNR3_k!=o>W;_&Z0X&m2#&g5%2 zYPhRz!RfNXwAT%W9Q41Ht6WM>0L}pCj#hARF}%{(|9qbgm92|;S7f#u$`Y+v?#Q>h zZhvc&zJsp_{X?yv<*2KQf0GTPhIL1@h#^{{mq+_eUnw_F7G7yJ4 z485-@n{jSwPUN-K*RpPGgs$cm;1Au|6#}5`TZLDW;A1onei{il>Q_^>M-w~X(EOkvW|x%3$Dbp>57W}7BpDv;h(l_!Mpew)sArN_i4MB@_w3D4+ zeApPA@@+LUMLL*NCe(Rva63VzSw@vo0M3~V>w|!>nSpok3{yQ*AQ#Uay;QZKmv0Au zQel&9bUyds3g2JOPPJBqR6>V*hTXMBHUemOoK8yh<(>fvNB6qTKT6~0et#R}=l`0N z>XZ5RUji|+XLDdolNod1)*$FezW&TI*!9XK2?O<}0ea^oTqUP?C$k+J1mww63(*@&rD-i3QgP7lRjg7I<#RoATW4`QPt8-P7DwbNLYe zs!lRiGM3;oaF`-VjUc1Qah37Mw2IwrAM#&;HOBt#dOgeRZJ^=%XtEbA0GE9&RwTdk zuRcoTFE#SXI9L={e zbEqZvAU(;^nvItzXTR6etED)wlJ=g-UJL1`r}M~yqKxuF9T*VH#V6$zSCGHE0f=k9 z7BjjU0QJUrP)65DWBYwqgD3iWmjm-N$9SOzC}^VmgEeQR5QNU1`5nEKrs$%JG4G3H zL?-%rBQe?SYC@_o%D`iH+R#xDS+J(}Wo}!VP()dcfN)(vLdCn70oU>)n!F7!r43cm zY}*Cv9X=G^EGffz!V$QK_qSGHNg74H{Jo2vY<0q6qQUHI`*J;J8tUdccb@2bh`c52 z_x!yxs8D9Srqd0f*iQmDM~SU;3XYa>4)d+(QNjAq)xL6F$d5Y`yov`xKtlQX zd6=!WaGsZ-CqO&gTUei}Ynn73Udv0sgN?y#$4_V{mAE~Z84`Dgc zhX~u=TFQ4{(4s6Vnq}4r*wQ=d>}uT)2URAt9}`J)yd@b9tmg``VqgjX^;x+5MZ&W> zU&rz@Um1=ute1^jmR&Z~QHN0P;ttqyz6B2acOHn>*6#)uD6YMnlUW|CGY3&R8eJ;K zX^cO<`-#(aLSwHdPgP+)_tVGK*EQuQF946>ILgfNE}exZ`wN5nErR04p&B^L^ySzU zKKxkwtzad4q-uR{kk$lc)E-3UDwowL^ktfAs%$%`i zA7uy@|B~jMZE0A{A`vLJa4=)WmS5TzDs&ZW76yOH{M6;lnJ_Sz#Cg4jvrrO2sI1PB zth>H?N-#NzWQdTC@m4WahKJNo1oQIgiYu6-m-ZeiCwN5+QKh|= z`AK&c)djiPfdb4Nn;{X%bi34fQXQVV)X%$XtIr00o?UNt;x8u;Ph|OFwV!X_v2-m8 zVRkA~@2t@pP-QH`Zzk)IzJAHyupGnbR!pmB8MSrGJqEIFHPya50mczd%|LcCx2*!u zY-^capxf|ee|}RmQD)hIo8I{S0P5>IzA=nSw*!b+9^cQaU)fIU@^T~}hLv;Ze`%J@ zDd%M*WL=F7p^#Suk;azGiu0-HN2aQmAh8p3ZA2P>xxtjVe^4_ZmHZdlIQTbrZ&FM{ zJ6*jy@pc>IWDzPd7b!U=1Z8#R;i4IJ66%f-&kECcZ6N#3twGzA>eFlP4KN={wf8V? znRdb(?hZT-k-F{kD(L3oyy=QtdIpeeU`_AgYRB-Nd*7*TPc9;Ofr~9%d z<7BQy<{xA|TsudZMb_PZ4_BGPxoyRU7OMY>YoKc}HP_6V*MC5l@tJQ?KJHEZcxlQP zTkg%fMw3&D(pZni$a;SqGXBzn9_8r4@y2wdqoh%pG$K~TP$+!k)wTP` zG!x7l)N!{FgPC!(JP`t}J$ThGWi*>*L8A;x6`?rsdC)+?aDSggL_^=ALDNzK=ohlx zmYvhh&Ws$*Rx=v6q3fwv`C=_*aH$|RfqASgx_D9h41Q3g8bFtm`DT7Q zQ;ME}Eb}ZzmZMsDftLN?#mn#fZSr578^hO1lf>hkc~@lxM^X?QsJu_#%&b(!o2$wt zE2>NL$&k7=dtzm`$2DvnHkb={6qbc=`b(0^!4=s^9BLMJd{eg1s|DXbk;^t&6X_$2 zWuRp0)gW~Fs{i<|^w(kxWL4(0Rk*tr!~HnTcx?4bGV`lqHp!2gD8c{_4P$T3Nb7pF zyWBI04#xwP*+wT8vtYT!q4lugUMV>Dd7HU&TL!*rGy|wQ+hdx8v)p?~=TEYmBp`%v zr!1>?wwp>UX%xT$fSMe4#g3q8Svl*x|~>Nzgl4dxs7~LF;aY6~NfozWHW3A1s4vgoRKID` zr?@2rr>%{e_CFuwSZL|8_Z`nc*2_yF+{ygK)Z)7El&HA_<-HPh99^ws;)OX@nm8L(!{UO9wO_@H zC&0*y+-xo0O{=e?bBxEnL(1LHwO;+rXc=s$`waNE{EAUSe+bF~;<3Vo|kRU*lZy&=&MPt%N;F zIQmb=rx3sNR}9#z?qkS?{}lFPd)?tBC;}#2o=EWt*{ZnSSit%c|JvwqpUVF1Fl?DG z%FWkIVCDSa1q7E-19+jd_@=EklzZm~4sMQkgiz+iy>{j-lbLzLK)m-tg7(C5Nc=9;e&kav?~y3oeq3X(yTE`@_2uRSe{+dt5GA8?dnVtvR6MCIttk`YwsQ={j%WSc3{gI z#|_8b(HF`EJH`&ZVH?&4@agOCIf1$1s2(ULBiIq6Qw6{nwY<{`S&Sc7@5Lm_cR6az^dI{ z-q;9j`55u#6a6!5xLQ9b{rV8ZD{IXGB37ygSsY)7B#3JKMSsJ$D1mh7rh_>_x#PUs z@w&!QSWXN-GC$7jQyh&COyyntK6w+Is;>NeC9{0fN{o17vAOB@q%n5{AFu z-WBs#fQ`J}JX^l)I+_j(x#D(iZj44I{cP^3$UvEx zDar1LewV#?6K(kJ#e;WLuM;1IG>3?w&O3Qmb#6McQki#odk_yhcR;v4vjU8pW;ATq?jBV!40*a(TDVb=YnLQhQn$i0HCrL5;j7I@n_QpGJZ*D%ZzBF{9Yg=odq=eJfIfku(AJU0>DjL#k?0@xK5DS`6&|)8uwgza=JmFLgKAf^ z^`skDP)x;eQRuT&Sc$Q360@dw(GQN-H39*fwbmGG)Xa*(RDC%lDvvQvZ${tYl)rAm zb;f!6<29a7oo>m}H#}bXy|kD97XQK3Cy4tP=6W>!18h8Y$$*w@fp)d~IrBR-9|W&} z;uZOxqUl|k^)TUNm+wJTlUk1Ah&QY`Ho$C)Ua1Mbf0n}Nf#f_B4e!kk*Pl7@&`99v z2dce8AQFEmjm8NVm`WBnvX0!KTQ(OvQ$66rf~|U6-?Ldt`eY|%pE|(!p{b{2&rgtn zLpvFs8RN$6>`sAIM9pN<<@UoG5{J~oZbq&RiUfS6A}~IR(dx=A0^Hz~C_BLsM#m1b zcY?)GMV^>9pHA$x=;tJ}eqGHiCVzUL$r5t6 zyZ5wWGcx6w@eIHFLR5z975MRY_=AF`&~Iur6Znpd8}Z#O4j=lBwx6|m^6C?1Zltw~ zQo;?BXuDqJNsa~kNEWW8xqkI0HANR6B-pRz+A%vq1s6Ki#@RKKqu=WA5l<7o2Jv_h zTvC7tF`{=UsB6RZF6OiwJU`4{+8RA;!Grg0eN|#GUURh+i4i z)TIk1E40?q3X-`1@^+gfzDE>2Ya4fm)%#4g_V%y~S?$ZnDax3o^ES5IyHQ2idj-sI@1_)F~*htk6) zMKjmmC7Hd=vt5GVJ}VMbW-PQ`TEN}gT#MM5)Cb9nm^#$AOVc4cry6=-eNTwIXM*F& znwMHlgxP63#sCaR8mp^dfK=#qX~)W3$fRm$`|TlsRD`J8w{> z2v3X}=2|GTzlpzf(Q#t5co3wTQR)zW7LsS>M=-ybb39WyBAFWd-3^$~^3q9-tDV`0 zS5C$$+HxH_EN=d&zi6mx7Ni-MIJS=nRm47<#wt@LVs((NQYw?yDArQJo-ju#DI@es zS0ygSO>xxKhdZm!>6J8mg!JLBrvYJF!fR5!D-4*GuB>}mRpE%-&`~2m1n=D(kyaVM zV*mYnvr*RIif+1@A+=foX~P^Th)~?;B)*+g@$M)=LpEYGV*S0j#eDRlS|gv}0XU@F zgf}6z{nzgJr~t_~FDxxa!mGF>$_tg&k-A-zQ=GjeS$RDdcrc-zLg9KO-Sz|r3$3*b zzj%wrvev)=DAl(SoXqJ69u672EqPHNbaIi$Pr3heP0MTzfv^1HxM1VBd|#0z3S1-m zBH@fgLM!_=c);(@tEXZd9t%r%YBp8kW!L0h;J)GoFrjNNCVku~9rT^dB7WV$xGgMq zz{80~Cm|6-a?+-&3!>Jn)wuCQZUj_4HtQlvYLn!2hN_%ARaQ?!@q-YWhwx4ekUG&L80e?imX?&ot)UtD{q26iy670Cg;xy*<`uPJB`>FHee zk5kUzkAu=A4J?04|ILnrlEO4 za3e<8A|og{{ym9FEe)3xbsu+DqV2HHd}VV(ePeps#-dNH4fuMTrF*-UcN@+%RJ|R2oj{}YFHL&oLE#!8qqRZPhfRrk<;_7NCgty+vsT%xWbbMWAw`i%)$ zWror~6RLu#3bc?M#O37!B~NC*-LZb01O51j&xpSfa`z6J}`%@og^ z5(`PNJaIr|$a$LaWC+d?0G^jW26|;}W?Flz>%f?cDah^_coV4C-#6I^nYN$J@}JEd zmMk?k201PcZZ5>f`bY#Cl(9YG`a9K0{db)6pYhInn}2_l`{z{zFsu1%C?Sh$h{75( z-3Z)%23fa<)|9WcFS$ef!ky)UCbvjSA2xd#7Trd&BtF>EB`HyrN= zH%Maf3OqwIym$xfKIRIMOWCnPU%x`(@AlKwaRy?0^pawPCZtY#sfJ_YQxbP;Akj~q z`4+2LsDQj55}}x0yr`Dx>tW+MJXvOxfKnZzlK)+P?I%Gb^z#A!8iwB(lN*8tbyGEz zd3irLs<2m<9G8D15HznH+!djJZS`IbO_;*%wF9;;kfc-?;}r+y8zs}6GxhF5z?ciPdsnm;SE3yIJYxPWU5o`y%Z;z28keO# zew2=gkXJhjp|el@U4%F+_4jzgx})b})|a2`>A?K%JSyd;_5XL&bEc55`GXHx#Umv~ z!oU|VlEf`^VExiT*Sccg{Ol=~%x-C06bux`1m$y>1GE151Sf(jhbG_Al7&b{K)5Lp zpXR@yLxq7DbL~tltrRtm(#}kjukg#?UtENRaL7IFo7`?^YLj&`mL&>1IDy{Yvf`S8 zseX0Hl#-gMfph3}l;9eqg7^is-5(ls-p$*}Eq;BMjJh>b38RiG?`$xu`h-Y|w4xc` zJMD)h=r4CEH#8<*3Ot&Z{c?>Dv1I-I(f*FpK?3UPr`5f>NpC<>}qnK%s}OimX>CVnc~Pf*cYC)m8y0oW2OPjYHJ3c&VsZ3 z?0;n??cYEPBiY^yNVqDVtDuI9EAogk4I&?SG|tvK8CQ$v+kJfgMJ}YJaBjT+HLGWa zCF~^7xObo(@y3a1iU}HhAg<-Mri;SmFqlae(kHodelTs!;xA2bW!cChJ#iO$a=2*@ z#nwXI@)0_nyXCo}N527Eq>`rb2Z@W%GqhOYdA+nA+xG+vMEI)7=sd0wBsy!sI1$F< z`!IPtCBXFqgce@lv zkf5UP;m&@LbMa+e@F_6h&W+TXegA4E80?2|cFqmzWFm?YcNE9nI;S8U16AWxq~vQ(PJ6>wYh)T>+K-D#p3o${fF5g=gNHe{LoeU|C?y(i0jb&t1+P@L zQXSKOM$`0#GEK;byeY#B8K-H^Dn69_^ku1as?F|`7k#N)$p8ltFX7Bp1J{$tM8n_1 zhE9r;rl`C=v+A!`ggj~8 ziz|du?OLmc#7ibij+v}<;~TXttxV}XEpy%Dn!X&=BybJH|03-@pqkp&wow!n6%<9P zl&By`S9*`AG!YP#-b8As(gOsdAiablAYFO~=~AQ8rFW?z^iDzzr0jpO_c{OB=iKjn z_l|KLLq=9s%FJ4GzU6tJ`MkMvMfk4Sdij1u+Xqco=AkfEpG656bEeY5wdbg<#N^8L z!SJ5X53_&8IyBBc3=xY}`qlJ~=ax~JpgS{cn-2biknEFe>?$eRlyV|=KzMbiWMM_fc+5$X(uLG# zegQazg;}3Y5Vc$ROH{LiYNd5;$l$zU=RZ`wsvO^gn z8*(&GPyaBtxwN!|m-gYa_dNIRy)XJg2K>8dw93$D*+}4b>g{+GtEskCv+oH6?e5L| zE3kSj;>Zwdf?O;$?2uxs%D*P~GJ0;tw{S+)(HZ}pmU~Wu!$oQ_!m1?-;}}dG1bdVV z^_a6x;1}v=einnR|9QtK)q9}~mq=3BRwXq9Fvy^qswJt=FFxaG`!Af6U^mvi;c z@Wbl!wa%+T^>;4aHNzdF?HVc7p1v5WiByzq3v&9JqWZzE(grO(%k>C3zz4l4l60+8 zv11R)-fD2F;Zvm7!!fK1cN}1y8M0(sldK~|W?#{kW7S0z9MJrp@wKVRH z^ymw^s}>h}oD_;t#dh^8CEdOm*YRjD#$b*?*8~}f1h6vQKJJ`tl!h93{tq(4x6_2T zgI1%}#`k>LUsg7b=ckXoZA$MazcAQ8*ktXt*#Bk&8qg=f0}ruoE^~1TCNZS1%&n;U z%=4F}AHGpjUw4@D_}ptePjh)m4l*NN_@m9oLUxfO?w|xtkih_W-R( z@bap9Ol@Ud86}Ii*GHh4V!4e;yoUa;z5DjP<7cC2nkm!iZU-s27whw{gh=+jJ`89| zPjWE4x-Oig&;ORBCYbOs*)iL?czwK~EKRD<&gZI;{JjI{>{D*gO9j0@iI@*p9Pih8n;TG z0wQrrgaQfSjM=vsy{Iu3(;PG~6?0wEJMVE640UD3|InfMCb|g7<5g9|DVY_ccN{>v z%@vYc&j68tBkv;~?7-wckz5~_gdPI;Yz-S|hN1g-WX{_Ui^SeVidPNApk_r={G0Sg zATwfK6FC%mJ0Ye(|JLSmPVBjp7*+gBfZ&D$w>Es8Ur*;A*{NEi_zXTWQ^BSXsTb;g zs=aZp(`l&Wn&?*^rCvQ5LrfKo4q!A4()9(2E5`?dzhkL?rU^%)rcBs^vHSeNfY|a&g0l96 z+)ZeFwDqYf{x<*CLo%87ZWkrKg)9&zB>iz#7x@AHY$3}B&rOVp6~(a z7^fMjXClK62SWFzR)cK=k(5c!r*8{jeB|o5Rjj#^8A8lK?1Tc3sRHVsUE!*DUeY3Z zJTvD2c-w9XcHO@eLGX@y24slv?N@PVYk@j~?{Msy`H)HSClkvOa|y zEVl?lP*cdOGKSW5&ZMsTc%@>+z|M`VG>oejX$BM5nrMt1>I_1SwtA*LXs$X(Emn=sJaebl<%&Be~xsxIj58!z~kX ze4cutL*v&6fMRDoU^9^W+!fJ(T?jG1;v>p=$@NTr^Q^52d0bdRR$?=m#d^lxL*SB6 zlp;yN{0`#+DV-rs#O*ho#AAMkS8u$sU^YYdaN#95t$pobot_spX|dd2YW)w$4vWz0xm_#U70zepjy;I#u(j+Qi9>+;m?4baCRNFYe9x zgnns7j7A_zH9*mq+n|4HMfKYv#E5kCWJQs`k-xDo`XPru>xT<0I`TOAd0{io)N!de zC6N}l*xDMHwd=B%!ix^4hnW!K+1NZuVqd zPIw?kgMD*~6Ms2=C4FZsMxk0IU*4@fLFL?A6D!TSFXTY&6jV*|(ea?7NDpFAx~FuM z*PzP8x6{&)m*Z8n`gslJx8g1?y38F@8v-O|sLH!Q z$M41KLKb8}y>!R?mLB9j?I1xSIdf!`+YZv(Vh!U7}Ed*=M5H&43Oe!GDmt~3T= zT0WAjHd#&@{B05ViIsJ+ZNKJPK~{~-;tM0U72{Wa3A(0m@owS-$L#jx^!U!ePFyOtDeLdrhj=v`lm+c(A6P2Y^fy3e1eazs6kt!KUVYSAO@3&fzTz7*$pO34a- zg4#QzcSZNef`ugmmh1G?75oV9C_+qlZpCVF@(xh-+y&dxOrJgt54dplnTVy}zp*4%!sd%Y( ztM5vuAy9`>C28zZI_x7Cokn(q4gl`{b4O8|L$&iK{M($3c)BS@cK`J^3eg?6RX*sS zr)f{+fWF$Nx*gWJi2PW-eW3c;en(rhXR_q2XUoXA#8T8V#a<+2FSk4T#@D8(#}X!& zOXDyZ--8V6Q&bx{51A||UN`bYcvvY<^tNgFZG)j7OqW5TvVIIWS%=KZJ@;2mbgjlB zYNaS4Bjt8grqRCe_s^+9J<0c-_r(m}HMESI!cChJ@~!7~ch-;Tnyz47f12JnlqT{% z{+zU>+t+GjsIt=DREGKbYa4V2RvCg?0SOv;)P#S*0hRmS<6A%#VCrURr{4Y19qYOf zi&O=wSdn)T=`lqS&Vz4ji&(2G3}ypqHI>cIgsuMGv9nRnfcw(o%R5WHwWg~tuGNr5 zDM%$ZbC14%K|Xp0MR1Jg93Kr@=tLk`2k8Zvr@ru^#0m;Da34w6S#H3W(i3=n`eiSkbe61(CDsCJW?x-$-w9A)YsG)WX8ortXbs;X`Uo zV1hiR{mhnjwy!FVToS;W$h6*A{|QQcNCox|15niWe&@3tXFTjTy~85#_TC zW}H1BRlR1oA?hGEuU#3}0t2I&@NW*8LHx1@k{_V6SPp|vzcS(OoRhHGD0yw>M2fel zMWrCeGKYxUjs;W3eNEz^DfC@D$6Gx%Hyt+XWJ3#ww2J8KLSChhFpWPJ#!8dLst^5I=Dg#9N>g&Y1-HGRxl=Ulz|0 zazBjDBbl97WPqjj1FXj7+Z&hjG3mT{bwDScITOgk-;mp-v+1P}GpHz|4yfvJU9619 z20n*|Uf?5Z$nQl7RuLE&Gx1}NY4nxOu)RRbM5}R=#JFhN&tgC(OZd!^zxjJmu zk3ztQQK4ORos^V|Ui87)Mm?@Ms2>hK4y#i}%IjQdd!0uzey3 z8x>y8X5e~#aOLpHWo0&T-^&%679ZRXr*AjCjK0p32|rV&d9TfO$RS$>x;dy zawo8^d(j*rdZ|jBhh*DJw-VVDkbopxA#pK7*l*WqAJ7Xp_QgQJ^dde3Hz4VB-@;z` z7KYAor)gD zPv4c9?q%U!k2k#^10rtLI1i0V>v^MkPQL-$f`iWJ(pLXN*2?e?(%bkM>8;kNE&unc zHG$mk6qgdBJ#up%{mTUR(N_Oor9z5ZppcqICV^7>gH3%i)tR9yghPv^AEB>laZ})n;ni0m8OOP;vZz*HN;fpY~EZJ5LW-&>p++UTpa0xnCbB$ zup6%iklBkqFfiR(CT%k?0T%X(Qz&@tmL))KHYGd&Oh{c@#=#YU?~N=c(UplT$-_Oxf(?g@N#JIoS$ZLw1q*lnkCaZ)QdMA_)FviEW^-df~sFkJ-DpwcNA zrj^k+LU6a4;@{1migWtZIYU}j`f7VL*K~WYe9FAF?)Jpb>1I>)UmI-9-@^54+*t}k z2&-~k{V2>$lMiU{4MS-0&r{vdQjd@tX^FD$6g#_*pA+RdK)DqC%Nbi<3A`7NENua< zMqPC>KmuNbCv=)(K<70;5wGe-MG7^_Zn;q7cQj7`dIc6a^^|l!270T# z=f_Z!zSS^DIYSzVUn`UrojVv4v_qVRpje?1EBw>#i(jyTGTad(c z+)ve;xb9Qkiiya{m|W6W!^amMWfkblD{MQ7R|5_r3#fKy$^%LXHCku1WC>CM7y>$Y z&~&c+dILP7dQT%Ot&Ie_Qx<;o;Y{&8gRV7VyFwU_ssm!^NxKYUv1S~aFFBd2HmPvZ z7?4z)2JZEQD^_e)6dYv2UH631$R;t9y6~ag$jL&|>RX7<3w7(@v&;r&s{}~e^WyAC zJk%d=zr>@a9N;+Cip)L+1X^CR#fS}lJ33(`i6Fjo_-#u493|Ok2a{p|OdzLflDEC-B0#7e*k)eby=HD9 zMT{(~CzJh!=3t*`0u~nxuUkD4PEhL%@{=WqV}q4zw7+49-Ro(s$9IS(TJU+1TWz3v zJ(x8CUrc$bet_yhH6F-jg>efBhf!zJXGg!YeQrmEeau42zqll>Qm{T8vUBq}YtN?` z;j|LD=1$S)8ndNF*dqr}N0=4>FH9yd)S{+Fk##wBbJu7c@>UOu|tUKyCjwpmn)347cVww)qA$ zUiiB)LEuzjDgZ!~B8Wc)zTFTs*+ZO?&%e7?ZAA4S=al|!Fr|ny`*UX`dXGN*0|3MP zZ$_x%%&z6!cDWh-|Ls#jlU?wj@DKklrmdWq8W3BJJR7jUCGfuu?hCZ4Etq8XcZ2Do z^9l0jD{bxOI2%p*`Rz-4oLA2GzxICrPWZ6YfvwxVG=Yv|Pyh3w6&FW_3k0iQ_JXfKer88Rvf!T z?w1SY(QpTVu0p2~gec1pCqII5?tnrGX&RRZ%D8kJK&s^D}k@$0l28$L}C6C0K{OMp9*mcM6=7>A9S)px1O{#~dRO#>l_&T6b*acvGPemWvsO} zm;1h0T=Cmji<_8MR#FKX+qrXa`33$jUK9FvD3r$z?t{b_|Jb2FwggY8s< z?at&+Xzp;l+X`o|UEyJzf8$=x=C;mx0`hCI?E%O)laPt0Co7Uxs)E+sx)1}IxdX%T z^%|R&+7bQxC9#s_INdp3ysbWee6drlU4=_SV55N-PrGVL3|B0fSzRLjH>)!363%@g z%Mtcl1aDa#ePjiHFe@I`>5)?SrdvZu3Ycr zlw6{`Vs-y(Zbhv4%~##(eTRppeU7!0zWB1P>;#LwPukBT`JHT|9aQ6M=%DSg4qmfL zCJG+)QEE-p3kt&-2J{Kr_A%8s)!(D(ciD>dD0;x@U`f63MmNe%7%aqZH# zUbmC1cumV1WN2R9r?O=gdT~L@`CBzV)2Uf*Pnyy})nKBWan78%1wzw3wDc1O#^pP? z0?$>i4I@*|lh+WUOX}yY+zl;gGGEA`+B8s_+`fHEA`CEhy8Gr$8xCA}{!vH3o zXPT~{C1&A%FSH}|?F?IkAAGqy(b!EWfs!v*VJug>D2%(@4@8&Z!#j1PsXB*jx50Og zW{{CMOkfHavlQJoQ+Y{(la4uL)Dq_0oD^g+(Y~YUhwJVOsLFwWLl8BTXV+j9ZDVSb zX5}x&DECBwu50^S)y?gIx#ql<@TPpf6|^865B z{+^Q=Xm}gEh*)?}|EHfLGdQz;56(fjAwp7Ce?Cd=_ld0fQ*{zWE*bE?^VCltQ@(tG z6u7AI;tivP%LDSy@rMq#y>f;Lg>Tb(5mb{uD>hz7B^?wPwwrLgLTnZP<&KPL$A2_x zD}Gg6B7@9OIsLn@`k(yK|8LLn?>-iJo~QJA^CMlt z<;CZ%wxc7uq3N~nTpqL?4-bdb#hYMxon;AV6R>J&hYTLbiM2z+O2@$g!fF# zVKNo!{oY!G)9)dDN6=Tk>7vY<@&F)ZIq6 zBArGXc`NiY&@0nZ3?Rt&K7@`{eJWHPwgoaKt_a=UBVe!fRDim})A_PSjyET@Y7U-E ztYQ60;Nx!FL)+yR9!SPC_?pbCyo)^=ImRDB+aaIJNir8HJUoL>=k!A|34_V_g}!D= zEo1YiBQ}*jV0M&3^K+A8z7_UkIw*XwZTwD4JrzbXh=T5#7HVbfcML=UI z5GHXl?eO@!NmJevL2h&sR!Xaxhpzo>3s z#BBs)dq4}^iB+kX??vn3`Ai(I&(ZG3^c$(Q9_#b~kc7Gn?3cCtvf*qxT@^m%rb|+l zgzs5Pyh}YpEQ(Sg}OsGnr%4-8Uy~wpyfkyVC7_Z%$|hQS*0pKU#21DX;3HLMR6Ctg5@fK{MDix{w~VLkj{G>-XMzo|gAJ$$ z8JpcfyK7K1Db2>BKa)bL0kE`^3v_vPbb-lNP_wGZ^zHr2-~*{EZDmG@4^8)Xa#ehX zwc)RR+jYt@!rQU|l7}oArp_UM!KiS6uUlS4pijElx=rNqn(K+eu!lhS9Q7TZ z2esC!8OvlZ;K5VR%k*^;rw&iMuzmpyVKCleobB68cU7is7x>2px@$NZYP9@p>inEp z;`q-_FNNGq2T=E9!hx^)w85}_O^R@e4<5SnR&paMGx6YFnQlC(cZx8D`pGXaynAo| zS*!ym+OSAOZLjcDaVYFiCSt*VugSLeortsDb~`x5pgeByFPkd;y+8!T=Y7?eQ%U1F znbX}nizP8uSrk6i_p8B8Xqi=Zq^ZXr2rhh(UwfSp7@1z3J z>Ys~TB3e?UnrzVj6V*#)RtONgMn_BiX)(?o$Fc9{egUk=KTL=!U_O#o|6KLy&cFdI z6z_z<6*LL>+Luv~*-S5yS`ll?RceH%YYkKQwbFbro=1}QrDq69rtjVKzayQ6@pG!LwE3_KR;jegH~#CL-=6ps!vzbA`MpObyI<63T{kpUczB!Fd2-+L z$rPMkKRlVlY_`gYVwJ*5`I;!4q-|gJuq?Qt`TZMW_#*x3wEfdvyBIIb>zZTPTfy`@ zEe~yJSf%yr$1Fzm)+gwPT4b6}LfSTe78RN-I!XTMdk(hj`nE~u-@|U8r=p?v1ltf^ z?cg(sAJ^2GBIv&cT3hG!ufmnl^5hg300CI~zPuURhZ|GX2#11e{0E1aqbzsM`iG%Ea}hB| zN#{PEWR43p3QbO3p-k9x0IMNoFKXQ=WKhpilg`UnNIsY;1aD1Z{2>OK==$s#*BZh6 zt8xME0Q5jLfC(nOX8_|s;y~JCFb-mAVY033$y>j@J(npBxoMZ9zb+nEq_12l;K z^XZz*KLt9y#2rGrdN$m49TngjiL06WiY>2R}`R2%#opK&~C{@>y;fsEXUo{9&PVz?NoQ*<#N3fhD_Rz zLS7G0^lnuuQaOEnzgU2T090D$X3~&NllHq9h=*t5zM5Q&50y|W*IdVbHF#NWsUwFx_yvZi3Rx9w8Zb7DL>2!hisx7obJ};lZ3)wXLquPZZZn`;l@qxPRb{0pWz{z|9klvS ze;)Nt`hM;zg@{&ulXlFuSJv!;_Cg*2RZ=}-ksq6$ZSwu}G^b*eA!?)Uwqn-x$N~l5 zd=1tQP1<-$L*Fc2i^;vB^W;0Smov>E`+d(zxw3WCv#Ub9l|2}C>@sZL|it{z423xHmdM!aG#XVygtvv<8vrn@0s z|B38Nl(%f^s8MN_$H_VgK9+QFT}956gQQ_TVpDz(TfQxe0R)w=G-53SiQ}cNY$=7N z)9V%M$DwkYd?no;S(kjsDz`(^(Kpy1QUHkiNQ)4ZQWMKs{*mGJH#LLx1Tt{dj@svj zhh8hACMR$!@$)kE!M*!p{vN|G<0h|Fm%=y3{~!~tE8)H$2ESPn-4*+wdg^)fW9b1F zU2*KrNP8mcs{6Fl#qfmDDUrJlh+Ts_8IbgxO4$HT3iuETWduqE4QsAF}! znCGLJ0UyUrdyc)|&sc=eA)hk8Gj;4t<{)DFp?P`Q$%8%SLGcP&b9?I^<6+|-HFHJX z8E#6$874v^sHq0>&#ir8pz(dygjn#rg8U$O3D)O3@Opfdxhd->y z{6r8>@!lwUdI0II6Fd>~VWnF%UqE!KJ-As;AWK+&9VoQk(57XbuKbvB5qpZiL(G?v z&Xox6^rOIf2IlM>H$WbqzWcr-b4(d_kyN$(l_Zm^L3o!6W>OGrJ2K#n8kBnk6Tr%i z4Z%FKd)QO?v}P__ns2kD=#jL4TUgVwb$}RxJCri0MMdZMMRAl0v`I|u6pyRV0Fgh_ z1h4k9(EqP=0L=4ejvzt?oK8LXaxp7Rz4^hps{ty@2zia13pZo_;l+l={}F3)k#qht z?Buwv#!n{PL+kZ6Rhi|VzDpWFSuT0KMezB&s=UZgCh{O(%fip?PdH{|JmLM-Gx+T< zQ0Bqew>=;O{*!}&+8Tlzyt%gvG&1BUz1lyBIHhfw_^Y4Lh>!nOZs9*c9sueA@SM#v zpZ9+Cug87-WONHifL6qA0>(kGOkj_MfcNpI z{DF~JSw&9P*KO#}K%BT8mcHnA(Wwrf{jf*%9j+Zx+P zs~c6Z{&hOoUb%=b0CKfwI{EqpL{%md3twU=H36bcsoz)#hIE%c1Gb7$~kZ0+L>S=lGp8`CV!22W46=dLa`SyBEu(G|KSJtkJqEI4nYcpe19meU zyg`a|!sL*^s~Ca~WtL{w>0NK_3>K1VR^fE;1x;)tS~o;DFx`hJ^lEeE86CyS_KB_n zUJf7!L10Xn+>WiSiaqe|NHrXP-xXQiO#--tTnp{!YHHfwvsKablW?kT2JHB(_hS=Sm3#Z>gIW;g!>=J`P>1pb!bHMA7nj6k>wZ- z6rx)aDBn+K0jPjiJH=o)UVH47x?tEXRK3!15*ya8Fmtv39Vdh zo#`oy`(dq*Za2K{1~9?vJ|aqMP^3VhnkpUwbTe1iJq#u#-dediUIUZPR4KRBsg-*d z#%&!Y$xl{w?dB9!Jy(&@YotY2WdBD$jU?b;VKQ*7BEi zDbUYG(UFp@Fo@%B?8=+>D$+`xBDTiwPeQa`%3k!Q_;>$3+R@D3F*N4 zH`sznA0L{Y0!=xm9=*;O_qxEY!PENWYWEXxtQhZ)nv6+5H3v5Y)f_Idbwch2hLo2a zgrGwOYWcdpke5<-*skHsu+U75dFr=h#o421L}vp@$DO8nQJ&)kq9?^Rg!x=IYy- zFjNM#(R;VoBkvoE;q>hO%4IQ7ofXk*Cj7Y5cxZb#eDKgjHYq;(=+3eVB7 zKMs82dt}8Yxy^hek9c9jh^tbpeY$W(w6Rf*s}*im?UthAE4ILxjaRL<$97rLRCUdn z-T#I0r!*>Lb0?2+X}=Z zVfuEVl|7lt_Y3n>Bk?L~-96hjgt6U|s7K3{h@KryLJ4v{0}M4klCQ$-#5m+Bl|i+J zRr#OF*M}`W!zkn>-tRSV*f3hzUX1RR+4r(7z2g=FN;0F6L{$<~)DmLyAm$zPKq=d5 zopc{4S1J#^O=tRptfrj3p135`$e!b8n$RV`Plw<(8I7vE*T4eEQy=B|=7DQ`5%w+C zi7VE>96t9yLNdFO`dy=(!|rRj99!U#&H5zJ$_v`Jql?3+Ql#)on$nS4!$=dz^+NiC zmNCn!sxgJ2xGa6IhXyJxM?&)S8P^UsbDJKiyeVIjAsI3mafiOkRz+L?*bTis5DwIS z>?TpVkA=Td@xwjcY&^21vOROT3;fGA}t57V)+ zK8Kciit_JD$KNiB*FD6ac1RZ5@AA7-Dm!gCvZqfih$e8GJ9OWB*k#FHz#eVm>LAhc zdaOkawd;W@5Gje>Cun2bb711f?L3{KsFR$*-Klj}!-1cCSxQfG z9=)mwV4;)tL{%98{7qbbn-oK2ZbgdTsGF~;vcKIq=S%VKX3nA=!!2)?eK9Uscr4Lzy=zcTV9JQ!ev%ABCC`0?5{ z*eiPqBo)8i8^rowQhaI7vdtCMlHRAXEx)+nLe+Q+Y`gwo;3N~O3Wyd&X3T9t8(}86 zB+OxgULQg_CeAMS*< zK)bir-u?2+s#E@_Lf9VA&75!!(@|Pb7YbvBd(Q9Pq^d+glq_7t!JBs(b(mxpA+p_H zmfeKy>kMw4wu6_`vPDTu#fm1essyEiArnqHKEM{BwU?w!J7#b5_VK)`1l?MHbc^2e zjc?W+xhF1iYivL2*(co8d=#*pY4qh^Y!jveQx~~qn?4NUE!^0@$wVEn;;2y9KC27| zI2W>_??cM9$GnQ$4=hg~{&Y|)XXy30zO%@cJSO=pXx%(J zNR!M3oYvD$058#0R{!%r{nMY1|E&4_<*)wDQE8ri+{?4>m6xt3+7)(R7;q{od6d#q za<}dp0)>Q)4OG~f9n`wlRwU4Ax$J6E8jtHc$Ql9B?FwS7d{M=uORf{C%j5Ei`8j=) zq54F!N5jZ7-;5)EJ5m6!!rvE@M0~@674&5RAUN;>sAYhLeIN!II#gqnT$eu@BtkzC?uSKYsKLJS&=l?(7fDckQYMF2-Y8 z$M<7d(JT=|!_kzlYnpkkc`6`>1dyW}^p#WH9e(;Z3W?W@bGXPwZb>NS7;%)P2gj0n zl2ec2R~+2J2XLo@f{xYoKQ>BY8OSmEw0?A(?!Z;ORP_aBfXkn+J9)YBa#Lqb>MdHe z9;7xD2Gl*}(eK)(e-&z_jHj(54P4#HD+3}WF2AZd*#T?58~;!z&69Bq59OIp8e8 zWs~?tJHc(iOLkL^GsN;24FPP83znp67QNeY6M~&@@ajOa_&QV%E`4bO}BqK1t-@~wnf{0HB z2=tS74D-jQ4DGw&-YSbEPBGmu@Mek2BXG}tp1EROjh8yt$%rYAjzN%EZF&WsNg8R9 z0+8a&EIs4Ji5|VhflZ}wH~?Zp2F}kMkOqgGwuLvBOJdCrvoruE*7(hv-^XMabvJrk zH1;Aiu|7n~MbJ+*ZNMa`Bdg4TrlM~n9}^7%qTr3+$Kd4GDx{A=G}q)fZtTtU*GIqE)H-hUDyE6)h@m8`LB?8aDYH6wO^8&A#@{zI?# zu-NWnLv7FsxL$}a{DA#l%5uNHrBEc6f;mKZWqa*0-?vKQb`s1mOu8Fsa9jl=C-)vP*cK~G+`G&kC{4Id2M?j1@p z(LZMyD*XQ4L-3C5YKJ-Y=A){*KlOEOJ-tFUJl2&47yj zBADQc^9g)|G>7ws&Cd^$rJ1#UUw?d(hB($`mspCWfFVAYBO%n`$BEZu{5VygnYTUE ze_G)iw9J1JXEcT##q2F7ly~9ExUlT^(MB4hSfi0*yKg_ZdVI@fvf{^U8$Bkh5EZ2M zQuv@V976~1K>X`>mq&onnSPJpgR5Mma{xCC+wh;qtE92qNn#IS07yGR(9!ULFcgjo zd}4M4|1ZA>8%z)p><~O<0jBDAX*fw-=|7K;N(BaXOjkfy79r{rtRZ0Tga07olN%#6wpN#t|$vmU{8hB67#z4glvTnRKZR)h%HIa%d$Y}M38 zO&wV4{_U>(hg*Ya8YjvT`u^(xs|&K`t%(2T2|;hik!uo2+*RbF!E4QTLUSW+HzP3{ znCCqMiT7&%>Z&YN(rOBPyQ?{79#m{n?w_L?ydPWE%5_as^Ik zAOD@JKnrZ3gmM-wsQhQ;gfqWA-CdNoVDb?F*DRMn9nD2f%oBd9}TvHJ^ zXim~?q*{ACYlN@bkf|E)`=m#=3FQfFCCQ}ujeeu_>Rx>!EW+UK`^*;gCEUnUR)aP8 zbV&vp;F?`23nb#p2^ZrC530sINk|>89j zR?&J;;t&J!;ib_`S-$oyM#IUUP0-iWq$NYED(%o$V58TB`S-9A#NmP}%P+pB^?SPH zO!aphbS__>HUUtOzkM4}obCII18RHA!C7JoAbe8ToX0?>gRH%6ySNP zkgL;k3b&_%Mo9g&-{{%g5;hj!v3U#5Iz14YKg}m_HZUCTATjhB0EO?CF(v-k6i3O0 z)6$B?mlENo1;fwB*8vJDA?AlI>XKDM^LUM&ue4I^v7UI$jOr>Q=eN3qImX4%vA^k7cg0}p=6R+P@R2)sjYa?%Ik`yU887hcoT^cuG!(K1V)qCpeWSOT_ zyRKixk5*n`xIy^!e3zzxH}&gcz71ZAzg;}d zfBQ96lqqAOKuv{R2!575L9#o%d3}F)bPgJH53FnIsmNs)_7wM!KM4}`XPn->a3QvD zO$8iHYw+Evb2#G#B3D`@=$}wE0CNFwRb0!1b8$be^$I$^I4t9{CDguK(7t(% zAf!GVzRSd~yL6i8<@BLNdfi~W492|J{D{E5P%!iKh`EzE*6MbN393W&{k`x2v#M_4 zgy>>Mu-^?_WFF8PsPC>o0w?Oiujgvy-Z|mFj=I*IyF^#6_+WMCA4Xl%b|iSthsXn< zb||H-x7! z{zTmnfgU2SZVZ`Be`OwJQK1B(W2kwcvfhgkQFh(|YY!%JL-UG;Vn3M_=DQIYflMi5 zI6xD)Mv`aA)8jK>kB+(Jk`1}2qq~}xm){RQo!YOB&+gk0I^sW}zY39&VbfjY3;*UI z;#z~Hv@-N}zz445X<}RK|4X0`Y)HC-3R0T{+9qu*(uCahv7-zv9XDDuOS;j)$aZ16zc*z3T$6w*Mmq1OF`$`i~S0*ZLp%V)lO?<8>0Pj|KOs zaZyYZ1Y9YQAh!NNmH@K;ub$ELKF;tc0~eEHd$W6i@|$}jO>19}GJELJ@o#Lwk5hl% zO^xf&;1^hvK+6UG+vfafgeQ8RBX0gKWDU9FFDqYGA}5f}K0kvup<7JN4K&bGI7N9Z||ltQq|G{Pf?vvaZ@d#iJcZQDatx<=I}{g!doB?(NMzR2RRle8+R$ zV16}5zvVs|&PQv2aM}YTxyg;>{^5w{jG+ZNxj7HB;$#-iux4O=pH17p3PQ^oA-elh z1o<)M_H@p#ajlwmwZjUzMn?BX18B(EIj-t|A@d3h=Lx=sNO@N>drKF4t)-5ZB!~;l zw-xshyxO448Wmz>X-NjnV&^DTgfA~VWY1@^>%(org`ZGhE~WF*NA{H z%T(Pqv#+k7=yV?-ZAv+cB#VnTK}(UbLE9>IFj-!MasI<*{b>`p*aEZWs_J6n(}EJ) zUT0Pk>V9^YG@9M>fpdqgYUGpICUD`p$|5s(YXFyY)784j@OvFqZ<}wnn&qr;1sO-o z8=lG=e(GZ2e;ZYPD;@+5%++*WJ*u>H@LrU z!D2?&eaO^^^8Pfww_>O2c;KWMd(6T*y$rYFmEJ^ziwRE^GdegpTGX?DiRgG~O}f-= zYOTwF=|SrT%Q39S>H~sR?X%sNHjduNbUP1{NoX@kkWa*_dBm^JugS;?=sVTpm4acy zA!wucH&_R$*tpc#F@@^*xJ`@rQO;pM32M-1{!E|5~US@SrGO+ zj%WyPuw!Ti?Opi#2U)od^5C4t7iRNZ{(E~seGfo*WUi87BUMS<15?E+4Wrknv#!d*}UdNrAd;S2Mjk@i;3Q@qjQ@WqO{6Va`efYnN;nFZ`O zlQG)F95euk(Tdvk(NY&ELlK&unJpbuQfS2?ILk z=n^SZF{YsmK|=&%GimWG*d+1ELm4g)ccS}-cA8PpooMFuuUD@jzXAuAx!z%5#Z9ZG(Nx?%kX%O4`vSg1)lW%;ukXv zCa5CqE_baL;Y1L{{N1FOtJWVr9t)LJ0D)pd3}Pl<Gc=ZP=u_u@-%#;Ve` z2EZ%x_A4F13z}9m4dhXt2^x?;B+lIuMeL0NDdOI9Ey9Qt_0;tqfanH@+FlZ_?HmBM zEIF0~iUt!(n4@F7>UX)@qple>5PDZQ>SZRWhM}zyz&3*AxWAHfE-E%h`sFcnZicnv zuJ|1NK^BlslOZ{s&mjryB(caR^(Y^csPKf>@Pi~k(qUB`Qw7`&mKNT%;142G9+|+n z{Wz__Ddo#1ohFibe~`769~FL2;Q9eVGpbYfqc`Dm zGy=!+jler8y+}(LB-`5{0$!cTrzV_t2_w+ZHzgi@z>o^*lX78Nm^Q=1a`GAG`2dm$ zU;o86Yt~xeQZ;~Bk`IgQLt?WP_{@ezi+QPnC<^Wc4EKJ0)cdunRb>hV z$jm?^Z$Mgj2LY^z#%A9u!8@|S=*jGNvsBQN>+-B2_sX9`MfcT97mdx2w6P$%~v){Mch=NL2U@oHjiiN_l7ZgJlpH|?vXd29X&Q|$Hsy=4$%>rsOAT2>4iQD zZ?s4;lXd>aVpXa?sSj+qpM)GmPfh<6>!f=0@fq6(rSo53PsREoGFq4EAaBhiRc8Yn zYdBH9~-nSAU%A z0<(iun<46oT3H3vvnuYNGrylV?&w8lvI+0`Oa5{`OpJn2qJdQ0fGU|H#9?y5YX4q> zaOj_$MBSc4gRiBJ$F}Xus(}z|=3c_|hUsp3WjUqD1Z4R-z+G^KpSG#?d0Xq6 zFoGZ35b(&!8a;GQJE&TolbM=&Q2lAJH(+7F%zm%iZ=yJ7FxNrHj+x%0G1|AX(zNeh z->JCuf~&8+3+Ud6r|OA#nz@NQl$LvmqkD`Tr#Bakl17GaY{pmns5Ku5yojuwE$a4? z;~q|X%t;gY4>vVF_3a4=czXMYNb}bDp~X6ndkP&c7f6<0QT8v>%$vTJ*b5Mu z@AEkgfNrCuZI`dz={+4i`X#oSnlYkiE=B%frw;C^*Tf;ax0Czp)|)lyo-B`wG-sTp z?A5A8huQg7uCP#{{+IW7DEpmY~oc|pH)oo?Oo=929CaYk9q1KGuAufx$p7gY>mJu7IdP{<_FgMv`vk8 zvy@Hp2>woIPyeoFU(Se{s%`PX+Jxq;hlI{!zm@&7|1`EW;EjZjNKyle3joS{*EAs{ z3mC-z4rI`O%zvITbgyY>ntxpX#}t#mNkiSc=MPZP`uF#{Cs;+=nk`lNN3gRJC24;2 zH`UXf-&Cn=2cEEeq8kEDxbvH;q5v-IXG=gZBbQRT;L{n$&moBpF3NP4-((`B5leA( zlmVjzNnap+eGSBoX0S>X~jK7&^U9M;4B4&Iho2PY>t$)@NC>LgSm4 zG^=Aiu3x@SWH1;p1M5|WZlkPj@{6nRTw(rt6>BSZehO5P(q-k27x$}i7>%dwOH2}n zU6Z_e*8FNel^H1)*`h*Pw$eIw!hQG|qvhXYN++Z3p;eoWr#BmS+L4@4g33{4&)0Z` z3}HVB%~YoLH=DPRBoSb^E$~!#c{d~^$-DN)0=F@Cjrd5{^)OQPwEt3~xu2N&S>xrW z>`lqT9>7-5{XOL0L6^-`0fc*+D?dMiacBR`lYo)W|KQkIZubb zD5sr0Jz2CXiD3zHLplbDF&x+|A9J76cppD+KsnNZX6~+%4)Hioub2>RH2uv1D z%oGh)<5wxPr8#UPO_L5VcAVeH@c<_OL)Ms*G3Z&cl_=A3z7sAZuLs)Ea@ovp!hhpj z%@FI9V(DwA%uo?$`e`;}5zB~gA#9Io@7}!mF=l?7v*){fHm0tfiIJquj8=Pn>|B1z z*Up#qWoN!stlNF+pG(Xe(ZXN3@nD?Lt4lpxFP~$dve208KbN$Xes~M#g3Q=Q@=lQ0 zdD`VPVt)M$pYmjK(aJf(jAb>}evG#_d_K#iS&DKN`!uqhq&!^GENg+0zcJbsV^@c8 z@Z`-t7mhM^<`cNQX4HKp>Vg~9bkF^ugd6FNd5t12FGiXJa`Ge0ws;SN zwK@$=%kV^PQ%n}hM8b8VPuU6d#}yKi`$I@6JKjGa zV}rEq@$74TM>cXy5W72#QkgbI-cM;xaVZzUkTx(;!>s|gel41$@2)<+?WW{fJiT7o z7IY};yg=hu`>R9BSStN>M{6Salap9!;3cCPOl8U8{Y#46k&mD>*xMWw=`z6%APE@b@mo$iEif7G8Cbl{Hfs;il*Icsn;I87>s_Qit`05YL-a zjb9#^d|a1_H&9sY{LVD^#kj@sP%5m-4RQO`Qm!C&4wCe!WtJ_m{88MaF<|ow+q&@| zzC!r0yX7O9I5AQLDv9g|+=R^J!~wD{`Q|>m?mS?_UTAmWq;r2l6x#tLaBKmGxf8qE zZzBRvJf?mne2JYk7r)|h%2(W2;UXbp9?Gjht8i)ZF>%K3a`L9V$Z})~cVg^|k30H3 zix)C(9)->+ejN(Zz*=;pGPdXnV2WlmT^FLtYQ{sWocy!8Z5ZB~__CnB?wYpd?>()u zMoC@XTA>q-YOJ>;e`*z+CU{LufT{ixv%=mF@t8F*y}4iI>M?OYdh*z7BbZ-TF6OV- z0xGpJ4-5IIs7ihL0-*YYLg=;~yuDFCYC+J+aIpxQ05mc`;mK^c%D`{Dd}Gyr?YAhm zu}{i8M!tg?yX3ANFXI#V6S<BLF zk|5x{H0d8DHQNHG&A`kiWp7!m_9@)-IWKmRfaq}Z36&ft3Fbd8w#SEZdQYRClne+R zxnAv%dU%=djpA+U)#^c&0i#hT$p9G_nUUkO+b`nn%y5mN2JKXlZyC>?Y1J8NJw-A) znR$-ztj3n5yu^IO*2Y_8nY0I*pjNEYBwOY(TGf_fS;L}~HTZ;LuLpcDjL$A0u@ge> ze~BE z9BI;j`mu8h@v~WdkJ)Ho;&SCq>Gaf^gIQjHfY^uX2XdND^J^|%>xYTr_S)0F&fe4A z{H|Y#xayaAkuOryW=>J}>DE)idg)8yZBjFaztAozAZ>dlMS;xWEu!EMm$fVBJ|i704KAp1nN zn(mWjh zo5vZDIP=y}-k~03FyzZy)VNc;BeM$InP->U7ULi*#`_AQp&A*ZgRUHPk>>qyS`#-7 zeXIV>goN?YrkR$73|4}757#rl$xz7%CzXElxVEEq$_8W6T#+K*NKJ9KoGX^7Pp~V} zz*)?b-}YW-Ky3$s23!hEqm37pI@FspKDzhONE;piRujdlxVo_0FrCa9-w8w9xl6=; zzk7E!`;}<@f}b2#l6p!_D%%%dWt-eOhTV$>npCx|aS)@H?PQl%;WwGIK4s#WZjuW; z3MIvYOz}cI9f2x0b`z(*e-kmxz`}tM34;EDaEG_JEj|_yF^tkd{K^X&CC>%uz~zO& zq*LxtqThp|ckopZXP}7fR*#FLm^OUUC=F=zEe@zHLiWW_77JTb^Y&ck+13zZY*Wxt z?9m9phD?Xg!bO!sw!lnNa{ve9Zg<8+{Nnv%P&fQt@|Q*DVsC2*+3Q4;QfVGMyDS19 zDuFBbVsHfbu4fz)@B8j|-dp)i#aouYn3gf!deNtrpacpy7!be z(;v^@=>hwZVMQP-kF@GGu6`Z7k5hwBk1ZVM`OG!Lzkuz*4E8ijh^|)NhEXHD-8Ji^ zqgzb<*3-b(n9HqpBDHU496tEw%w0V;`48|A zV2-67YX?y8u59%Iw=SIlz_b9Ixc~go%EC$)`ZDa!1hR%C9;jp4)=(1@f4V>Vduz5J z!x%6N=f3Z~Rh*Ar&u=>p{A49RKG@y8soiM1xk(JXp zZhRUc$O>bs1`~7OeHZo8%H8$Cj}Pe<{12T8JjZz=BO1yfOx>89vV}ak&pV>$TP&3-0_W4cKE#{3uGnzsNU%JpJ^IcYH_f;^s zrE;*iU8@S!Gdsx5Ee$C#FfhQiyPP_U370%ykokg&PVw{wvM^u2dnBX9`z{Nd`NT&+ z?kIW3DcdSHkys@_a$4}fWx?c}jOpH6jz*W%nwzd{p0H`zd)gCePm9!Vy`nz7AQ$o`@ zAd(S|X|DS5J?%HurJEjK^*6m3l(*6!7Ef!sx>ZOBGKrouAhue066HzHQq4@)kc@%t zWqBVkvhprnNR&Y=@WJ)u2gxPFq~U&RUe9K|$E{Y%m&w6PRLPNgHE30M7tk}Wc=$;}8>HIIYTh*fry_If1+J(E=$~X$c@6AZLMkZrO;zV(ndQDi{m-V?b zlO-7{!yXQ@%(+mXK>i=)TV<9GeM`wc&VujM)dyR7P&@*JQz^f!cy)wx31(- zAiB3S5^w1k0tvTljZ2dml4e_GZ&qUw*+~}e-k8_;3Ns^DZvjPFGkeLmxE$yAyS=we z{+bi8<2$4OD%fwifo)y~hzG~fsREM}PGIUhWY=fOUQ=RX+c|I?wr3}N6a9gT+cNUX zd+0Cn^qzTfAxxg|p}<~&y`jRUqNR%9RJR@%VHGva$X63TAHB;gva_%^q4m6|0Uy|jQ&CHdZJbf86 zoNN6&2lw}$_dki22t`Trd%a@3lZQA1Q^b}dww$+N;sI`3`9pYzY13)?2<|2|uTXl) zntoM@N5#UT``ih^7v3_!+HJ7j7~b$?=Y|Ey+xy9Eq47logYAt@1HZ&%!7;Jh<_qOD ztleMhM6UOpI>#S-BdPyec$1;LOB9I-C)|@5cozp$)aTj}-SeDAQV)xf;m zVV0LNck_o~_s#k20;a7(iNo>BlLIhvf~C>7l!|KDW;X58UeFu6$yR}339|oFZ1?g` zQsD;kb4@EcVBtJD#i=zfRffK+fa4tEY%h-?-Nn*j;O`tQkiiSQ@kQ%j0JG2^FU{0E zrWS9b1|Tj@w^VPR?GwnpSdsTt1y;v=O<3OpI2xoYsIsHenHaNIlbFD2l{oDz*uMLguV16) zhPfXbyL5i`L7{0%Nm8H5&@dY7RWB`TCi;OiyWOaOTv{Tq|ps;3v@(tH1 z`#Ir69|?c&s3BBNDEQuEM%JR3<~Ln7nSGdYTLpn(ISAX*G0zT4x8rzGvtGe8Z{V*h zIfZ-FsdxDJuHtXBI%0=5cQEHNu~Jb1pEpdLKjdj*gd^?QQ5LhSrP3jrX?$Ozg>64s zM|^*hY0M(kHm6F%yEi}7t*QLvKKLSq#e~qZElSdbS8Ta#l2V*hb}>>_~TiWPSNJmE7CaBX4OJ;ep-nupb%~G{xkP6ksP`NY5>R`XH2WXA)dpb4;ez z-Js^SdDG9vn18l>(^;EXjN|Gw zsm4jT4*2E`u;$?(bogSlXYL`AUJLnh&@%VBZ_M2VDnGe^+$iquMhTgaBII8|eFjm; z=8~Lysje}828NwG=Lp{IiQdVAp&kW}BG;Q^Xd_vSA}>^3sk%bl$3GFklwhpoO8Eke z)dkp)6DRO~fFVPvQ>&PN^5I&=&vJFZRL3JX2OemBMs5fjn$O-U0Gzg40`$?juu`Hs(-8}T{0@mnB`XMaL5^-zfblDo)DOEg z9_eh{i94w88^A8YT!Q6vNy(R!7(L5Cq;7 zx`Q(@LEfz;CS@|nfT-0tFWK^0Db|aOIlBbazN@POqTz6 z|1kk4?>xq1?N9L@gZ*19hH2!4bpP+)!RJqy_oP2iDH2ed0m}V9=g9s&I!gYx2S`FR zQ8<@&bZFoM>!hwgrZ4GUJcDj|3=JV0t)cXycc<`zpW2 z>Rwq0xc_v6ux(angwP>Ae7*PWIk{B*Cgdo48z2vyipnLVOOwNhI;(=tX^UVwLL4iH zUZHWHi!jxLukWejx5w^B!|iykCXNR(*l|@mv^$9#8dXKlOIx=edzD)PpZWs$ixq^x z(f9)x&;1DWy_Rf_GSa|2l2K47p|H#zbr^Qzhf6;3P7);fr7&PQCBXTDN;W~+V|9EC zmE#D9N#^46fzDERAYb5!`8Die zNcE!Y>kS*ernCxWj_Nm@JdLO65V}58sppUR76jXn7hwFOPrsZVlbnhv{hoi_=~d3k zK$M%8APrE0r@xU3REm9#cMr$NsR+~SblfSHycH$pH{xwzpzBhkk>G2K$RJ%J>cSpp z^d1M4e6UA}W(Ovsr#_rj(A5y)G``!6988UW>)y5qvN4-Q{WKX22yka>scCk)J*vK- zE1{EUZP7+`N=>p2&}SFyEbw$)1UjPDjbriO<^mbVU4 zuOi|})wnt4yKQ0z9x6JwTFJbuP6XLYc~$)UNt>3RtEn<(8ojbkx|v}8$?=x5RF}Wa zO*7dR_U{u&rzGWMtXK~;49Q$Rt$}ULFW?@kP%V6XCOg}Ft=!#uh2E8_DHN=5d!CbT zCfm(2Y9Jlesyo)o3A36Y(PO~peZ-V;lkfIrqqz887zs&Tet`v}&r9&%uy&J9lG7y+ zCx)@xNsd=<_*7if6XjfhOf^zGv0jKWl3Z(2hg7TJxF`24dzZUyWob=GqlGf3gS?E; zCdQzFy6etS+g+9_VR2ei&a02Pyb(^K2fL%AhP!L~se{G<>l0|J$;)_6mXD_Me>i!G|6*_!u1GmmLO7br5SrPDCAW<=-iti4HX4k|RnDgS*9 zM~O@J<@HK*&7#tsP+5QWTQP-ToAV`4jy^7O+!$?1joYhy-m>L2JJ&zkviPL92`skf zlDkz??q8Fyymo#dsS9<5_eL$&qpr!*e}J<_$f>zbb_)~tU@3rrx-+VBM@ws)nrd+w zaFL|Ot-Mv>y^;1Ac60bw(-`UWLW_8pj7Nl(j6GK>yWmzSKjfa0yIV{Xn{P(HTS3V; zq=?lTm`+X!OYAT-K}MBc#g>IEv

xd$FT(dr|>UXr^Lg=-OvY<cVt53wiFl#{l8->P#9obLJ)zceWtt3nX!lu9y?)`>*>PH?8o15=JKf% z2JFWn-@HYW)Ld_~OHqu@am^ZO)iEDkb@Zgxkn;z!C8@%~ymA}t{(5qCApeAz#FVJu zm-^B9XbjmZ+HOKEtEpPxq0EfYAU;G$AM={c_+i=#hbHO}(wCPsDBC)1_e)(P_B+?+ zWU?JHe%O1icNoAnI2E{NjeUZ(>u`_Ulo!lidhl2{HBXm{B|lj-3U{1w8|k4Dy5*+z z`W#O#tg0M#fsmLC{@@8=vc1CteU2L#^tU~96`QVBE>iYnT_@r{TodLiLdpt!a&1Ur zC7EHxF|}0~5KG2+f;W+=`+l7{U%d;6+&Bxbt|m6AWq%p1<4Zx#G$&>|#+K-i5irNW zsylJ7bz7V30&64c=Fr~RYJe}0T3_+npw*gp`2rztGd%-h4Ad}Vo?CjIm%Ur9^Rrc5 zB=>nu5jO=HU&+2lO}}$FRO^xMd2DakjY`@iE{bRkJyYN%h`{G}=%251U6@q3R8jvU zH~n~S4z+u;LrE5rf7kRwW`-p|h~C<}R~3NH1$?3Pbg`-(gESq-C0tR>6L%U*Yd`zD zc)B`VdNO#05f2Ee?+z!NdX#Q*`fTL-XVi+;-CtEx(~}zLeX<`%k5fTyo#Fm?aUlCq zh8)ZZpuJzWMKgQ4(Ay$hY;x_~xeaO)f8K56R>3Th+O@Q#66S-GkAvG~rf`BG9*B!I zg|#vXAMabUxLJq>)vmOPKL@BIV(*ZQ&FYg1A`>KG8}}lV;_mIuvvc}^(7Q_0H|{)m z;ZR+nZ=|FD@C_B!1u9|jUv6^cQf-SkNgN@=PRkh^-MZeiljB%jIlTS+#9YVurXA=R z(0E+?)7(A&x4E=HfXC0P3!hv@Q$DJhuwmu|;(PtftBTgsS>uggO*F>Tz2(*usQ756 z-1zjpz;zwaU)nG0IIzqVtGg!lz<(5gY4sQ#MCnc~sBxxAxDCD5Tw*RreQvBc#jGX{ z5*4bvc;~?dt=8{b#y}65jubhz@3iklLVm-q3x8!dC49=?Nav|&Y?<^ts{(jdc@^jR zinvm>_+ZlQ47%rgsS#10f#af_0_ z5@l5F3NQG^M7KTQqnTy(klfPvVGT%BE#?R1<0d<&r_IFOHn>ay6|k?VGBe$Ar!ox8 z`sIJ}jv+3|b&e&Rj_ed3&pOKf)j9^=TAlTq+Lu2Qz8uKzGr{!UoMxD0%nX&jK`T7C=>S0;V$`x(DzZ@USnQ^=lYU)vwASE}lm--BC0@y6e5F;TU;1m(O zyC!SxTVt2KfOpfrF;(0X$O#8XMd+^IRE!qq0`NR0%o`10A63$MZSZ*}ZVB>ttGDHI zdSR5)bYkDn9t8Mx5)GBdJSxTU18SwXjh6Gk0Qz3}6u{>Ks8+Nv`TFIp)=}rVX=na6 zAZ=5hEHaD^{AOH*E&l*h@NweqzK?$y!0HJ8R=2E(gExK0jsj}Ah(#@p-B;^SoEW)i z|HEX+I7~pK;m|T|h7yiUxQ~wlz(IJJ-wKI9=x@8UT3Vk$K9z(~1?XnBppfMJ$4!W5 zl`im^NT%;fs#^vZ!1P(;R4Y#>ZkO$?g$V-^$J#y|JG0AEIqO3SiVQ8~6PO6b8aMDmv4j;ELG$ zC%S6h3ppQ3U^lT1F-vB)QXj4zO09Dr4AND}z>Ws(p?kaU3}b+F6W zlBw_0Qh*HdSAdFNIl%Rdc>MRTpL<>x{LLc{_;uT+RSa~kEIaDfDgSAoIQxiA3UCR$;;4+pi3>tuz<(qpR|7p6t@&BZPQDp&AL6<~e7KN~fmDpw# zhG%ALUKQ1&+@G)5MTm>keY`BOm*s{2bwy-~Ux6G?uFKGE;O3aJ9R<|V*WYxOmBNugXy7rUuBjLLu4(&`B z2aXrG+939D(S78l>1jZcNk)!AF4;Fu(9KJwc$xG)rzqr_Zy)W%>EBc&ewnEE!z7&r zvZ>yWk{!ososlJMpM!&#D3Jh~X+2&++kHRt)g>v!2dt_3lBi6hcw zAG&`F*ZDFog)&zolfmVC0%K~@zBPxuYma@yI-I;Q3Wb0yIOV?a$b(6@Zuyect4ZHp z=(0;`Kf-P8C(dITcNro1W0DRE%TR-+)Bl6piWmtPa6KT3?Xk8^1H34EVA!52EAFJ6 zmOd$`!~d?Y|K2wLNRjxNPzf)?r~iVbpI10WP^JyX4t9sO`oZq=os@~sq|&u)OtUiJ zsp0?-meEr)~rK(AH_czr_R%M`96=Fm4Po4djU-lOG z9ipyBCKSHB*P(Ew9`yFPh~K!+VMiTM;~^irwlxu4v%zCIaqa+_^0Z&tb}3uQh7CjW zq~X)1cXxtfT1(WZRmVoaMFdy$siebPLf^oFn2s?Vm7GteH$)yDGf_klTbg>5kYY5E zO!u4WN>*>P{r`SK+yBqUr2!A8LO`Wwe1}W{S{~6lFC>LZkpJb$yD~3tSEFdqOB?OR)Xy5UE==bB9y;Ec16v4@>ukm`8tTH@pFq=kq< zo^TH93#TJ%C!Lz_De`&*C3FS7ZZ)=A+wufQRL)ER0nMTLuOlf}9!Za3o{uB)spb47 zBW+3NKD@JtOHu0-dr8D_Q*Z0(EAH}N6P?bcwamQ&dd$|+=_DLG6qW;BY=#hhUzj3yCl;&aA4!fGC z0~~;;FEFbX{M5{Uj<##Es9pPI0Cu5#-;Q&kp7(@eK;`?C2Zaf7E7`$GAcferf!9|DbydetKyXEkq7E)sbG-5&%&c@w;X zShxLQlQnGaAqTRU1C0#>nt=gfBpg|j3m{z>rZLg|JPbRKSjKvW`i323E6N5K>eP-p zE~PKD$!c{C4f1(u%O)3Qw&77$rB&qBg-2lROalP#Y@)wOTVW~$H_vM{^+07>l z1a8be==$n$%&4Rk&*nBYZHCnmZX45*FK6{S01%0~4v4Cx^NGNB*9{Q_!5!6Y*f4bA zarcOqt**@{7haFe0TVVI%m>URaoIAEZm|$vAxM&Qxk3V;A30Z_ z6-0vXNie-9f0L9`1q>F{p`xC^ctu=a`hdAK7DA@OsCK6@beiybNTY9C#L)F^E`E+(XPR-jPJEEh74#tsLio0Gwl3&I(&>w0a%) z$Sb6UmI#ET9}XJ$lxm_4kO8t}a@xkBUILP4*Wro|_wgCOsZ_8@p$D<;BP6~2*~|Mh z-$37h!4oMIHyYp`zPqqBB5DmFpSA#uYL(|}gfbug^%MRpF9WUF3%GL#OoB0RtiLt| zm||eiARHy;lYoo*H38~r@biETN97%WQr*A__;CCnyx1ruUBz}te{J|7^3r{0>DK*q z1~+tN?!X|{P__2up7D&iVjG@JtOetaRn2+J73@Mv0b42|2sS|w037durjp3qfS>(v zN^qV}lXe~bYW6_yM&n0#R~5btJUdR}&M3|u+UtUs3bqaHLwI0@BYwVt{PzJ4LD|AI zn6SkQ3{n7ky?j^<3ELQ*QD{_gFm>qxC%x`zwi8Y+_3fl|+ z;E85`yg}>&!Ac>7&#GG9nh0?`pnU)*7b@*wz@F(plJ-UmL8(@nu~!5s$C<{H z+jouRp!TVVk(}r7{W4{gP*!~Ej{vF~Rv=k@`dZ5e^XATcLuhB0E_WfVov(9j&sN8d zibb75J{+WuE^*T8;Qorbna!AAaJ}JEGbsPEtkaugEf*YK~E*z~ju5!X?LR&qAU>rOA33$%q!p@2;3 z!eY>g%DC3wB5m@8C-d%qq!L#Y#!lklce|4#sl*e(Hj%)YU^07qJ|!7g7(&A9S`N$T z=}34cLGD;1fCP-WN8spzF?Yy6#@rPeT~0;KU9A9&=bqC74x`Rsy!|hSVuDu)$uK+r zu;%RKp3fwprj-ZK${V0;knup9pCJ02>2jY_dcCMX?nj>v?y5Ne+;;}Q^hg@C{T{E; zY>Dr0DobTfnmvo7$vBvNKm;}r>$>7&fd7{9T-A0Sz9dy{j6M3+2&6ChJLGIOzT=Eg zG*Q^xm1NfeEi8Y`wzS&lT>N>hl^;hJA_-zyPv?6#V|v@y*2(O>ZD|nQ-+6)5A~A%Do_!9IltB)}M7f8U-&@I3ib- zfRJ|vNNJ-cQ`ZzYu<5xDxhU1oCLdmDoI7B4mt10Bk9!)y{|>b89rW&vSfW0*e`cZT zOz?cvWutQbF%RRs}!{m%@X+<3`9bH{$)B z%IA-ZK?v2z2XiHbL^(^YwAyzjnt7YQsk|F&k|)iWG=UagH!#-l`3#)I$#kMpAtjPT zJ}V9g8GVK08h4B3#U3>ci#9umbsmI>IBImi5ETvV^_ugE%BTHmeKrW&rWVx(YqN5A zh*rYZl!bVg+0StgSAVc+s=cUGI#4L5#+o>1eO)T2;X>dG%kR`EH9i43a{)m?Nvq`* ztI_gE%`!|?ySVdG?Od^2`%7Nb;3 zFd;(f+=J!xN_&Rfnw~AL#c!EQ@_tyD-l3Q9@;jZi-qT_F%hfM zj{c^0@m68sA^3B>1;F7ksto7M5ECvao3u{RnlsdzQ+mv5kl)Of5Q6BcWc#}3_@nOg zwP`v)4zZ{Hm7IG0Z>kIcq5GU{%kaisr@w9LUA|m5-AF{^b|I786{UttfxS=W63y4buXPWX_mgem5a2PrlPnN$ys zNDz%29YtQ%*49P63gytgt`dHysOSOUxK5M%n(prid=jot(!Rg92OwG_Y~gyU|J)`1 zE4KeHhqWMdc1OQ1P=KAl5ED_Lr&eDv$I!iGeKwo!*Q*&D-rz!oakoMBo+8Lq1IB~} zqA(qki*r$LVXx$HM?LGE8$il;)9xfd2mFcIslvOyqe*UE=j)9sJ|{;`#&D7uu)AD#db7 z4F}v><*f#O^LQg>pZ1Je9Z=|H1$GQze^{i567(pSTtZu~VKJ(|G+ixsoa;B_;LVY6 zv~4!72u&+z2$TsK9e^c}o5ru_0kKZbYI2`Glcz6jt8W7o&GXw1-GS6V@M7e6>CVYDgL`>oi=9razQP`=xEE}1%e#5sm6UxR4l>}R^=4aa3?pfP?FU7z7CaH>G@Rim+Z7vdmWUsFXNw-up^cY& ze8AaZ@WzNWcuPXvDA2cDo&XTWSkMUQ`I?}SrFAbcLdPk@cjY5(w-x<_=e!_xo&@!K zN9wMKEp3lFpwV+LNHk%T1lk9m(Yg zWGO)6m)y}+2`kgB=Y0$uSDdP2PIAy32syC=Y|XR}Kkt+BM2<(i+a%-*RFT%^C|)

Aw)9z-$723gj|LZ-nj?h)vUj{fA~ff=sLJD{ZFbW5s5^ zoq`ye>PC{ULc>ll!t!Ja+;suXOp+l)D?A%MSgvSv z9W$MYlvZftgQLw4wtz@dEf~fP;PiAPHLENBxwSP!n9-Hcpm$-s%lcu9O8Lw`(qLtE zRfMdDMT(H5B%vEf65XK;Fje4R-usOl7$X%AOG3f!J%z6oX!C=DL)k{$lbH;e%sG

<^V|+H?!Q!qRTaOHP3Upss3vfvc7tAGaxoV2w0Z-Gw1KF3!O>= zmMQ{RmS%04Ogf6Jt-zuNPPnywnuF&*o=Dv*LH)0#J+Bk=U#G5Jaa93~d`@0OTLf75 zv1=-)sSGq;%RXCubKXn-52s_L=46e#qyE5We^@I2l>j~#l*a!#6cE6zsMA-Bg#CO{{m;a^w+O@Va{6dU+j7-s|Wscr-o8$AnD{UF;pja#>+=+zO}&jS)9fVzAte- zDkFc1d{*Yyx-tH&u%< z9ZoE9_eHcS4eb?#?HJfTgPH*D;R*}QA3dP|diuyTWmVtnVY?2;X+igpTW&t9ubDjH z53%UWOZ(Vcx%T~_PAy`go6z*=ObfnFZMhz{t8KK?adNP2u|9j2ef|sH&4kz4we#nNJyBotTcAd- znrheD@AAojEXb&#YNuiPIl`*P0d{#V46|0f;daUx<0}$R$7lamFL;zSX^w@kQDkO< zwl@)r+}?J4B2}f8bWe`54J-|wr+9?H#+SQd@m`OLroA=u3sCDa;(u< z9<5VesKwUxCXL5K1NeGM3wzQ{%o7^Ki(W)!L7LB;;}~++H73CEL8HGK>c4!!4OZ91 z`PPY@Yg7SdM4FebR2<4p&amnlI~t5yAcB2-20mGAm>U#)6aA zuB~lxnR6?gXdMo&x>glmcjWj?j;sB?{ZG_L^q`q==~mU~k}KfVL*bbsiDOe`XfH)X ze7Z7Y{`_=riZ~S`c#4Wj;nR*;2&-ZCS)s=&vU~?6XXuy`Ujnjuy@{zTYF--0XaId; zQ#CRW86rjY{iZSpoLKXG7JE$YzmXFQzzq5>UG@^9zwOYl^y*=e(7|oR6`FL1ug#~4 znm&BJt+yQi*kl>}gcEByebSl$05W0`=CikADOso6W34))xg8Cl; zx{@t=@T(;7-jO#zzhNyZt}a0^xs!j-Rz|VEg)He83ZT#KkeR&Y`q&zySd~d>fnX6 z+Dhv0h|-_vQ?f6^SAYnT2Ya-x4!gz`H<$LHZbP$}a#x-PBbk9mbfPc)w79XN((*pQ zgpMr;duneBeWqDZ!M(N(xI2MU@jwbv_6t8Hw&^Uw@iysVvn9Us6u8tEx>@QrO1d;$ zIvrM(zI*2HaSn?7lS5(uPY3Lzu_7_j84omN<}275y6;5aBP0GAAetO@gA{=3_mu6h;@bTfDWepZGKbn`2cBZ1pN(dKs8x;y(V9&^e$Y!)XF4bs z!l?qPu697Zy$|H3&8)mb7HHm!g|xCXizGU64I3R-b`_xuB)dpJ zBKW~3io!<7-YzYFkF1&{UtYSEN;zxC)6nhWkf758C^Z%gEuVOeEtRJC>C7lGjIo%^ zr~tdm-A3NXoEO1_XCG641+SqrjngHGcV`CkeEhq>jAE7|uJdHKUwuj&OR|Y7BqMc) zsp4)Y+&lsmh@l}iiGge}&w9_hI2|L(x-1UjTJlqg+Ax4Nbzg%Pt2_5D7qZO04PT1B z{ilipJv@mSf8xYRI9X|;5kWO=s#a$FT=SyW+wG}Id1|75Du6)IVlU?x8Kp$RZ%#B1yw7jr7Jx_A0uD)raEy5wobq;)7X1> zrN&@Nb{M;AvW)5Op}|A6f8q;%xadQ)kSw7;)qU)RVLpuhD3BA?4q$wqJi6e1ir;^D z1!Nz~^3SKn<>@?RE7+438myh2N#0H#Hp}H{G0#iL&AEK}^-t8*Cr%inZ1eu2J9JCJ zi@_j#$S5A|j@MfSS1;mlt*R1%s8fum7pCT2M%F1vBWJ!#w-iB7& z=4(BV*W04lp~%R2ugQISG3&KbBtvNhPPCl(5aw20M~Emck8YNC@y}XQ;LD&eFWj4f z+Lqc~yBuGWIr?n6m@4ePp<7Oe)38Md4?BW#i}Vt!Iaj#AjFY0aaKSies5R@CX;|dK zZKgGIN=Lc{M%MOFU8SzOe0}y^q0EUh{fisnH}^!Jl@_UiBEt=cNb|6M z3M-)VxQMm2M6IcYv5A1_Nzj(s`zpbAzuXPXolpX{QVCHfzJ588E9h#a*zW z`@W?h2vfw}f8Pu$wudq^HqKqaZOzC$N}Nm%SmHvYEEHPT1(m(1tPOv)_vtF{Gly>@ z*PEj&z9PMJ^lyFW*A1_kNH>|=7|K6*`S?Mxya!yiH)*fwh%^*hz4IaCV(V2Oh?Wbx z&yFHaqyh&CDmRf=*xAxs^R9Hbb5uLZvA^+T>njyJtAAwXk@k-D1qM&l{cdoin;nf| z3MOesPWdyT-}W&j!3i&a-AP<0d=BM7l&?rRC4DaD>y778#5?CRN>{V=FClIjOh9(R z5et?;Mb5|^m6J2Oud(e!xlbvBsk-1sG4kILp!X89R-RiB^-(zptI4-o6Z5Rg4>F#h z-5vZbxO#nQHRMLDuGh`IVjg59R2jYi?nx^@Ne?>_kqvWcn!H_|!8tdzI(M_GYSc1g zb8F$V?8lpQQ&tL&aSRka(Q{O<&l2g4N1QxoMK@Gi5_g3}7w7$)JsJV&j?tYP zF$RnCIXtiXz3%gR-_QL#&-;gbHa^EV=5`#v{D$rC$v3L7_xC7oS!K=Ww>S3=alF#h zZomewy3%41D-5&o#TPu41szLB(oUnlNTyTzt7;t^yK;2n-q2jT8>0A0G$LMT^EXBR zJBZ1M{w`0Z_DKJizerTaM*D`E@rfD&Zf-|vqrJNoi$}X&0kUY(RZxs)MMMkVFu(<{ z+LLEZ>5%6&B{jj(08R3TnU$ok(d^wKLI7CSofvuV(c$rp588tDDA%r>=yU|ze$!p| z73Ae1_1X!8mmIgUw+OX?Vy~m2H>H;J5 z1ukt;r1GAAZD9e0D0A?EViK^<#S1i? zruEIJ+M-nbs>%I~>2OZmroa`Se#Q%fB7HN&vg>u9;;B7(uHjN~DOv7`hTiIn*m&By zT*yp)8odb*e=k%>H@`(Y;eL9_#)*jGg5eI+$ilQ~hr8r2kd3k&c`-j$Ehg^1jOwM34cXK1%;^-O}g!o9U^GL z*^^3IxmUdD>y*?WCHvK1zvSXi{efibkIHoD(zw38H`xwkRB24^*Z*lo3d~Xem1$SA ztN-{MoB|0qag*&2qUArbYs9~nIN5)%Zvek5AZ7no<@|R~KUBj2yjqb20AP|>+8foT zI=YJ8l1VMq7Fu6e^G$ti<4b!dqn^*y&cF6LrQ7d;jTHH! zIbMx~VpVNUn`nLZ&EV#n{Ta(`=n`B_MwN0RR(%;nm;^YG8%8^b8uO z=}O4)zHBl}$hNb7)yw5?_?qLx%{E5fnSB7h^8tGHtIXr^hw;?OF3tUYT4JaK7<(gU zRT+bc0H7^jK=`Yg=n|+c92gzn1d7Ic2~~5zX7DPYGm@kfdari;WVh#NU!2PRlY6bS zUcwrUVKGa5s;#e6pT+akr*;KT!{ZunD1ucR9g&Yl_lYMc<+~TD6c@wfef)g+m#08z zXa`^?_%YxCT0W9KAjQ5)PA&dtx7@ED0w%^ZjFZn=;K`lX8%l~4@*=csrj*N@)nhRy z4m~$f%D@ip!z0;*{ddLZ4PuGEOFgn^yW~kfW)W|r*^&7U z{!e=NpiI{tXVfXOI;Nv6-5MAL0!)g)Xk}#j%I8(YRq%=d8oJUG@nwDRt8LM}i*s}% z@NxE}9GAJyYW$J+BWu#SYVv70{M|lKhyr-VH``z|KcU#O-{#!F1XX=2lmLs?iw%li zO!Zo1+JjaDFxuMR)Ky#Xus_DP{TIP6(LYWC%a!BWFg}s^%)+TTFb>P8ur@aq*g)ck^_B@0n2I5v5F3#^F%Ly1UigxsJQXOhb1A*yq;s7 zI}V%(P6gdS41?_|!dZfsU4?4YB;@NpB!Z>MDbf($!H|=~Ti6$f^OulWQUa|h)(Rlm z!(+;vXPTMJ5Z_o%Y3Zk-4p?B3h}qmv6P;THxoRaSv$%Dmq6;w1VTk>$?!^pQLC47Q{gsAbxbma>k%79g(P{Od z4}KMxML=8T+KwVzE<^q2uRv3)Ym3;Uj9vfXKpVP-E{kPTXRe%ua-YThht{5jTk;_6 z=fY=Zhi!hHl4bCsS}(n%ps)|-IGbj_zN0y}pJ^zh=?3#b{an4Kyq`3*j)^cO=3ky87f_uazG5c9}Pe0&v zdIvy0*o1Z^;I4af5!s#tMX2l82muA`kx6Vzfe@?V{`BOTD%ZQa$%c$K{Q&+Rc0%MI z_q|?WxR9Ee#F^TLf~`x+edoTYSY$$KK$RccRP7tO9c zs_b&PbVn60Y9P>b5g0eFPSces9M?upt~31Rqfx)({W#tk+hlSZX>P_A6Wl7pr6R?< z7_sX2eEEOoQ-9-B|2+6FB-)>JEjtR}E<}lQtAMO6RnA2quyh@9gs2^7*Bl${H-T3^ zp@2yv>>P3O`YQ<31I(W+n{N?Q>DL6dn;3ahzjOMDH$vCe5m*CJ;}&MibO1e3s0Ckl zXC|h;B)(~rH|ovt4q#xFV}}CwiJaWilAd!w7N*RLgB^EKL4ZQ{ZCTn^Od?1*Wd#ynKIM4(+)1x?QI;$yy-kEk6CPxF!_ikitlrKGIj1LcSIXY9jwqzy@XB>QtE&0WURp!ILw=iQ zu_}6OsobgulIyD7@b}tSl#x&u0+9RlM-w;}@Q~x3y zW=$Ki(iA;x(qV(zxjuEv`^Hm-QWnPdd(XJPS3=K zFz41-w&L&7I}Fz+Vpf2$+4U*BRQBzd7d4}$E7SLkSy`PczqJsubt~oWhegRUGkdeQ zULgtdL7I9Y<`1#EN8F0vr4~)0;;y?FCgl-mNM}QNm8)9@dHraOtf|yD)gaPY6BDj= zJ+IDy2_cqn%l>Nf?=Fho@|Pw(0XBu8!qjP_znw@8>ur}pHCx-rTdz9o&1vt1#=gt6 zu1qFSv;qFC2Pqc$hW0;HG6Ehbu#G*B6Z92$?lcg5OfwMjFs_G$GQ!pxOZBsQ1Olpgr_N=05Ef^L98>(#42Dxmt@|Gh#eYv`!E z+oW+hTl<#_rau!ZU`O-mUzT$2D&*gy|7KMK0E-&-uIA=>IwNEo+i+h2SG*#1Iqdr# zl%lHYpdGzxiD-{!#rv~tj)`@&Z5!wY?X?|knz8M{f|K2<-b;C#w!A;?c#)R9MkVxk znCgQm0t`n$?Hu>KA9jviVUmQ!TYN-`W`9T;cHvrScBu?7Tsoxj*;Ear?J|1K5|)zH z#zn^9bhG}pd5L-UQ;H1Q>})k1QeI=;%>8b$PfJTaco?%VEZbtIqQN1-v_n3 znfk1@MGp=Yr~$!&f zHCb-W?OjspR!a zO~f*0{eDT=by>vKYJL5#eW}|_upkeZr}fu{nd(0w;CR2W`vi$v$b}-(LeCE zpG9OMfw5PzTl0fJmu75rY`j!2=o2Gd(bWKrMbXe(8Rl>4w7Mogux|775uMp>|Hp(i z1(d#2UzRBd*NrsSpzR4*lf|pxEw@o9Cy`NpA^ljSnJs6R1HfcG^+2HBfPe2o|M_u% z{!y;fi~QrY4AAxsEYQa*q@|pLPl2+O7Dk$FY0L2nzn2&c?MjV#XW3)R% z@VN=f?u(XtAa?{6>#MJ6K7G4>IQWU>9uivp5zT3=IhZf zV}BL1x?U|w%=7Xc5&?BaIj@5(QP2oyXUIOtt|pwh)BB3uZ|C}^#fMMyor~j(MO!Pf z%eQcb$3m{cM18y~R6cDEyBi7n2uy?+Pb0gCM4-RuobWgByfxrBx9V(63@j;W#DJ;q zG*5`r$PKN$&S>X@?71!eY7+4yKr0mGghGtMA zLmDxewCSAUZjdOyk4H#If9@7cufh1EOh$)*Mv45=D%G7htQSecLsB->!y#U^r2Lwy zLxkq8qr>U&5&!rvX=iQ9$6lVG*+sj3R<7y|D1BHtffJ*T-hf%Hq%6sPNl(`p|CVO# z^Jz^%hTqL#_)++;Q<96#ot<+>j3L&&cwmJTO`%njOhqMSCdlK-Ih5KxX?^;tAUsf| zM**Te1y6U!kq;c5fb;NN@$ziqovOI**?t$fUZ&p5e**!&HcqmawLcfS6yI%e2i@egH%R--PLmIVbI z@xdMQ5#9YkUL^qFWH>$)u^d^E=&82_=8_jBe;A|ppj}{KaxaAzQK|9wN7A{;E~_cg z;;)+!uQY!o*vUih68gI=z{#a$+p+*3XKrS-1!xeXAp86%oHkfsXV&a1Ow{k(ZuHV$ zB!N=+-HDnKk$oW!K+%H}>`|e)I~~qt>brAR9#{M-XppQHADo$4Jb&^ zK9Ib1^pGLYoGWMWh31Smfwe7z80{mY8Fjdaxw!NL;B|J#(F2P*7@EC)$w8h8-gxn8 zJsylM^!daO-rM_@x9}(yLcEpVwFey?j87LH89>%>;#H;`;ntxpXvVXe0-!DGSucz3 z8iTG`Ab zpZ09dpD@FhY3WTJf2vXcoE;*2P@>=!ZQ(dlAN=_)cVx_a(u4Cz%PYwIjhzMNCityc z3sf^K@}m{kEp;}t)p^GFV=L=;Q><{H8r!uO@XoWltpio z$@Lt`IN}6RZv3RgRJM)9^mp3!_s%JU-*KT_PisqkiQ9LhPFvYU&Ddes>kDUXLo0>j zhcl_dYz2j%rX(;M;D&Tj!3`$pa^KAm$~(3kXE<%V)I@-ymBp&i^@)T0(N!OjyK!pZ zM2+>g6t7@jfnOe9s>nKlvJ8EDUDjL}oX{R4?XYHM(*q|XevzXB*5ns8!uy8st>V_;i7UBzHF+pM@ zv{CEX#c_{gy_{K_jP>=iRc?@mc!eDwXS>5;a*yWPT5eCcRDQ*ds_qM=`MR#vjlF!- zL8eyM&t|D~tUw(`p18>x5}Fa$!sDn)2DTWh?iXBRiV@Bu({K@HnsfbF(LDR$(sN!1 z;gy)ocz)$h|3=?e+d;R7#dfW@ewrH1&8b*69p7@y4_mXPtWIQPezqxasg3Q(!&iv? zbjtW~>0;VhZF5Bfwni>WT@vJV24x?0b5@c+GSK?@C2e=fdjdHe#BN9AcHE7lHJPjt zG?ul49qoBM6yNqv{HpX`gQT0(<$7xod)p-;BJ0e&eM9zFLP41_hO+#g&tSM=*>kOM z8owez@t>9VbHfq?Vl`jtiD9F6sV8ZcX)aaIl;zbh$qMU>>3;0He){P}k3W4{Qp1w@ zJFV@7$1KlF++jZ8ry(l~1{s4M#!1{I4@j>qcps8*-cjGM;_{FxY8HGfBTqQNOBkGb zi^shT6L5GH1GQf$o-$2q*%@6pa`O`>o73J|APrSRr6Qt~3Ib&{sdXsSAI3%5I^EXa zlICzoXex~fDZRu+jf>dJSsl>SsU4T2Et;1@Zx5GE#K^wsVcM?%;c`>&c=hf_qa@L# z9ZESbs!_xQTOnkrm$zi?NMDL3-J>7WEw-u2TB;VetztL1Hn$)%w#(gR0EYRH#nG$6 zkq1UMH`8%170SgvaF-(2@)k#*<}<+(%5s5|7SPxQeCQBry4;tl!Q0-?tNv8stahWO z^k8j$qS3B-LeQ{zDDYdf;3Bx>+21$=0BcZLZ9u@}B2EAbFk{tgKS_WO4EirVFo2RS z`L(O@r<7a$vjxeC``a#I_s`?3B&j=QUht zqAR{2oJRnZP(%bR;dwqVe^L4nkiY@$m5n}uTxiS71EPcLzFfrplAPWc=w3~fal^F( z)gFTMd{E-xB2GvL{ON7Rgz^H2@(M-VG7)fU6v6xV1C9v|>@WIuWK#kQk&kP-k)?f? zt~ZC0w(WMA2XNon;Q%KP3+vbM9FsGM?#3c>n%T6T(-t-2D)~%r;HceN{&;|S1gQ?N z>zFGBXdRL`oo?_69k8*uq>P<cc@YS(xVqme*EpA%kY>sznqZA^bU^1QlWS|Kc#* zWz6kwOXkY{E9XHv#oeC|YD<#NC%Y5OC)YPJ4AOif?XBI@tcavPO6+Zl{q(-C%tZ^6 zeV2lbUWx{@JON-WL4R`;7R&xNblClaaRIX7<*85jCs_7;pD(X~TCJ+xD0YDnZF1*R zjUdTQ8&}ogK$IW-6ztVQvnvB)$=XM(e%=0a4$%pLVQm`5+hTPZxsI7pB!1b+rYn+sLGn4 zXU%o8v)TNY%V9R+Tk$x@c)C!4yxAwtX*7dAbn`-M=}s zy#M6$eVfPa^nLW_C+F`OIKX)RwF}3{ydz8{B;FouP3 zGsLqzXWPMO&?QIAJ^tz@f)v-?Y}AeE*RBCdLyacDcfxa#VfYt^Bt*}8DZ!6chcv@N zl#5sgfx?Z`I!oqt2AG=Kz;0soV0r$?3 zzNe|inBwT6c+45UvxO`7@84Hc;uxyfyq8!?01X(@9zaR`UkBDWKbkTcJrwhwK)ME! zrHxh;%cNSI(?72$i!Jfjv=*^)ag>EP&Z(W7tcugPcVZ+IOedPuVcTw3fV;v{!2(kc z_0defqEON+x)fZ^_e+Y5pSKvbP~cl)|8QaF#@ti4(HF^WWD9n|X-W{G%(tfRYAU;z zrhm1`{hY@BTsWXA$sx0sDQvW+tf`&iSm#tyI6Abx^DBaa+rV4@5?~oFC;Ck?;>73V z++|>Vp9?MtI7e;_-H+pny@h@1?IdCm{CaF-gNUeTRM zWKDbC((|QA_jeP5k;$UtAS;tj5dA4DrB%8z>L8*JRHN+cR{Numv%y3E6+4TPo;KH8 z{Rg2N`@soUYU&G%@dk@#f03jjdVQfno5HEWce^s**%vY; zbE#bgJ}i^F&){fbSh;w1wt0PB{li(`pGur*Qb}6g-@Uw3mARiVbB(365pSy*$GL2F z(*xgAY2w`6(3LM6CcUCXmI+iZN;q1}>dxclT$bE8fq`w59|zw(6fr(S*DKkOUGU9- z6S^teipeIizY*}*h|DCX&EAGzp-VgxTb8%-x$KI#vQHo(@Vb*lQEP$HL7+NFpHNv+wT818nYbN zh<%HVmfiP%1%HIR*Pp+ow1d>9e}AN6qj1~YJ*1vgdd>2SJ8HCjfrdwCMK*GEyj;i} z=iL2iWV`c4V`hg3TWPqwg5cFb1=?lt9AES`b^Wou+073pLW*hrF_G(@bzyn-pG5ax z^E~f<(ydDrQ%2LRP(kkvwJ&hMkF$}7UPkq5Be#%-_iP`MX!7XkK!U9ys5<|5>wpl$ScFzR~FGH$f+ zY@@Dm){U&(O_u|wbn7uXW51uFxim9~{$%m0m672Aj}O@-eG+74ee=vIC9Mo^R9)Tp zQ=PLK$mw(7yx2t`?fz;mf==ZlE+|VRh8o1>CyYB0Mh3Gv5$0njUzeIm&2Xl9ZDj5{GO?pQYk4N74$@(|=hFHt9)=WC2UBTJaaMS#@#@#&3D>c% zof&9nu-^DV*+~ivDW1vVk;FZdtk-Y^vdfT!2&j^l(1d*oldJ*H!rP4GQ$33ug6PrW znLixTGTunQVVYHrIW@-O15La4&s1F*+@8ZO+gqi0-RNcu6WrMrJgUHYTc0(~oL1HT z4*O^wg|t{MSZrgzUw&b4?TBe;*}{B$9>*j#F7W-5E;R{-g+@h=@;>*9!m7xvZ37Ml zmY@Wy6)=O-2w=jdtRNyuyX09%3n!g~ z%Phn6d0$NyT)D<*DX*<+uIx6`6ZB%l1n0QG33U$@%rT}*>>e%47XY($|z$k#TsMbJ^7 z<6g}2V%NZlF+I#5Iq%cRuPAmkH+8j?dhD8-T-UDk&Un-mt=ECBzL+n~&kLzh8~ zefAKdsipJLMMuP1Cw3cvy;p>>Q~VM@i6K^?tXWaOX=CHNT2%0A%X7|($~HcR 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/docs/exosphere/dashboard.md b/docs/docs/exosphere/dashboard.md index f2a840ce..36f2c4ff 100644 --- a/docs/docs/exosphere/dashboard.md +++ b/docs/docs/exosphere/dashboard.md @@ -1,189 +1,173 @@ # Exosphere Dashboard -The Exosphere dashboard provides a comprehensive web interface for monitoring, debugging, and managing your workflows. This guide shows you how to access and use the dashboard effectively. +The Exosphere dashboard provides a comprehensive web interface for monitoring, debugging, and managing your workflows. This guide shows you how to set up and use the dashboard effectively. ## Dashboard Overview -The Exosphere dashboard is a separate frontend application that connects to your state manager backend and provides: +The Exosphere dashboard is a modern web application that connects to your state manager backend and provides: - **Real-time monitoring** of workflow execution - **Visual graph representation** of your workflows - **State management** and debugging tools - **Performance metrics** and analytics - **Error tracking** and resolution +- **Graph template management** and validation -## Running the Dashboard +## Setup Guide -There are currently two ways to run the Exosphere dashboard frontend: +### Prerequisites -### Option 1: Docker Container (Recommended) +Before setting up the dashboard, ensure you have: +- A running Exosphere state manager (see [State Manager Setup](./state-manager-setup.md)) +- Your API key and namespace from the state manager +- Docker (for containerized deployment) -The easiest way to run the dashboard is using the pre-built Docker container: +=== "Docker (Recommended)" -```bash -docker run -p 3000:3000 ghcr.io/exospherehost/exosphere-dashboard:latest -``` + The easiest way to run the dashboard is using the pre-built Docker container. This approach ensures consistent environments and minimal setup. -This will start the dashboard and make it available at: -- **Local**: http://localhost:3000 -- **Network**: http://0.0.0.0:3000 + #### Prerequisites -The container will automatically start and be ready in a few seconds. + - Docker installed -### Option 2: Local Development + #### Setup Steps -For development or customization, you can run the dashboard locally: + 1. **Pull the latest dashboard image and run**: + ```bash + # Pull the latest dashboard image + docker pull ghcr.io/exospherehost/exosphere-dashboard:latest -```bash -# Clone the state-manager-frontend repository -git clone -cd state-manager-frontend + # Run the dashboard container + docker run -d \ + --name exosphere-dashboard \ + -p 3000:3000 \ + -e NEXT_PUBLIC_STATE_MANAGER_URL="http://localhost:8000" \ + -e NEXT_PUBLIC_API_KEY="your-api-key" \ + -e NEXT_PUBLIC_NAMESPACE="your-namespace" \ + ghcr.io/exospherehost/exosphere-dashboard:latest + ``` -# Install dependencies -npm install + 2. **Verify the service is running**: + ```bash + # Check container status + docker ps + + # Check logs + docker logs exosphere-dashboard + + # Test the dashboard + curl http://localhost:3000 + ``` -# Set up environment variables -cp .env.example .env -# Edit .env with your configuration + The dashboard will be available at `http://localhost:3000` -# Start the development server -npm run dev -``` + #### Required Environment Variables -The dashboard will be available at `http://localhost:3000` + | Variable | Description | Required | Default | + |----------|-------------|----------|---------| + | `NEXT_PUBLIC_STATE_MANAGER_URL` | State manager API endpoint | Yes | - | + | `NEXT_PUBLIC_API_KEY` | API key for authentication | Yes | - | + | `NEXT_PUBLIC_NAMESPACE` | Default namespace | Yes | - | + +=== "Local Development" -### Option 3: Web Portal (Coming Soon) + For development or customization, you can run the dashboard locally using the source code. -A third option will be available soon - a hosted web portal where you can view your running states in production without needing to run anything locally. + #### Prerequisites -## Dashboard Features + - Node.js 18 or higher + - npm or yarn package manager + - Git -The Exosphere dashboard provides the following key features: + #### Setup Steps -### 1. Graph Templates Management + 1. **Clone the repository**: + ```bash + git clone https://github.com/exospherehost/exospherehost.git + cd exospherehost/dashboard + ``` -- **View all graph templates** in your namespace -- **Visual graph representation** with node connections -- **Graph validation** and status checking -- **Template editing** capabilities + 2. **Install dependencies**: + ```bash + npm install + ``` -### 2. Registered Nodes Monitoring + 3. **Set up environment variables**: + ```bash + cp .env.example .env + # Edit .env with your configuration + ``` -- **List all registered nodes** in your namespace -- **Node health status** and availability -- **Node schemas** (inputs, outputs, secrets) -- **Node performance** metrics + 4. **Start the development server**: + ```bash + npm run dev + ``` -### 3. Execution Monitoring + The dashboard will be available at `http://localhost:3000` -- **Real-time workflow execution** tracking -- **State transitions** visualization -- **Execution progress** indicators -- **Run history** and status + #### Environment Variables -### 4. State Management + Create a `.env` file in the dashboard directory with these variables: -- **Current states** for active runs -- **State history** for completed runs -- **Error details** and debugging information -- **State retry** capabilities + ```bash + # State manager API endpoint + NEXT_PUBLIC_STATE_MANAGER_URL=http://localhost:8000 -### 5. API Integration + # API key for authentication + NEXT_PUBLIC_API_KEY=your-api-key -- **REST API endpoints** for programmatic access -- **Authentication** via API keys -- **Real-time updates** via WebSocket connections + # Default namespace + NEXT_PUBLIC_NAMESPACE=your-namespace + ``` -## Connecting to Your State Manager +## Dashboard Interface -The dashboard connects to your state manager backend. Make sure your state manager is running and accessible: +The Exosphere dashboard features a clean, modern interface with three main sections accessible via the navigation tabs at the top. -> **Note**: For detailed setup instructions, see **[State Manager Setup](./state-manager-setup.md)**. +![Namespace Overview](../assets/DashboardSS-1.png) -### Local State Manager +View registered nodes, and graph templates on a namespace -```bash -# Start the state manager -cd state-manager -python run.py -``` +![Runs Overview](../assets/DashboardSS-2.png) -The state manager will be available at `http://localhost:8000` - -### Production State Manager - -In production, your state manager is typically available at: -`https://your-state-manager.exosphere.host` - -## Configuration - -### Environment Variables - -Configure the dashboard by setting these environment variables: - -```bash -# State manager API endpoint -NEXT_PUBLIC_STATE_MANAGER_URL=http://localhost:8000 - -# API key for authentication -NEXT_PUBLIC_API_KEY=your-api-key - -# Namespace -NEXT_PUBLIC_NAMESPACE=your-namespace - -# Other configuration options -NEXT_PUBLIC_REFRESH_INTERVAL=5000 -NEXT_PUBLIC_ENABLE_WEBSOCKET=true -``` - -### API Key Authentication - -The dashboard uses the same API key authentication as the state manager: - -```bash -# Set your API key -export EXOSPHERE_KEY="your-api-key" -``` +![Runs Overview](../assets/DashboardSS-3.jpg) +View graph runs and debug each node that was created. ## Using the Dashboard -### Viewing Graph Templates +1. **Configure Connection**: + + - Set your namespace in the header + - Enter your API key + - Ensure your state manager is running + +2. **Explore Overview**: -1. Navigate to the **Graphs** section -2. Select a graph template to view its details -3. The visual representation shows: - - Nodes as connected boxes - - Data flow direction with arrows - - Triggers as entry points - - Node relationships and dependencies + - Review registered nodes and their capabilities + - Check graph template status and validation + - Monitor namespace statistics -### Monitoring Execution +3. **Manage Templates**: -1. Go to the **Executions** section -2. Find your active run by run ID or search criteria -3. View the execution status: - - **Pending**: States waiting to be executed - - **Running**: Currently executing states - - **Completed**: Successfully executed states - - **Failed**: States that encountered errors + - View existing graph templates + - Create new templates using the builder + - Validate template configurations -### Debugging Failed Executions +4. **Monitor Execution**: -1. Identify failed states in the execution view -2. Click on a failed state to view details: - - **Error message** and stack trace - - **Input data** that caused the failure - - **Node configuration** and secrets used - - **Execution logs** and timestamps + - Select specific run IDs to track + - View real-time execution progress + - Debug failed states and errors -3. Use the debugging tools: - - **Retry state** with the same inputs - - **Modify inputs** and retry - - **View related states** in the workflow +### Support +For additional help: +- Check the [State Manager Setup](./state-manager-setup.md) guide +- Review [Concepts](./concepts.md) for workflow understanding +- See [Examples](./examples.md) for usage patterns ## Next Steps -- **[Examples](./examples.md)** - See real-world dashboard usage examples +- **[Examples](./examples.md)** - See real-world usage examples - **[Concepts](./concepts.md)** - Learn about fanout, units, inputs, outputs, and secrets -- **[API Reference](./api-reference.md)** - Complete API documentation +- **[State Manager Setup](./state-manager-setup.md)** - Complete backend setup guide diff --git a/docs/docs/exosphere/getting-started.md b/docs/docs/exosphere/getting-started.md index 4bff078f..2e7b6fda 100644 --- a/docs/docs/exosphere/getting-started.md +++ b/docs/docs/exosphere/getting-started.md @@ -2,8 +2,6 @@ ## Installation -### Quick Install - ```bash uv add exospherehost ``` @@ -24,6 +22,7 @@ Set up your environment variables for authentication: export EXOSPHERE_KEY="your-api-key" ``` +Refer: [Getting State Manager URI](./state-manager-setup.md) ## Overview @@ -35,7 +34,7 @@ Nodes are the building blocks of your workflows. Each node: - Defines input/output schemas using Pydantic models - Implements an `execute` method for processing logic -- Can be connected to other nodes to form workflows +- Can be connected to other nodes to form **workflows** - Automatically handles state persistence ### 2. Runtime diff --git a/docs/docs/exosphere/state-manager-setup.md b/docs/docs/exosphere/state-manager-setup.md index 882441c2..67df630e 100644 --- a/docs/docs/exosphere/state-manager-setup.md +++ b/docs/docs/exosphere/state-manager-setup.md @@ -6,262 +6,205 @@ This guide provides step-by-step instructions for setting up the Exosphere state The Exosphere state manager is the core backend service that handles workflow execution, state management, and coordination between nodes. It provides a REST API for managing graph templates, registered nodes, and workflow execution states. -## Local Setup Options +## Local Setup -### Option 1: Docker Container (Recommended) +=== "Docker (Recommended)" -The easiest way to run the state manager locally is using Docker. This approach ensures consistent environments and minimal setup. + The easiest way to run the state manager locally is using Docker. This approach ensures consistent environments and minimal setup. -#### Prerequisites + ### Prerequisites -- Docker and Docker Compose installed -- Git (to clone the repository) + - Docker installed -#### Setup Steps + ### Setup Steps + + 1. **Pull the public image and run**: + ```bash + docker run -d \ + --name exosphere-state-manager \ + -p 8000:8000 \ + -e MONGODB_URI="mongodb://localhost:27017/exosphere" \ + -e DATABASE_NAME="exosphere" \ + -e API_KEY="your-secret-api-key" \ + -e NAMESPACE="your-namespace" \ + -e ENCRYPTION_KEY="your-32-character-encryption-key" \ + ghcr.io/exospherehost/state-manager:latest + ``` -1. **Clone the repository** (if you haven't already): - ```bash - git clone https://github.com/exospherehost/exospherehost.git - cd exospherehost - ``` - -2. **Navigate to the state-manager directory**: - ```bash - cd state-manager - ``` - -3. **Create environment configuration**: - ```bash - # Create .env file - cp .env.example .env - # Edit .env with your configuration - ``` - -4. **Start the state manager**: - ```bash - docker-compose up -d - ``` - -5. **Verify the service is running**: - ```bash - # Check container status - docker-compose ps - - # Check logs - docker-compose logs -f api-server - - # Test the API - curl http://localhost:8000/health - ``` - -The state manager will be available at: -- **API**: http://localhost:8000 -- **Health Check**: http://localhost:8000/health -- **API Documentation**: http://localhost:8000/docs - -#### Configuration Options - -Edit the `.env` file to configure your environment: - -```bash -# Database configuration -MONGODB_URI=mongodb://localhost:27017/exosphere -DATABASE_NAME=exosphere - -# API configuration -API_KEY=your-secret-api-key -NAMESPACE=your-namespace - -# Logging -LOG_LEVEL=INFO - -# Security -ENCRYPTION_KEY=your-32-character-encryption-key -``` - -### Option 2: Local Development with exospherehost - -For development or when you need more control over the environment, you can run the state manager locally using the exospherehost Python package. - -#### Prerequisites - -- Python 3.12 or higher -- uv package manager (recommended) or pip -- MongoDB (local or cloud instance) - -#### Setup Steps - -1. **Install uv** (if not already installed): - ```bash - curl -LsSf https://astral.sh/uv/install.sh | sh - ``` - -2. **Navigate to the state-manager directory**: - ```bash - cd state-manager - ``` - -3. **Install dependencies**: - ```bash - uv sync - ``` - -4. **Set up environment variables**: - ```bash - export MONGODB_URI="mongodb://localhost:27017/exosphere" - export DATABASE_NAME="exosphere" - export API_KEY="your-secret-api-key" - export NAMESPACE="your-namespace" - export ENCRYPTION_KEY="your-32-character-encryption-key" - ``` - -5. **Start MongoDB** (if running locally): - ```bash - # Using Docker - docker run -d -p 27017:27017 --name mongodb mongo:latest - - # Or using your system's package manager - # Ubuntu/Debian: sudo systemctl start mongod - # macOS: brew services start mongodb-community - ``` - -6. **Run the state manager**: - ```bash - # Development mode (with auto-reload) - uv run run.py --mode development - - # Production mode - uv run run.py --mode production --workers 4 - ``` - -The state manager will be available at `http://localhost:8000` - -## Production Setup Options - -### Option 1: Exosphere API/Key (Recommended) - -For production workloads, we recommend using the hosted Exosphere platform. This provides: - -- **Managed infrastructure** with high availability -- **Automatic scaling** based on workload -- **Built-in monitoring** and alerting -- **Global edge locations** for low latency -- **Enterprise-grade security** and compliance - -#### Getting Started - -1. **Contact us for private preview access**: - - Email: [contact@exosphere.host](mailto:contact@exosphere.host) - - Discord: [Join our community](https://discord.gg/exosphere) - - GitHub: [Open an issue](https://github.com/exospherehost/exospherehost/issues) - -2. **Receive your credentials**: - - API endpoint URL - - API key for authentication - - Namespace configuration - -3. **Configure your environment**: - ```bash - export EXOSPHERE_STATE_MANAGER_URI="https://api.exosphere.host" - export EXOSPHERE_API_KEY="your-production-api-key" - export EXOSPHERE_NAMESPACE="your-namespace" - ``` - -4. **Update your application configuration**: - ```python - from exospherehost import Runtime - - Runtime( - namespace="your-namespace", - name="YourWorkflow", - nodes=[YourNodes], - state_manager_uri="https://api.exosphere.host", - api_key="your-production-api-key" - ).start() - ``` - -### Option 2: Self-Hosted Deployment - -For organizations that need complete control over their infrastructure, you can deploy the state manager on your own infrastructure. - -#### Prerequisites - -- Kubernetes cluster (recommended) or Docker Swarm -- MongoDB cluster (Atlas, DocumentDB, or self-hosted) -- Load balancer and ingress controller -- SSL certificates for HTTPS - -#### Kubernetes Deployment - -1. **Create namespace**: - ```bash - kubectl create namespace exosphere - ``` - -2. **Create ConfigMap for configuration**: - ```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: state-manager-config - namespace: exosphere - data: - MONGODB_URI: "mongodb://your-mongodb-cluster:27017/exosphere" - DATABASE_NAME: "exosphere" - NAMESPACE: "your-namespace" - LOG_LEVEL: "INFO" - ``` - -3. **Create Secret for sensitive data**: - ```yaml - apiVersion: v1 - kind: Secret - metadata: - name: state-manager-secrets - namespace: exosphere - type: Opaque - data: - API_KEY: - ENCRYPTION_KEY: - ``` - -4. **Deploy the state manager**: - ```bash - kubectl apply -f k8s/state-manager-deployment.yaml - kubectl apply -f k8s/state-manager-service.yaml - kubectl apply -f k8s/state-manager-ingress.yaml - ``` - -#### Docker Swarm Deployment - -1. **Create a Docker Compose file for production**: - ```yaml - version: '3.8' - - services: - state-manager: - image: ghcr.io/exospherehost/state-manager:latest - ports: - - "8000:8000" - environment: - - MONGODB_URI=mongodb://your-mongodb-cluster:27017/exosphere - - DATABASE_NAME=exosphere - - API_KEY=${API_KEY} - - NAMESPACE=${NAMESPACE} - - ENCRYPTION_KEY=${ENCRYPTION_KEY} - deploy: - replicas: 3 - update_config: - parallelism: 1 - delay: 10s - restart_policy: - condition: on-failure - ``` - -2. **Deploy to swarm**: - ```bash - docker stack deploy -c docker-compose.prod.yml exosphere - ``` + 2. **Verify the service is running**: + ```bash + # Check container status + docker ps + + # Check logs + docker logs exosphere-state-manager + + # Test the API + curl http://localhost:8000/health + ``` + + The state manager will be available at `http://localhost:8000` + + ### Required Environment Variables + + | Variable | Description | Required | + |----------|-------------|----------| + | `MONGODB_URI` | MongoDB connection string | Yes | + | `DATABASE_NAME` | Database name | Yes | + | `API_KEY` | Secret API key for authentication | Yes | + | `NAMESPACE` | Default namespace for operations | Yes | + | `ENCRYPTION_KEY` | 32-character key for data encryption | Yes | + +=== "Local Development" + + For development or when you need more control over the environment, you can run the state manager locally using the source code. + + ### Prerequisites + + - Python 3.12 or higher + - uv package manager + - Git + + ### Setup Steps + + 1. **Clone the repository**: + ```bash + git clone https://github.com/exospherehost/exospherehost.git + cd exospherehost/state-manager + ``` + + 2. **Install dependencies**: + ```bash + uv sync + ``` + + 3. **Set up environment variables**: + ```bash + export MONGODB_URI="mongodb://localhost:27017/exosphere" + export DATABASE_NAME="exosphere" + export API_KEY="your-secret-api-key" + export NAMESPACE="your-namespace" + export ENCRYPTION_KEY="your-32-character-encryption-key" + ``` + + 4. **Run the state manager**: + ```bash + uv run run.py --mode=development + ``` + + The state manager will be available at `http://localhost:8000` + +## Production Setup + +=== "Exosphere Hosted Platform" + + For production workloads, we recommend using the hosted Exosphere platform. This provides managed infrastructure with high availability, automatic scaling, and enterprise-grade security. + + ### Getting Started + + 1. **Get your credentials from the Exosphere dashboard**: + - State manager URL + - API key for authentication + - Namespace configuration + + 2. **Contact us for setup assistance**: + - Email: [nivedit@exosphere.host](mailto:nivedit@exosphere.host) + + 3. **Configure your application**: + ```python + from exospherehost import Runtime + + Runtime( + namespace="your-namespace", + name="YourWorkflow", + nodes=[YourNodes], + state_manager_uri="https://api.exosphere.host", + api_key="your-production-api-key" + ).start() + ``` + +=== "Self-Hosted Deployment" + + For organizations that need complete control over their infrastructure, you can deploy the state manager on your own infrastructure. + + ### Prerequisites + + - Kubernetes cluster (recommended) or Docker Swarm + - MongoDB cluster (Atlas, DocumentDB, or self-hosted) + - Load balancer and ingress controller + - SSL certificates for HTTPS + + ### Docker Deployment + + 1. **Create a Docker Compose file for production**: + ```yaml + version: '3.8' + + services: + state-manager: + image: ghcr.io/exospherehost/state-manager:latest + ports: + - "8000:8000" + environment: + - MONGODB_URI=mongodb://your-mongodb-cluster:27017/exosphere + - DATABASE_NAME=exosphere + - API_KEY=${API_KEY} + - NAMESPACE=${NAMESPACE} + - ENCRYPTION_KEY=${ENCRYPTION_KEY} + deploy: + replicas: 3 + update_config: + parallelism: 1 + delay: 10s + restart_policy: + condition: on-failure + ``` + + 2. **Deploy to your infrastructure**: + ```bash + docker-compose -f docker-compose.prod.yml up -d + ``` + + ### Kubernetes Deployment + + 1. **Create namespace**: + ```bash + kubectl create namespace exosphere + ``` + + 2. **Create ConfigMap for configuration**: + ```yaml + apiVersion: v1 + kind: ConfigMap + metadata: + name: state-manager-config + namespace: exosphere + data: + MONGODB_URI: "mongodb://your-mongodb-cluster:27017/exosphere" + DATABASE_NAME: "exosphere" + NAMESPACE: "your-namespace" + LOG_LEVEL: "INFO" + ``` + + 3. **Create Secret for sensitive data**: + ```yaml + apiVersion: v1 + kind: Secret + metadata: + name: state-manager-secrets + namespace: exosphere + type: Opaque + data: + API_KEY: + ENCRYPTION_KEY: + ``` + + 4. **Deploy the state manager**: + ```bash + kubectl apply -f k8s/state-manager-deployment.yaml + kubectl apply -f k8s/state-manager-service.yaml + kubectl apply -f k8s/state-manager-ingress.yaml + ``` ## Configuration Reference @@ -279,28 +222,6 @@ For organizations that need complete control over their infrastructure, you can | `HOST` | Host to bind to | No | `0.0.0.0` | | `PORT` | Port to bind to | No | `8000` | -### Security Considerations - -1. **API Key Management**: - - Use strong, randomly generated API keys - - Rotate keys regularly - - Store keys securely (environment variables, secrets management) - -2. **Database Security**: - - Use MongoDB authentication - - Enable SSL/TLS for database connections - - Restrict network access to database - -3. **Network Security**: - - Use HTTPS in production - - Implement proper firewall rules - - Consider using a reverse proxy (nginx, traefik) - -4. **Encryption**: - - Use a strong 32-character encryption key - - Store encryption keys securely - - Never commit keys to version control - ## Monitoring and Health Checks ### Health Check Endpoint @@ -320,45 +241,6 @@ Response: } ``` -### Logging - -The state manager uses structured logging with the following levels: -- `DEBUG`: Detailed debugging information -- `INFO`: General operational information -- `WARNING`: Warning messages -- `ERROR`: Error messages - -### Metrics - -Consider implementing monitoring with: -- Prometheus for metrics collection -- Grafana for visualization -- AlertManager for alerting - -## Troubleshooting - -### Common Issues - -1. **Connection refused to MongoDB**: - - Verify MongoDB is running - - Check connection string format - - Ensure network connectivity - -2. **API key authentication failed**: - - Verify API key is correct - - Check environment variable is set - - Ensure key has proper permissions - -3. **Encryption key errors**: - - Verify encryption key is exactly 32 characters - - Check for special characters in the key - - Ensure key is properly encoded - -4. **Port already in use**: - - Check if another service is using port 8000 - - Change the port in configuration - - Stop conflicting services - ### Getting Help - **Documentation**: [docs.exosphere.host](https://docs.exosphere.host) diff --git a/docs/docs/stylesheets/extra.css b/docs/docs/stylesheets/extra.css index 41df7719..5c87eecb 100644 --- a/docs/docs/stylesheets/extra.css +++ b/docs/docs/stylesheets/extra.css @@ -18,7 +18,7 @@ --md-typeset-a-color: #daf5ff; --md-code-fg-color: #daf5ff; - --md-code-bg-color: #101219; + --md-code-bg-color: #263048; --md-code-hl-color: #66d1b5; diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index aa2b8d1e..dfa09688 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -100,15 +100,15 @@ plugins: - exosphere/index.md - exosphere/getting-started.md - exosphere/state-manager-setup.md - - exosphere/create-runtime.md - exosphere/register-node.md - - exosphere/examples/node-examples/index.md - - exosphere/examples/node-examples/basic-nodes.md + - exosphere/create-runtime.md - exosphere/create-graph.md - exosphere/trigger-graph.md - exosphere/dashboard.md + - exosphere/concepts.md - exosphere/examples.md - - exosphere/concepts.md + - exosphere/examples/node-examples/index.md + - exosphere/examples/node-examples/basic-nodes.md markdown_extensions: @@ -119,6 +119,8 @@ markdown_extensions: - pymdownx.inlinehilite - pymdownx.snippets - pymdownx.superfences + - admonition + - pymdownx.details - pymdownx.tabbed: alternate_style: true @@ -129,11 +131,11 @@ nav: - Introduction: exosphere/index.md - Getting Started: exosphere/getting-started.md - State Manager Setup: exosphere/state-manager-setup.md - - Concepts: exosphere/concepts.md + - Register Node: exosphere/register-node.md - Create Runtime: exosphere/create-runtime.md - - Register Node: exosphere/register-node.md - Create Graph: exosphere/create-graph.md - Trigger Graph: exosphere/trigger-graph.md + - Concepts: exosphere/concepts.md - Dashboard: exosphere/dashboard.md - Examples: - Overview: exosphere/examples.md From 73896e43eb452b71347c967b0c89b18651a8dc14 Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 20:04:49 +0530 Subject: [PATCH 03/15] docs --- docs/docs/exosphere/architecture.md | 150 ++++ docs/docs/exosphere/concepts.md | 583 ------------- docs/docs/exosphere/examples.md | 765 ------------------ .../examples/node-examples/basic-nodes.md | 192 ----- .../exosphere/examples/node-examples/index.md | 38 - docs/docs/exosphere/index.md | 6 +- docs/mkdocs.yml | 20 +- 7 files changed, 159 insertions(+), 1595 deletions(-) create mode 100644 docs/docs/exosphere/architecture.md delete mode 100644 docs/docs/exosphere/concepts.md delete mode 100644 docs/docs/exosphere/examples.md delete mode 100644 docs/docs/exosphere/examples/node-examples/basic-nodes.md delete mode 100644 docs/docs/exosphere/examples/node-examples/index.md diff --git a/docs/docs/exosphere/architecture.md b/docs/docs/exosphere/architecture.md new file mode 100644 index 00000000..5239ddbb --- /dev/null +++ b/docs/docs/exosphere/architecture.md @@ -0,0 +1,150 @@ +# Exosphere Architecture + +This document provides a comprehensive overview of Exosphere's top-level architecture, focusing on state execution, fanout mechanisms, and the unites keyword for stage unification. + +## Overview + +Exosphere is built around a **state-based execution model** where workflows are composed of discrete states that can be executed independently. The architecture consists of several key components: + +- **State Manager**: Central orchestrator that manages state lifecycle and transitions +- **Runtimes**: Distributed execution engines that process individual states +- **Graph Templates**: Declarative workflow definitions +- **States**: Individual execution units with inputs, outputs, and metadata + +## State Execution Model + +### State Lifecycle + +Each state in Exosphere follows a well-defined lifecycle: + +``` +CREATED → QUEUED → EXECUTING → EXECUTED/ERRORED → SUCCESS +``` + +1. **CREATED**: State is initialized with inputs and dependencies +2. **QUEUED**: State is ready for execution and waiting for a runtime +3. **EXECUTING**: State is currently being processed by a runtime +4. **EXECUTED**: State completed successfully with outputs +5. **ERRORED**: State failed during execution +6. **SUCCESS**: State and all its dependencies are complete + + +## Fanout Mechanism + +### Single vs Multiple Outputs + +Exosphere supports two execution patterns: + +1. **Single Output**: A state produces one output and continues to the next stage +2. **Multiple Outputs (Fanout)**: A state produces multiple outputs, creating parallel execution paths + + +### Fanout Example + +Consider a data processing workflow: + +```python hl_lines="9-11" +class DataSplitterNode(BaseNode): + async def execute(self) -> list[Outputs]: + data = json.loads(self.inputs.data) + chunk_size = 100 + + outputs = [] + for i in range(0, len(data), chunk_size): + chunk = data[i:i + chunk_size] + outputs.append(self.Outputs( + chunk=json.dumps(chunk) + )) + + return outputs # This creates fanout on each output +``` + +When this node executes: +1. **Original state** gets the first chunk as output +2. **Additional states** are created for each remaining chunk +3. **All states** are marked as EXECUTED +4. **Next stages** are created for each state independently + +**This enables parallel processing of data chunks across multiple runtime instances.** + +## Unites Keyword + +### Purpose + +The `unites` keyword is a powerful mechanism for **synchronizing parallel execution paths**. It allows a node to wait for multiple parallel states to complete before executing. + +### Unites Logic + +When a node has a `unites` configuration: + +1. **Execution is deferred** until all states with the specified identifier are complete +2. **State fingerprinting** ensures only one unites state is created per unique combination +3. **Dependency validation** ensures the unites node depends on the specified identifier + +### Unites Example + +```json hl_lines="22-24" +{ + "nodes": [ + { + "node_name": "DataSplitterNode", + "identifier": "data_splitter", + "next_nodes": ["processor_1"] + }, + { + "node_name": "DataProcessorNode", + "identifier": "processor_1", + "inputs":{ + "x":"${{data_splitter.outputs.data_chunk}}" + } + "next_nodes": ["result_merger"] + }, + { + "node_name": "ResultMergerNode", + "identifier": "result_merger", + "inputs":{ + "x_processed":"${{processor_1.outputs.processed_data}}" + } + "unites": { + "identifier": "data_splitter" + }, + "next_nodes": [] + } + ] +} +``` + +In this example: +1. `data_splitter` creates fanout with 3 outputs +2. `processor_1` executes in parallel for all three data chunks +3. `result_merger` waits for all processors to complete (unites with `data_splitter`) +4. Only one `result_merger` state is created due to fingerprinting + +## Architecture Benefits + +### Scalability + +- **Horizontal scaling**: Add more runtime instances to handle increased load +- **Parallel processing**: Fanout enables concurrent execution +- **Load distribution**: State manager distributes work across available runtimes + +### Fault Tolerance + +- **State persistence**: All states are stored in the database +- **Retry mechanisms**: Failed states can be retried automatically +- **Recovery**: Workflows can resume from where they left off + +### Flexibility + +- **Dynamic fanout**: Nodes can produce variable numbers of outputs +- **Synchronization**: Unites keyword provides precise control over parallel execution +- **Dependency management**: Automatic resolution of complex dependencies + +### Observability + +- **State tracking**: Complete visibility into execution progress +- **Error handling**: Detailed error information and retry logic +- **Performance monitoring**: Track execution times and resource usage + + +Exosphere's architecture provides a robust foundation for building distributed, scalable workflows. The combination of state-based execution, fanout mechanisms, and the unites keyword enables complex parallel processing patterns while maintaining simplicity and reliability. \ No newline at end of file diff --git a/docs/docs/exosphere/concepts.md b/docs/docs/exosphere/concepts.md deleted file mode 100644 index 0c7a7d58..00000000 --- a/docs/docs/exosphere/concepts.md +++ /dev/null @@ -1,583 +0,0 @@ -# Core Concepts - -This section explains the fundamental concepts that define Exosphere's architecture and design philosophy. - -## Fanout - -Fanout is a core concept in Exosphere that enables parallel processing and distributed execution. It allows a single node to produce multiple outputs, which can then be processed by multiple downstream nodes simultaneously. - -### Understanding Fanout - -Fanout occurs when a node returns multiple outputs from a single execution. This is particularly useful for: - -- **Data splitting**: Dividing large datasets into smaller chunks for parallel processing -- **Batch processing**: Processing multiple items simultaneously -- **Parallel agents**: Executing different branches of a workflow concurrently - -### Fanout Example - -```python -from exospherehost import BaseNode -from pydantic import BaseModel - -class DataSplitterNode(BaseNode): - class Inputs(BaseModel): - data: str # JSON string of data array - - class Outputs(BaseModel): - chunk: str # JSON string of data chunk - - class Secrets(BaseModel): - pass - - async def execute(self) -> list[Outputs]: - data = json.loads(self.inputs.data) - chunk_size = 100 - - outputs = [] - for i in range(0, len(data), chunk_size): - chunk = data[i:i + chunk_size] - outputs.append(self.Outputs( - chunk=json.dumps(chunk) - )) - - return outputs # This creates fanout - multiple outputs -``` - -### Fanout in Flows - -When a node produces multiple outputs, the state manager creates multiple states that can be processed in parallel. In the flow structure, this is handled through the `next_nodes` field: - -```json -{ - "nodes": [ - { - "node_name": "DataSplitterNode", - "namespace": "MyProject", - "identifier": "data_splitter", - "inputs": { - "data": "initial" - }, - "next_nodes": ["processor_1", "processor_2", "processor_3"] - }, - { - "node_name": "DataProcessorNode", - "namespace": "MyProject", - "identifier": "processor_1", - "inputs": { - "chunk": "${{ data_splitter.outputs.chunk }}" - }, - "next_nodes": ["result_merger"] - }, - { - "node_name": "DataProcessorNode", - "namespace": "MyProject", - "identifier": "processor_2", - "inputs": { - "chunk": "${{ data_splitter.outputs.chunk }}" - }, - "next_nodes": ["result_merger"] - }, - { - "node_name": "DataProcessorNode", - "namespace": "MyProject", - "identifier": "processor_3", - "inputs": { - "chunk": "${{ data_splitter.outputs.chunk }}" - }, - "next_nodes": ["result_merger"] - }, - { - "node_name": "ResultMergerNode", - "namespace": "MyProject", - "identifier": "result_merger", - "inputs": { - "result_1": "${{ processor_1.outputs.processed_data }}", - "result_2": "${{ processor_2.outputs.processed_data }}", - "result_3": "${{ processor_3.outputs.processed_data }}" - }, - "next_nodes": [] - } - ] -} -``` - -Each output from the `data_splitter` node will trigger separate executions of the processor nodes, and the `result_merger` will wait for all processors to complete before executing. - -## Units - -Units in Exosphere represent the atomic processing components that make up your workflows. Each unit is a self-contained piece of logic that can be executed independently. - -### Unit Characteristics - -- **Self-contained**: Each unit has its own inputs, outputs, and processing logic -- **Stateless**: Units don't maintain state between executions (state is managed externally) -- **Reusable**: Units can be used in multiple workflows -- **Testable**: Units can be tested independently - -## Inputs - -Inputs define the data that a unit expects to receive. In Exosphere v1, all inputs must be strings, which provides a consistent interface while allowing for complex data through JSON serialization. - -### Input Structure - -```python -class Inputs(BaseModel): - # Simple string inputs - user_id: str - operation: str - - # Complex data as JSON strings - config: str # JSON string - data: str # JSON string -``` - -### Input Validation - -Pydantic automatically validates inputs based on the schema: - -```python -class Inputs(BaseModel): - user_id: str - age: str # Must be a string representation of a number - - @validator('age') - def validate_age(cls, v): - try: - age = int(v) - if age < 0 or age > 150: - raise ValueError("Age must be between 0 and 150") - return v - except ValueError: - raise ValueError("Age must be a valid integer") -``` - -### Working with Complex Inputs - -Since all inputs are strings, use JSON for complex data: - -```python -async def execute(self) -> Outputs: - # Parse JSON inputs - config = json.loads(self.inputs.config) - data = json.loads(self.inputs.data) - - # Use the parsed data - result = self._process_with_config(data, config) - - return self.Outputs(result=json.dumps(result)) -``` - -### Input Mapping in Flows - -In flow templates, inputs can reference outputs from previous nodes using the `${{ ... }}` syntax: - -```json -{ - "nodes": [ - { - "node_name": "DataLoaderNode", - "identifier": "data_loader", - "inputs": { - "source": "initial" // Static value - }, - "next_nodes": ["data_processor"] - }, - { - "node_name": "DataProcessorNode", - "identifier": "data_processor", - "inputs": { - "raw_data": "${{ data_loader.outputs.processed_data }}", // Mapped from previous node - "config": "initial" // Static value - }, - "next_nodes": ["data_validator"] - } - ] -} -``` - -**Mapping Syntax:** -- **`${{ node_identifier.outputs.field_name }}`**: Maps output from a specific node -- **`initial`**: Static value provided when the flow is triggered -- **Direct values**: String, number, or boolean values - -## Outputs - -Outputs define the data that a unit produces. Like inputs, all outputs must be strings in v1, providing a consistent interface for data flow between units. - -### Output Structure - -```python -class Outputs(BaseModel): - # Simple string outputs - status: str - message: str - - # Complex data as JSON strings - result: str # JSON string - metadata: str # JSON string -``` - -### Multiple Outputs - -Units can return multiple outputs through fanout: - -```python -async def execute(self) -> list[Outputs]: - data = json.loads(self.inputs.data) - - outputs = [] - for item in data: - processed = self._process_item(item) - outputs.append(self.Outputs( - result=json.dumps(processed), - item_id=str(item['id']) - )) - - return outputs # Multiple outputs for fanout -``` - -### Output Validation - -Validate outputs before returning them: - -```python -async def execute(self) -> Outputs: - result = self._process(self.inputs.data) - - # Validate the result - if not result: - return self.Outputs( - result="", - status="error", - error="Processing failed" - ) - - return self.Outputs( - result=json.dumps(result), - status="success", - error="" - ) -``` - -## Secrets - -Secrets provide secure access to sensitive configuration data such as API keys, database credentials, and other authentication tokens. Secrets are managed securely by the Exosphere runtime and are never exposed in logs or error messages. - -### Secret Structure - -```python -class Secrets(BaseModel): - # API credentials - api_key: str - api_secret: str - - # Database credentials - database_url: str - database_password: str - - # External service credentials - aws_access_key_id: str - aws_secret_access_key: str -``` - -### Using Secrets - -Secrets are automatically injected into your unit during execution: - -```python -async def execute(self) -> Outputs: - # Access secrets via self.secrets - headers = { - "Authorization": f"Bearer {self.secrets.api_key}", - "Content-Type": "application/json" - } - - # Use secrets for API calls - async with httpx.AsyncClient() as client: - response = await client.post( - "https://api.example.com/process", - headers=headers, - json={"data": self.inputs.data} - ) - - return self.Outputs(result=response.text) -``` - -### Secret Management - -Secrets are managed by the Exosphere runtime and are defined as an object in the flow template: - -```json -{ - "secrets": { - "openai_api_key": "your-openai-key", - "aws_access_key_id": "your-aws-key", - "aws_secret_access_key": "your-aws-secret", - "database_url": "your-database-url" - }, - "nodes": [ - // ... node definitions - ] -} -``` - -Secrets can be configured through: - -1. **Flow template**: Define secrets in the flow template (for development) -2. **Environment variables**: Set secrets in your runtime environment -3. **Runtime configuration**: Pass secrets when creating the runtime -4. **External secret management**: Integrate with services like AWS Secrets Manager - -### Security Best Practices - -- **Never log secrets**: Secrets are automatically filtered from logs -- **Use environment variables**: Store secrets in environment variables -- **Rotate secrets regularly**: Implement secret rotation policies -- **Limit secret scope**: Only include secrets that the unit actually needs - -## Data Flow Concepts - -### Linear Flow - -Simple sequential processing where each node has a single successor: - -```json -{ - "nodes": [ - { - "node_name": "DataLoaderNode", - "identifier": "data_loader", - "next_nodes": ["data_processor"] - }, - { - "node_name": "DataProcessorNode", - "identifier": "data_processor", - "next_nodes": ["data_validator"] - }, - { - "node_name": "DataValidatorNode", - "identifier": "data_validator", - "next_nodes": [] - } - ] -} -``` - -### Parallel Flow - -Multiple nodes processing simultaneously with a merge point: - -```json -{ - "nodes": [ - { - "node_name": "DataSplitterNode", - "identifier": "data_splitter", - "next_nodes": ["processor_1", "processor_2"] - }, - { - "node_name": "DataProcessorNode", - "identifier": "processor_1", - "next_nodes": ["result_merger"] - }, - { - "node_name": "DataProcessorNode", - "identifier": "processor_2", - "next_nodes": ["result_merger"] - }, - { - "node_name": "ResultMergerNode", - "identifier": "result_merger", - "next_nodes": [] - } - ] -} -``` - -### Conditional Flow - -Flow that depends on conditions (handled within node logic): - -```json -{ - "nodes": [ - { - "node_name": "DataAnalyzerNode", - "identifier": "data_analyzer", - "next_nodes": ["text_processor", "image_processor"] - }, - { - "node_name": "TextProcessorNode", - "identifier": "text_processor", - "next_nodes": ["result_collector"] - }, - { - "node_name": "ImageProcessorNode", - "identifier": "image_processor", - "next_nodes": ["result_collector"] - }, - { - "node_name": "ResultCollectorNode", - "identifier": "result_collector", - "next_nodes": [] - } - ] -} -``` - -### Fanout Flow - -One node producing multiple outputs for parallel processing: - -```json -{ - "nodes": [ - { - "node_name": "DataSplitterNode", - "identifier": "data_splitter", - "next_nodes": ["processor_1", "processor_2", "processor_3"] - }, - { - "node_name": "DataProcessorNode", - "identifier": "processor_1", - "next_nodes": [] - }, - { - "node_name": "DataProcessorNode", - "identifier": "processor_2", - "next_nodes": [] - }, - { - "node_name": "DataProcessorNode", - "identifier": "processor_3", - "next_nodes": [] - } - ] -} -``` - -## State Management - -### State Lifecycle - -1. **Pending**: State is created and waiting for execution -2. **Running**: State is currently being executed -3. **Executed**: State completed successfully -4. **Errored**: State failed with an error - -### State Persistence - -States are automatically persisted by the state manager, providing: - -- **Fault tolerance**: Failed states can be retried -- **Recovery**: Workflows can resume from where they left off -- **Monitoring**: Track execution progress and history -- **Debugging**: Inspect state data and error information - -### State Transitions - -```python -# State transitions are handled automatically -async def execute(self) -> Outputs: - try: - result = self._process(self.inputs.data) - return self.Outputs(result=result) # State becomes "executed" - except Exception as e: - raise e # State becomes "errored" -``` - -## Error Handling - -### Error Propagation - -Errors in units are automatically handled by the runtime: - -```python -async def execute(self) -> Outputs: - try: - result = self._process(self.inputs.data) - return self.Outputs(result=result) - except ValueError as e: - # Validation errors - don't retry - return self.Outputs( - result="", - error=f"validation_error: {str(e)}" - ) - except Exception as e: - # Processing errors - will be retried - raise e -``` - -### Retry Logic - -The runtime automatically retries failed states: - -- **Transient failures**: Network issues, temporary unavailability -- **Configurable retry limits**: Set maximum retry attempts -- **Exponential backoff**: Increasing delays between retries -- **Error classification**: Different handling for different error types - -## Performance Concepts - -### Async Execution - -All units are executed asynchronously: - -```python -async def execute(self) -> Outputs: - # Async operations for better performance - result = await self._async_operation(self.inputs.data) - return self.Outputs(result=result) -``` - -### Parallel Processing - -Fanout enables parallel processing: - -```python -async def execute(self) -> list[Outputs]: - # This will create multiple parallel executions - return [self.Outputs(data=chunk) for chunk in self._split_data()] -``` - -### Resource Management - -- **Connection pooling**: Reuse connections for external services -- **Memory management**: Automatic cleanup of resources -- **CPU utilization**: Efficient use of available compute resources - -## Scalability Concepts - -### Horizontal Scaling - -Add more runtime instances to handle increased load: - -```python -# Multiple runtime instances can process the same workflow -Runtime(namespace="MyProject", name="Runtime-1", nodes=[MyNode]).start() -Runtime(namespace="MyProject", name="Runtime-2", nodes=[MyNode]).start() -``` - -### Load Balancing - -The state manager automatically distributes work across available runtimes: - -- **Round-robin distribution**: Even distribution of states -- **Capacity-based routing**: Consider runtime capacity -- **Health-based routing**: Avoid unhealthy runtimes - -### Auto-scaling - -Scale based on workload: - -- **Queue depth**: Scale up when queue is full -- **Processing time**: Scale up when processing is slow -- **Error rates**: Scale down when error rates are high - -## Next Steps - -- **[Create Flow](./create-graph.md)** - Learn how to create flow templates -- **[Trigger Flow](./trigger-graph.md)** - Execute your workflows -- **[Examples](./examples.md)** - See real-world examples -- **[Dashboard](./dashboard.md)** - Monitor your flows with the Exosphere dashboard diff --git a/docs/docs/exosphere/examples.md b/docs/docs/exosphere/examples.md deleted file mode 100644 index 2396ee9a..00000000 --- a/docs/docs/exosphere/examples.md +++ /dev/null @@ -1,765 +0,0 @@ -# Examples - -This section provides real-world examples of Exosphere workflows and nodes. These examples demonstrate common patterns and use cases for building distributed AI workflows. - -## Document Processing Examples - -### Parse List of Documents - -A comprehensive document processing pipeline that handles multiple document types and formats. - -#### Node Structure - -```python -from exospherehost import BaseNode -from pydantic import BaseModel -import json - -class DocumentParserNode(BaseNode): - class Inputs(BaseModel): - document_url: str - document_type: str - processing_config: str # JSON string - - class Outputs(BaseModel): - parsed_content: str # JSON string - metadata: str # JSON string - status: str - - class Secrets(BaseModel): - api_key: str - storage_bucket: str - - async def execute(self) -> Outputs: - config = json.loads(self.inputs.processing_config) - - # Parse document based on type - if self.inputs.document_type == "pdf": - content = await self._parse_pdf(self.inputs.document_url) - elif self.inputs.document_type == "docx": - content = await self._parse_docx(self.inputs.document_url) - else: - content = await self._parse_text(self.inputs.document_url) - - # Extract metadata - metadata = { - "document_type": self.inputs.document_type, - "file_size": len(content), - "processing_config": config - } - - return self.Outputs( - parsed_content=json.dumps(content), - metadata=json.dumps(metadata), - status="success" - ) - - async def _parse_pdf(self, url): - # PDF parsing logic - pass - - async def _parse_docx(self, url): - # DOCX parsing logic - pass - - async def _parse_text(self, url): - # Text parsing logic - pass -``` - -#### Graph Template - -```json -{ - "name": "document-processing-pipeline", - "description": "Process and parse multiple document types", - "nodes": [ - { - "id": "document-loader", - "name": "DocumentLoaderNode", - "namespace": "exospherehost" - }, - { - "id": "document-parser", - "name": "DocumentParserNode", - "namespace": "exospherehost" - }, - { - "id": "content-analyzer", - "name": "ContentAnalyzerNode", - "namespace": "exospherehost" - }, - { - "id": "result-storer", - "name": "ResultStorerNode", - "namespace": "exospherehost" - } - ], - "connections": [ - { - "from": "document-loader", - "to": "document-parser", - "mapping": { - "document_url": "document_url", - "document_type": "document_type" - } - }, - { - "from": "document-parser", - "to": "content-analyzer", - "mapping": { - "parsed_content": "content" - } - }, - { - "from": "content-analyzer", - "to": "result-storer", - "mapping": { - "analysis_result": "result" - } - } - ], - "triggers": [ - { - "id": "process-documents", - "node": "document-loader" - } - ], - "secrets": [ - "api_key", - "storage_bucket" - ] -} -``` - -#### Triggering the Pipeline - -```python -from exospherehost import StateManager, TriggerState -import json - -async def process_documents(): - state_manager = StateManager( - namespace="exospherehost", - state_manager_uri="https://your-state-manager.exosphere.host", - key="your-api-key" - ) - - # Document processing configuration - config = { - "ocr_enabled": True, - "language": "en", - "extract_tables": True, - "extract_images": False - } - - # Create trigger state - trigger_state = TriggerState( - identifier="process-documents", - inputs={ - "document_url": "https://example.com/document.pdf", - "document_type": "pdf", - "processing_config": json.dumps(config) - } - ) - - # Trigger the pipeline - result = await state_manager.trigger("document-processing-pipeline", state=trigger_state) - return result -``` - -## Cloud Storage Examples - -### S3 File Processing - -A cloud storage runtime that processes files from S3 buckets. - -#### List S3 Files Node - -```python -import boto3 -from exospherehost import BaseNode -from pydantic import BaseModel - -class ListS3FilesNode(BaseNode): - class Inputs(BaseModel): - bucket_name: str - prefix: str = "" - files_only: str = "true" - recursive: str = "false" - - class Outputs(BaseModel): - file_keys: str # JSON string of file keys - - class Secrets(BaseModel): - aws_access_key_id: str - aws_secret_access_key: str - aws_region: str - - async def execute(self) -> Outputs: - s3_client = boto3.client( - 's3', - aws_access_key_id=self.secrets.aws_access_key_id, - aws_secret_access_key=self.secrets.aws_secret_access_key, - region_name=self.secrets.aws_region - ) - - response = s3_client.list_objects_v2( - Bucket=self.inputs.bucket_name, - Prefix=self.inputs.prefix - ) - - file_keys = [] - for obj in response.get('Contents', []): - if self.inputs.files_only == "true": - if not obj['Key'].endswith('/'): - file_keys.append(obj['Key']) - else: - file_keys.append(obj['Key']) - - return self.Outputs(file_keys=json.dumps(file_keys)) -``` - -#### Download S3 File Node - -```python -import boto3 -import tempfile -import os -from exospherehost import BaseNode -from pydantic import BaseModel - -class DownloadS3FileNode(BaseNode): - class Inputs(BaseModel): - bucket_name: str - file_key: str - local_path: str = "" - - class Outputs(BaseModel): - local_file_path: str - file_size: str - download_status: str - - class Secrets(BaseModel): - aws_access_key_id: str - aws_secret_access_key: str - aws_region: str - - async def execute(self) -> Outputs: - s3_client = boto3.client( - 's3', - aws_access_key_id=self.secrets.aws_access_key_id, - aws_secret_access_key=self.secrets.aws_secret_access_key, - region_name=self.secrets.aws_region - ) - - # Determine local path - if not self.inputs.local_path: - temp_dir = tempfile.gettempdir() - filename = os.path.basename(self.inputs.file_key) - local_path = os.path.join(temp_dir, filename) - else: - local_path = self.inputs.local_path - - try: - # Download file - s3_client.download_file( - self.inputs.bucket_name, - self.inputs.file_key, - local_path - ) - - # Get file size - file_size = os.path.getsize(local_path) - - return self.Outputs( - local_file_path=local_path, - file_size=str(file_size), - download_status="success" - ) - - except Exception as e: - return self.Outputs( - local_file_path="", - file_size="0", - download_status=f"error: {str(e)}" - ) -``` - -#### Cloud Storage Runtime - -```python -from exospherehost import Runtime -from nodes.list_s3_files import ListS3FilesNode -from nodes.download_s3_file import DownloadS3FileNode - -# Initialize the cloud storage runtime -Runtime( - name="cloud-storage-runtime", - namespace="exospherehost", - nodes=[ListS3FilesNode, DownloadS3FileNode] -).start() -``` - -#### S3 Processing Graph - -```json -{ - "name": "s3-file-processing", - "description": "Process files from S3 bucket", - "nodes": [ - { - "id": "file-lister", - "name": "ListS3FilesNode", - "namespace": "exospherehost" - }, - { - "id": "file-downloader", - "name": "DownloadS3FileNode", - "namespace": "exospherehost" - }, - { - "id": "file-processor", - "name": "FileProcessorNode", - "namespace": "exospherehost" - } - ], - "connections": [ - { - "from": "file-lister", - "to": "file-downloader", - "mapping": { - "file_keys": "file_key" - } - }, - { - "from": "file-downloader", - "to": "file-processor", - "mapping": { - "local_file_path": "input_file" - } - } - ], - "triggers": [ - { - "id": "process-s3-files", - "node": "file-lister" - } - ], - "secrets": [ - "aws_access_key_id", - "aws_secret_access_key", - "aws_region" - ] -} -``` - -## Data Processing Examples - -### Batch Data Processing - -A scalable batch processing pipeline for large datasets. - -#### Data Splitter Node - -```python -import json -from exospherehost import BaseNode -from pydantic import BaseModel - -class DataSplitterNode(BaseNode): - class Inputs(BaseModel): - data: str # JSON string of data array - batch_size: str = "1000" - - class Outputs(BaseModel): - batch_data: str # JSON string of batch data - - class Secrets(BaseModel): - pass - - async def execute(self) -> list[Outputs]: - data = json.loads(self.inputs.data) - batch_size = int(self.inputs.batch_size) - - outputs = [] - for i in range(0, len(data), batch_size): - batch = data[i:i + batch_size] - outputs.append(self.Outputs( - batch_data=json.dumps(batch) - )) - - return outputs -``` - -#### Data Processor Node - -```python -import json -from exospherehost import BaseNode -from pydantic import BaseModel - -class DataProcessorNode(BaseNode): - class Inputs(BaseModel): - batch_data: str # JSON string - processing_config: str # JSON string - - class Outputs(BaseModel): - processed_data: str # JSON string - processing_stats: str # JSON string - - class Secrets(BaseModel): - api_key: str - - async def execute(self) -> Outputs: - data = json.loads(self.inputs.batch_data) - config = json.loads(self.inputs.processing_config) - - # Process the data - processed_items = [] - for item in data: - processed_item = await self._process_item(item, config) - processed_items.append(processed_item) - - # Calculate statistics - stats = { - "input_count": len(data), - "output_count": len(processed_items), - "processing_time": "calculated_time" - } - - return self.Outputs( - processed_data=json.dumps(processed_items), - processing_stats=json.dumps(stats) - ) - - async def _process_item(self, item, config): - # Item processing logic - return {"processed": item, "config": config} -``` - -#### Result Merger Node - -```python -import json -from exospherehost import BaseNode -from pydantic import BaseModel - -class ResultMergerNode(BaseNode): - class Inputs(BaseModel): - processed_data: str # JSON string - batch_id: str - - class Outputs(BaseModel): - merged_results: str # JSON string - total_count: str - - class Secrets(BaseModel): - pass - - async def execute(self) -> Outputs: - data = json.loads(self.inputs.processed_data) - - # Merge results (in a real scenario, this would aggregate from multiple batches) - merged_results = data - - return self.Outputs( - merged_results=json.dumps(merged_results), - total_count=str(len(merged_results)) - ) -``` - -## API Integration Examples - -### External API Processing - -A node that integrates with external APIs for data enrichment. - -#### API Integration Node - -```python -import httpx -import json -from exospherehost import BaseNode -from pydantic import BaseModel - -class APIEnrichmentNode(BaseNode): - class Inputs(BaseModel): - user_data: str # JSON string - enrichment_type: str - - class Outputs(BaseModel): - enriched_data: str # JSON string - api_response: str # JSON string - - class Secrets(BaseModel): - api_key: str - api_endpoint: str - - async def execute(self) -> Outputs: - user_data = json.loads(self.inputs.user_data) - - headers = { - "Authorization": f"Bearer {self.secrets.api_key}", - "Content-Type": "application/json" - } - - async with httpx.AsyncClient() as client: - response = await client.post( - f"{self.secrets.api_endpoint}/enrich", - headers=headers, - json={ - "data": user_data, - "type": self.inputs.enrichment_type - } - ) - - if response.status_code == 200: - enriched_data = response.json() - return self.Outputs( - enriched_data=json.dumps(enriched_data), - api_response=json.dumps({"status": "success"}) - ) - else: - return self.Outputs( - enriched_data=json.dumps(user_data), - api_response=json.dumps({"status": "error", "code": response.status_code}) - ) -``` - -## Machine Learning Examples - -### Model Inference Node - -A node for running machine learning model inference. - -#### ML Inference Node - -```python -import json -import numpy as np -from exospherehost import BaseNode -from pydantic import BaseModel - -class MLInferenceNode(BaseNode): - class Inputs(BaseModel): - input_data: str # JSON string - model_name: str - - class Outputs(BaseModel): - predictions: str # JSON string - confidence_scores: str # JSON string - - class Secrets(BaseModel): - model_path: str - model_config: str # JSON string - - async def execute(self) -> Outputs: - input_data = json.loads(self.inputs.input_data) - model_config = json.loads(self.secrets.model_config) - - # Load model (in practice, you'd load this once and cache it) - model = await self._load_model(self.secrets.model_path) - - # Preprocess input - processed_input = self._preprocess_input(input_data, model_config) - - # Run inference - predictions = await self._run_inference(model, processed_input) - - # Postprocess results - confidence_scores = self._calculate_confidence(predictions) - - return self.Outputs( - predictions=json.dumps(predictions.tolist()), - confidence_scores=json.dumps(confidence_scores.tolist()) - ) - - async def _load_model(self, model_path): - # Model loading logic - pass - - def _preprocess_input(self, data, config): - # Preprocessing logic - pass - - async def _run_inference(self, model, input_data): - # Inference logic - pass - - def _calculate_confidence(self, predictions): - # Confidence calculation - pass -``` - -## Error Handling Examples - -### Robust Error Handling Node - -A node that demonstrates comprehensive error handling patterns. - -#### Error Handler Node - -```python -import json -import traceback -from exospherehost import BaseNode -from pydantic import BaseModel - -class RobustProcessingNode(BaseNode): - class Inputs(BaseModel): - data: str - retry_count: str = "0" - - class Outputs(BaseModel): - result: str - error: str - retry_count: str - - class Secrets(BaseModel): - max_retries: str = "3" - - async def execute(self) -> Outputs: - current_retry = int(self.inputs.retry_count) - max_retries = int(self.secrets.max_retries) - - try: - # Attempt processing - result = await self._process_data(self.inputs.data) - - return self.Outputs( - result=result, - error="", - retry_count=str(current_retry) - ) - - except ValueError as e: - # Validation error - don't retry - return self.Outputs( - result="", - error=f"validation_error: {str(e)}", - retry_count=str(current_retry) - ) - - except Exception as e: - # Processing error - retry if possible - if current_retry < max_retries: - # This will trigger a retry with incremented count - raise Exception(f"retry_attempt_{current_retry + 1}: {str(e)}") - else: - return self.Outputs( - result="", - error=f"max_retries_exceeded: {str(e)}", - retry_count=str(current_retry) - ) - - async def _process_data(self, data): - # Processing logic that might fail - if not data: - raise ValueError("Data cannot be empty") - - # Simulate processing - return f"processed: {data}" -``` - -## Monitoring and Logging Examples - -### Logging Node - -A node that demonstrates proper logging and monitoring. - -#### Logger Node - -```python -import json -import logging -from datetime import datetime -from exospherehost import BaseNode -from pydantic import BaseModel - -class LoggingNode(BaseNode): - class Inputs(BaseModel): - message: str - log_level: str = "INFO" - metadata: str = "{}" # JSON string - - class Outputs(BaseModel): - log_entry: str # JSON string - timestamp: str - - class Secrets(BaseModel): - log_endpoint: str - log_api_key: str - - async def execute(self) -> Outputs: - metadata = json.loads(self.inputs.metadata) - timestamp = datetime.now().isoformat() - - log_entry = { - "message": self.inputs.message, - "level": self.inputs.log_level, - "timestamp": timestamp, - "metadata": metadata, - "node_id": "LoggingNode" - } - - # Send to external logging service - await self._send_log(log_entry) - - return self.Outputs( - log_entry=json.dumps(log_entry), - timestamp=timestamp - ) - - async def _send_log(self, log_entry): - # Send log to external service - async with httpx.AsyncClient() as client: - await client.post( - self.secrets.log_endpoint, - headers={"Authorization": f"Bearer {self.secrets.log_api_key}"}, - json=log_entry - ) -``` - -## Best Practices Summary - -### 1. Error Handling - -- Always handle exceptions gracefully -- Provide meaningful error messages -- Implement retry logic for transient failures -- Use appropriate error types for different scenarios - -### 2. Data Validation - -- Validate inputs at the node level -- Use Pydantic for schema validation -- Handle edge cases and invalid data -- Provide clear error messages for validation failures - -### 3. Performance - -- Use async/await for I/O operations -- Implement proper resource cleanup -- Consider batching for large datasets -- Monitor and optimize execution time - -### 4. Security - -- Never log sensitive data -- Use secrets for API keys and credentials -- Validate and sanitize inputs -- Implement proper authentication - -### 5. Monitoring - -- Log important events and errors -- Track execution metrics -- Implement health checks -- Use structured logging - -## Next Steps - -- **[Concepts](./concepts.md)** - Learn about fanout, units, inputs, outputs, and secrets -- **[API Reference](./api-reference.md)** - Complete API documentation -- **[Tutorials](./tutorials.md)** - Step-by-step tutorials for common use cases diff --git a/docs/docs/exosphere/examples/node-examples/basic-nodes.md b/docs/docs/exosphere/examples/node-examples/basic-nodes.md deleted file mode 100644 index 68648578..00000000 --- a/docs/docs/exosphere/examples/node-examples/basic-nodes.md +++ /dev/null @@ -1,192 +0,0 @@ -# Basic Node Examples - -This section contains basic node implementation examples that demonstrate fundamental patterns for creating Exosphere nodes. - -## Simple Data Processing Node - -A basic node that performs simple text operations. - -```python -from exospherehost import BaseNode -from pydantic import BaseModel - -class DataProcessorNode(BaseNode): - class Inputs(BaseModel): - text: str - operation: str - - class Outputs(BaseModel): - result: str - status: str - - class Secrets(BaseModel): - pass - - async def execute(self) -> Outputs: - if self.inputs.operation == "uppercase": - result = self.inputs.text.upper() - elif self.inputs.operation == "lowercase": - result = self.inputs.text.lower() - else: - return self.Outputs( - result="", - status="error: unknown operation" - ) - - return self.Outputs( - result=result, - status="success" - ) -``` - -## Complex Data Processing Node - -A node that handles complex data using JSON serialization. - -```python -import json -from exospherehost import BaseNode -from pydantic import BaseModel - -class ComplexDataNode(BaseNode): - class Inputs(BaseModel): - config: str # JSON string - data_list: str # JSON string - - class Outputs(BaseModel): - result: str - metadata: str # JSON string - - class Secrets(BaseModel): - api_key: str - - async def execute(self) -> Outputs: - # Parse JSON inputs - config = json.loads(self.inputs.config) - data_list = json.loads(self.inputs.data_list) - - # Process data - results = [] - for item in data_list: - processed = process_item(item, config) - results.append(processed) - - # Return JSON outputs - return self.Outputs( - result=json.dumps(results), - metadata=json.dumps({ - "processed_count": len(results), - "config_used": config - }) - ) -``` - -## Multi-Output Node - -A node that returns multiple outputs by returning a list. - -```python -from exospherehost import BaseNode -from pydantic import BaseModel - -class MultiOutputNode(BaseNode): - class Inputs(BaseModel): - data: str - - class Outputs(BaseModel): - processed_data: str - status: str - - class Secrets(BaseModel): - pass - - async def execute(self) -> list[Outputs]: - # Process data and create multiple outputs - outputs = [] - - # Split data and process each part - parts = self.inputs.data.split(',') - - for i, part in enumerate(parts): - processed = part.strip().upper() - outputs.append(self.Outputs( - processed_data=processed, - status=f"processed_part_{i}" - )) - - return outputs -``` - -## Error Handling Node - -A node that demonstrates robust error handling patterns. - -```python -from exospherehost import BaseNode -from pydantic import BaseModel - -class RobustNode(BaseNode): - class Inputs(BaseModel): - data: str - - class Outputs(BaseModel): - result: str - error: str - - class Secrets(BaseModel): - pass - - async def execute(self) -> Outputs: - try: - # Your processing logic - result = process_data(self.inputs.data) - return self.Outputs( - result=result, - error="" - ) - except ValueError as e: - return self.Outputs( - result="", - error=f"validation_error: {str(e)}" - ) - except Exception as e: - return self.Outputs( - result="", - error=f"processing_error: {str(e)}" - ) -``` - -## Testing Node - -A simple node for testing purposes. - -```python -import asyncio -from exospherehost import BaseNode -from pydantic import BaseModel - -class TestNode(BaseNode): - class Inputs(BaseModel): - data: str - - class Outputs(BaseModel): - result: str - - class Secrets(BaseModel): - pass - - async def execute(self) -> Outputs: - return self.Outputs(result=f"processed: {self.inputs.data}") - -# Test the node -async def test_node(): - node = TestNode() - inputs = TestNode.Inputs(data="test data") - secrets = TestNode.Secrets() - - outputs = await node._execute(inputs, secrets) - print(f"Output: {outputs.result}") - -# Run the test -asyncio.run(test_node()) -``` diff --git a/docs/docs/exosphere/examples/node-examples/index.md b/docs/docs/exosphere/examples/node-examples/index.md deleted file mode 100644 index 3a5c078e..00000000 --- a/docs/docs/exosphere/examples/node-examples/index.md +++ /dev/null @@ -1,38 +0,0 @@ -# Node Examples - -This section provides comprehensive examples of Exosphere node implementations, organized by category and complexity level. - -## Overview - -Node examples are organized into the following categories: - -- **[Nodes](./basic-nodes.md)** - Fundamental patterns and simple node implementations -- **[Integration](./integration-nodes.md)** - Nodes that integrate with external services and systems - -## Basic Node Examples - -The [Nodes](./basic-nodes.md) section includes: - -- **Simple Data Processing Node** - Basic text operations (uppercase, lowercase) -- **Complex Data Processing Node** - JSON serialization for complex data -- **Multi-Output Node** - Nodes that return multiple outputs -- **Error Handling Node** - Robust error handling patterns -- **Testing Node** - Simple node for testing purposes - -## Integration Node Examples - -The [Integration](./integration-nodes.md) section includes: - -- **API Integration Node** - HTTP requests to external APIs -- **Database Operations Node** - Database queries using asyncpg -- **File Operations Node** - File system operations using aiofiles -- **Cloud Storage Node** - AWS S3 integration -- **Email Integration Node** - SMTP email sending - -## Next Steps - -After reviewing these examples: - -- **[Register Node](../register-node.md)** - Learn how to create and register your own nodes -- **[Create Graph](../create-graph.md)** - Connect nodes into workflows -- **[Examples](../examples.md)** - See complete workflow examples diff --git a/docs/docs/exosphere/index.md b/docs/docs/exosphere/index.md index f79e5776..294cb435 100644 --- a/docs/docs/exosphere/index.md +++ b/docs/docs/exosphere/index.md @@ -1,6 +1,6 @@ # Exosphere -Exosphere is a modern, fast (high-performance), open-source infrastructure layer for building distributed AI workflows and agents with Python based on a node-based architecture. +Exosphere is an open-source infrastructure layer to run distributed AI workflows and agents with Python based on a node-based architecture. --- @@ -75,7 +75,9 @@ Now go to your Exosphere dashboard to: * Monitor execution states * Debug and troubleshoot -## Example upgrade +Ref: [Dashboard Guide](./dashboard.md) + +## Example flow Now modify the file `main.py` to add more complex processing: diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index dfa09688..80b76bbf 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -105,11 +105,7 @@ plugins: - exosphere/create-graph.md - exosphere/trigger-graph.md - exosphere/dashboard.md - - exosphere/concepts.md - - exosphere/examples.md - - exosphere/examples/node-examples/index.md - - exosphere/examples/node-examples/basic-nodes.md - + - exosphere/architecture.md markdown_extensions: - pymdownx.highlight: @@ -128,18 +124,12 @@ extra_css: - stylesheets/extra.css nav: - - Introduction: exosphere/index.md + - Introduction: exosphere/index.md - Getting Started: exosphere/getting-started.md - State Manager Setup: exosphere/state-manager-setup.md - Register Node: exosphere/register-node.md - Create Runtime: exosphere/create-runtime.md - Create Graph: exosphere/create-graph.md - - Trigger Graph: exosphere/trigger-graph.md - - Concepts: exosphere/concepts.md - - Dashboard: exosphere/dashboard.md - - Examples: - - Overview: exosphere/examples.md - - Node Examples: - - Overview: exosphere/examples/node-examples/index.md - - Basic Nodes: exosphere/examples/node-examples/basic-nodes.md - - Workflow Examples: exosphere/examples/workflow-examples/index.md \ No newline at end of file + - Trigger Graph: exosphere/trigger-graph.md + - Dashboard: exosphere/dashboard.md + - Architecture: exosphere/architecture.md \ No newline at end of file From 699adf8973a30abc9d9a4843e6309abf14e1c23b Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 20:07:30 +0530 Subject: [PATCH 04/15] Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58908b7c..0d9de060 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ This allows developers to deploy production agents that can scale beautifully to #Output fields from this node async def execute(self) -> Outputs: - return Outputs(descriptor_agent(inputs.city)) + return Outputs(descriptor_agent(self.inputs.city)) #Execution function: # >>Agent # >>Existing Code From 011d49d844e77d1ada65b408434ba67395a2c7e3 Mon Sep 17 00:00:00 2001 From: Nivedit Jain Date: Sun, 24 Aug 2025 20:16:02 +0530 Subject: [PATCH 05/15] Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d9de060..0fb7a09c 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ This allows developers to deploy production agents that can scale beautifully to - ### Define your first flow - Flows are then described connecting nodes with relationships in json objects. Exosphere runs flows as per defined trigger conditions. See [Flow defintions](docs.exosphere.host) to see more examples. + Flows are then described connecting nodes with relationships in json objects. Exosphere runs flows as per defined trigger conditions. See [Flow defintions](https://docs.exosphere.host) to see more examples. ```json { "secrets": {}, From f77baaff269b9fbe432768bd7ae51900a7c02f36 Mon Sep 17 00:00:00 2001 From: Nivedit Jain Date: Sun, 24 Aug 2025 20:16:21 +0530 Subject: [PATCH 06/15] Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fb7a09c..436773f2 100644 --- a/README.md +++ b/README.md @@ -89,4 +89,4 @@ This allows developers to deploy production agents that can scale beautifully to We welcome community contributions. For guidelines, refer to our [CONTRIBUTING.md](/CONTRIBUTING.md). Further we are thankful to all the contributors helping us to simplify infrastructure starting with the process of building and deploying AI workflows and agents. -Join our Discord: https://discord.gg/msUHahrp for active community discussions. We have weekly community huddle to talk up feature dicsussions, feel free to become a part of the conversation. +Join our Discord: https://discord.gg/msUHahrp for active community discussions. We have weekly community huddle to talk up feature discussions, feel free to become a part of the conversation. From 8aa5991e95bcd4690ca16e976b18829201103b0e Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 20:20:42 +0530 Subject: [PATCH 07/15] env variables --- README.md | 13 ++++- docs/docs/exosphere/dashboard.md | 16 +----- docs/docs/exosphere/state-manager-setup.md | 67 ++++++++++------------ 3 files changed, 44 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 58908b7c..7b02f60e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,19 @@ ![logo light](assets/logo-light.svg#gh-light-mode-only) ![logo dark](assets/logo-dark.svg#gh-dark-mode-only) +![logo light](assets/logo-light.svg#gh-light-mode-only) +![logo dark](assets/logo-dark.svg#gh-dark-mode-only) +[![Docs](https://img.shields.io/badge/docs-latest-success)](https://docs.exosphere.host) +[![Last commit](https://img.shields.io/github/last-commit/exospherehost/exospherehost)](https://github.com/exospherehost/exospherehost/commits/main) +[![PyPI - Version](https://img.shields.io/pypi/v/exospherehost)](https://pypi.org/project/exospherehost/) +[![Coverage](https://img.shields.io/codecov/c/gh/exospherehost/exospherehost)](https://codecov.io/gh/exospherehost/exospherehost) +[![Kubernetes](https://img.shields.io/badge/Kubernetes-native-326ce5?logo=kubernetes&logoColor=white)](https://github.com/orgs/exospherehost/packages?repo_name=exospherehost) +[![Discord](https://badgen.net/discord/members/V8uuA6mmzg)](https://discord.gg/V8uuA6mmzg) +![Stars](https://img.shields.io/github/stars/exospherehost/exospherehost?style=social) + --- -Exosphere is open source infrastructure to run AI agents at scale with first party support for large data and long running flows. + +Exosphere is open source infrastructure to run AI agents at scale for large data and long running flows. Exosphere lets you define plug and playable nodes that can then be run on a reliable backbone in the form of a workflow, with: - Dynamic State Creation at runtime diff --git a/docs/docs/exosphere/dashboard.md b/docs/docs/exosphere/dashboard.md index 36f2c4ff..b0c173ff 100644 --- a/docs/docs/exosphere/dashboard.md +++ b/docs/docs/exosphere/dashboard.md @@ -41,9 +41,7 @@ Before setting up the dashboard, ensure you have: docker run -d \ --name exosphere-dashboard \ -p 3000:3000 \ - -e NEXT_PUBLIC_STATE_MANAGER_URL="http://localhost:8000" \ - -e NEXT_PUBLIC_API_KEY="your-api-key" \ - -e NEXT_PUBLIC_NAMESPACE="your-namespace" \ + -e NEXT_PUBLIC_EXOSPHERE_STATE_MANAGER_URL="http://localhost:8000" \ ghcr.io/exospherehost/exosphere-dashboard:latest ``` @@ -65,9 +63,7 @@ Before setting up the dashboard, ensure you have: | Variable | Description | Required | Default | |----------|-------------|----------|---------| - | `NEXT_PUBLIC_STATE_MANAGER_URL` | State manager API endpoint | Yes | - | - | `NEXT_PUBLIC_API_KEY` | API key for authentication | Yes | - | - | `NEXT_PUBLIC_NAMESPACE` | Default namespace | Yes | - | + | `NEXT_PUBLIC_EXOSPHERE_STATE_MANAGER_URL` | State manager API endpoint | Yes | - | === "Local Development" @@ -111,13 +107,7 @@ Before setting up the dashboard, ensure you have: ```bash # State manager API endpoint - NEXT_PUBLIC_STATE_MANAGER_URL=http://localhost:8000 - - # API key for authentication - NEXT_PUBLIC_API_KEY=your-api-key - - # Default namespace - NEXT_PUBLIC_NAMESPACE=your-namespace + NEXT_PUBLIC_EXOSPHERE_STATE_MANAGER_URL=http://localhost:8000 ``` ## Dashboard Interface diff --git a/docs/docs/exosphere/state-manager-setup.md b/docs/docs/exosphere/state-manager-setup.md index 67df630e..04e03a7a 100644 --- a/docs/docs/exosphere/state-manager-setup.md +++ b/docs/docs/exosphere/state-manager-setup.md @@ -23,11 +23,10 @@ The Exosphere state manager is the core backend service that handles workflow ex docker run -d \ --name exosphere-state-manager \ -p 8000:8000 \ - -e MONGODB_URI="mongodb://localhost:27017/exosphere" \ - -e DATABASE_NAME="exosphere" \ - -e API_KEY="your-secret-api-key" \ - -e NAMESPACE="your-namespace" \ - -e ENCRYPTION_KEY="your-32-character-encryption-key" \ + -e MONGO_URI="mongodb://admin:password@mongodb:27017/exosphere?authSource=admin" \ + -e MONGO_DATABASE_NAME="exosphere" \ + -e STATE_MANAGER_SECRET="exosphere@123" \ + -e SECRETS_ENCRYPTION_KEY="YTzpUlBGLSwm-3yKJRJTZnb0_aQuQQHyz64s8qAERVU=" \ ghcr.io/exospherehost/state-manager:latest ``` @@ -49,11 +48,10 @@ The Exosphere state manager is the core backend service that handles workflow ex | Variable | Description | Required | |----------|-------------|----------| - | `MONGODB_URI` | MongoDB connection string | Yes | - | `DATABASE_NAME` | Database name | Yes | - | `API_KEY` | Secret API key for authentication | Yes | - | `NAMESPACE` | Default namespace for operations | Yes | - | `ENCRYPTION_KEY` | 32-character key for data encryption | Yes | + | `MONGO_URI` | MongoDB connection string | Yes | + | `MONGO_DATABASE_NAME` | Database name | Yes | + | `STATE_MANAGER_SECRET` | Secret API key for authentication | Yes | + | `SECRETS_ENCRYPTION_KEY` | Base64-encoded key for data encryption | Yes | === "Local Development" @@ -80,11 +78,10 @@ The Exosphere state manager is the core backend service that handles workflow ex 3. **Set up environment variables**: ```bash - export MONGODB_URI="mongodb://localhost:27017/exosphere" - export DATABASE_NAME="exosphere" - export API_KEY="your-secret-api-key" - export NAMESPACE="your-namespace" - export ENCRYPTION_KEY="your-32-character-encryption-key" + export MONGO_URI="your-mongodb-connection-string" + export MONGO_DATABASE_NAME="your-database-name" + export STATE_MANAGER_SECRET="your-secret-key" + export SECRETS_ENCRYPTION_KEY="your-base64-encoded-encryption-key" ``` 4. **Run the state manager**: @@ -145,12 +142,11 @@ The Exosphere state manager is the core backend service that handles workflow ex image: ghcr.io/exospherehost/state-manager:latest ports: - "8000:8000" - environment: - - MONGODB_URI=mongodb://your-mongodb-cluster:27017/exosphere - - DATABASE_NAME=exosphere - - API_KEY=${API_KEY} - - NAMESPACE=${NAMESPACE} - - ENCRYPTION_KEY=${ENCRYPTION_KEY} + environment: + - MONGO_URI=${MONGO_URI} + - MONGO_DATABASE_NAME=${MONGO_DATABASE_NAME} + - STATE_MANAGER_SECRET=${STATE_MANAGER_SECRET} + - SECRETS_ENCRYPTION_KEY=${SECRETS_ENCRYPTION_KEY} deploy: replicas: 3 update_config: @@ -167,12 +163,12 @@ The Exosphere state manager is the core backend service that handles workflow ex ### Kubernetes Deployment - 1. **Create namespace**: + 3. **Create namespace**: ```bash kubectl create namespace exosphere ``` - 2. **Create ConfigMap for configuration**: + 4. **Create ConfigMap for configuration**: ```yaml apiVersion: v1 kind: ConfigMap @@ -180,13 +176,12 @@ The Exosphere state manager is the core backend service that handles workflow ex name: state-manager-config namespace: exosphere data: - MONGODB_URI: "mongodb://your-mongodb-cluster:27017/exosphere" - DATABASE_NAME: "exosphere" - NAMESPACE: "your-namespace" + MONGO_URI: "your-mongodb-connection-string" + MONGO_DATABASE_NAME: "your-database-name" LOG_LEVEL: "INFO" ``` - 3. **Create Secret for sensitive data**: + 5. **Create Secret for sensitive data**: ```yaml apiVersion: v1 kind: Secret @@ -195,11 +190,11 @@ The Exosphere state manager is the core backend service that handles workflow ex namespace: exosphere type: Opaque data: - API_KEY: - ENCRYPTION_KEY: + STATE_MANAGER_SECRET: + SECRETS_ENCRYPTION_KEY: ``` - 4. **Deploy the state manager**: + 6. **Deploy the state manager**: ```bash kubectl apply -f k8s/state-manager-deployment.yaml kubectl apply -f k8s/state-manager-service.yaml @@ -212,15 +207,11 @@ The Exosphere state manager is the core backend service that handles workflow ex | Variable | Description | Required | Default | |----------|-------------|----------|---------| -| `MONGODB_URI` | MongoDB connection string | Yes | - | -| `DATABASE_NAME` | Database name | Yes | `exosphere` | -| `API_KEY` | Secret API key for authentication | Yes | - | -| `NAMESPACE` | Default namespace for operations | Yes | - | -| `ENCRYPTION_KEY` | 32-character key for data encryption | Yes | - | +| `MONGO_URI` | MongoDB connection string | Yes | - | +| `MONGO_DATABASE_NAME` | Database name | Yes | `exosphere` | +| `STATE_MANAGER_SECRET` | Secret API key for authentication | Yes | - | +| `SECRETS_ENCRYPTION_KEY` | Base64-encoded key for data encryption | Yes | - | | `LOG_LEVEL` | Logging level (DEBUG, INFO, WARNING, ERROR) | No | `INFO` | -| `WORKERS` | Number of worker processes | No | CPU count | -| `HOST` | Host to bind to | No | `0.0.0.0` | -| `PORT` | Port to bind to | No | `8000` | ## Monitoring and Health Checks From 748a643b44840f32084ed866cebe40f8e19347fe Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 20:33:19 +0530 Subject: [PATCH 08/15] comments --- docs/docs/exosphere/create-graph.md | 12 ++++---- docs/docs/exosphere/create-runtime.md | 12 ++++---- docs/docs/exosphere/getting-started.md | 8 +++--- docs/docs/exosphere/state-manager-setup.md | 32 ++++++++++++---------- docs/docs/exosphere/trigger-graph.md | 4 +-- 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/docs/docs/exosphere/create-graph.md b/docs/docs/exosphere/create-graph.md index 5afdff2f..c0df6ab2 100644 --- a/docs/docs/exosphere/create-graph.md +++ b/docs/docs/exosphere/create-graph.md @@ -138,8 +138,8 @@ async def create_flow_template(): # Initialize the State Manager state_manager = StateManager( namespace="MyProject", - state_manager_uri="https://your-state-manager.exosphere.host", - key="your-api-key" + state_manager_uri=STATE_MANAGER_URI, + key=STATE_MANAGER_SECRET ) # Define the graph nodes @@ -225,8 +225,8 @@ The state manager validates your graph template: async def get_graph_template(): state_manager = StateManager( namespace="MyProject", - state_manager_uri="https://your-state-manager.exosphere.host", - key="your-api-key" + state_manager_uri=STATE_MANAGER_URI, + key=STATE_MANAGER_SECRET ) try: @@ -249,8 +249,8 @@ The state manager validates your graph template: async def update_graph_template(): state_manager = StateManager( namespace="MyProject", - state_manager_uri="https://your-state-manager.exosphere.host", - key="your-api-key" + state_manager_uri=STATE_MANAGER_URI, + key=STATE_MANAGER_SECRET ) # Updated graph nodes diff --git a/docs/docs/exosphere/create-runtime.md b/docs/docs/exosphere/create-runtime.md index 430cad7d..4fffd695 100644 --- a/docs/docs/exosphere/create-runtime.md +++ b/docs/docs/exosphere/create-runtime.md @@ -56,8 +56,8 @@ The `Runtime` class is the core component that manages the execution environment namespace="MyProject", name="MyRuntime", nodes=[MyNode], - state_manager_uri="https://your-state-manager.exosphere.host", - key="your-api-key", + state_manager_uri=STATE_MANAGER_URI, + key=STATE_MANAGER_SECRET, batch_size=32, workers=8, poll_interval=2 @@ -90,8 +90,8 @@ The `Runtime` class is the core component that manages the execution environment Create a `.env` file in your project root: ```bash -EXOSPHERE_URI=https://your-state-manager.exosphere.host -EXOSPHERE_KEY=your-api-key +STATE_MANAGER_URI=https://your-state-manager.exosphere.host +STATE_MANAGER_SECRET=your-api-key ``` Then load it in your code: @@ -260,9 +260,9 @@ spec: - name: runtime image: your-registry/exosphere-runtime:latest env: - - name: EXOSPHERE_URI + - name: STATE_MANAGER_URI value: "https://your-state-manager.exosphere.host" - - name: EXOSPHERE_KEY + - name: STATE_MANAGER_SECRET valueFrom: secretKeyRef: name: exosphere-secrets diff --git a/docs/docs/exosphere/getting-started.md b/docs/docs/exosphere/getting-started.md index 2e7b6fda..89ee4d31 100644 --- a/docs/docs/exosphere/getting-started.md +++ b/docs/docs/exosphere/getting-started.md @@ -12,14 +12,14 @@ Set up your environment variables for authentication: === ".env File" ```bash - EXOSPHERE_URI=your-state-manager-uri - EXOSPHERE_KEY=your-api-key + STATE_MANAGER_URI=your-state-manager-uri + STATE_MANAGER_SECRET=your-api-key ``` === "Environment Variables" ```bash - export EXOSPHERE_URI="your-state-manager-uri" - export EXOSPHERE_KEY="your-api-key" + export STATE_MANAGER_URI="your-state-manager-uri" + export STATE_MANAGER_SECRET="your-api-key" ``` Refer: [Getting State Manager URI](./state-manager-setup.md) diff --git a/docs/docs/exosphere/state-manager-setup.md b/docs/docs/exosphere/state-manager-setup.md index 04e03a7a..bfd2c284 100644 --- a/docs/docs/exosphere/state-manager-setup.md +++ b/docs/docs/exosphere/state-manager-setup.md @@ -23,10 +23,10 @@ The Exosphere state manager is the core backend service that handles workflow ex docker run -d \ --name exosphere-state-manager \ -p 8000:8000 \ - -e MONGO_URI="mongodb://admin:password@mongodb:27017/exosphere?authSource=admin" \ - -e MONGO_DATABASE_NAME="exosphere" \ - -e STATE_MANAGER_SECRET="exosphere@123" \ - -e SECRETS_ENCRYPTION_KEY="YTzpUlBGLSwm-3yKJRJTZnb0_aQuQQHyz64s8qAERVU=" \ + -e MONGO_URI="your-mongodb-connection-string" \ + -e MONGO_DATABASE_NAME="your-database-name" \ + -e STATE_MANAGER_SECRET="your-secret-key" \ + -e SECRETS_ENCRYPTION_KEY="your-base64-encoded-encryption-key" \ ghcr.io/exospherehost/state-manager:latest ``` @@ -78,10 +78,10 @@ The Exosphere state manager is the core backend service that handles workflow ex 3. **Set up environment variables**: ```bash - export MONGO_URI="your-mongodb-connection-string" - export MONGO_DATABASE_NAME="your-database-name" - export STATE_MANAGER_SECRET="your-secret-key" - export SECRETS_ENCRYPTION_KEY="your-base64-encoded-encryption-key" + export MONGO_URI="your-mongodb-connection-string" + export MONGO_DATABASE_NAME="your-database-name" + export STATE_MANAGER_SECRET="your-secret-key" + export SECRETS_ENCRYPTION_KEY="your-base64-encoded-encryption-key" ``` 4. **Run the state manager**: @@ -89,7 +89,9 @@ The Exosphere state manager is the core backend service that handles workflow ex uv run run.py --mode=development ``` - The state manager will be available at `http://localhost:8000` + The state manager will be available at `http://localhost:8000` + +The state manager uri and key would be configured accordingly while setting up nodes and graphs as per the config given locally. ## Production Setup @@ -143,10 +145,10 @@ The Exosphere state manager is the core backend service that handles workflow ex ports: - "8000:8000" environment: - - MONGO_URI=${MONGO_URI} - - MONGO_DATABASE_NAME=${MONGO_DATABASE_NAME} - - STATE_MANAGER_SECRET=${STATE_MANAGER_SECRET} - - SECRETS_ENCRYPTION_KEY=${SECRETS_ENCRYPTION_KEY} + - MONGO_URI=${MONGO_URI} + - MONGO_DATABASE_NAME=${MONGO_DATABASE_NAME} + - STATE_MANAGER_SECRET=${STATE_MANAGER_SECRET} + - SECRETS_ENCRYPTION_KEY=${SECRETS_ENCRYPTION_KEY} deploy: replicas: 3 update_config: @@ -176,8 +178,8 @@ The Exosphere state manager is the core backend service that handles workflow ex name: state-manager-config namespace: exosphere data: - MONGO_URI: "your-mongodb-connection-string" - MONGO_DATABASE_NAME: "your-database-name" + MONGO_URI: "your-mongodb-connection-string" + MONGO_DATABASE_NAME: "your-database-name" LOG_LEVEL: "INFO" ``` diff --git a/docs/docs/exosphere/trigger-graph.md b/docs/docs/exosphere/trigger-graph.md index d8b1f8d5..09643452 100644 --- a/docs/docs/exosphere/trigger-graph.md +++ b/docs/docs/exosphere/trigger-graph.md @@ -13,8 +13,8 @@ The recommended way to trigger graphs is using the Exosphere Python SDK, which p # Initialize state manager state_manager = StateManager( namespace="MyProject", - state_manager_uri=EXOSPHERE_URI, - key=EXOSPHERE_KEY + state_manager_uri=STATE_MANAGER_URI, + key=STATE_MANAGER_SECRET ) # Create trigger state From 377c72ea0a2bba683c27d480c687ce82c9c49280 Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 20:33:50 +0530 Subject: [PATCH 09/15] comments --- README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c7a260a4..88281e8c 100644 --- a/README.md +++ b/README.md @@ -88,12 +88,24 @@ This allows developers to deploy production agents that can scale beautifully to "files_only": "true", "recursive": "false" }, - "next_nodes": ["create_batches"] - }, + "next_nodes": [] + } + ] + } ``` ## Documentation +For comprehensive documentation and guides, check out: + + +- **[Getting Started Guide](https://docs.exosphere.host/exosphere/getting-started/) +- **[State Manager Setup Guide](docs/docs/exosphere/state-manager-setup.md)**: Step-by-step instructions for running the Exosphere backend locally or in production. +- **[Dashboard Guide](docs/docs/exosphere/dashboard.md)**: Learn how to set up and use the Exosphere web dashboard. +- **[Architecture](docs/docs/exosphere/architecture.md)**: Understand core ideas on building graphs like fanout and unite. + +You can also visit the [official documentation site](https://docs.exosphere.host) for the latest updates and more resources. + ## Contributing From de0ac2cd98a5e99605afba1813a6f04bc216f1a5 Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 20:35:47 +0530 Subject: [PATCH 10/15] remove old readme --- READMEold.md | 238 --------------------------------------------------- 1 file changed, 238 deletions(-) delete mode 100644 READMEold.md diff --git a/READMEold.md b/READMEold.md deleted file mode 100644 index 6fd9f14f..00000000 --- a/READMEold.md +++ /dev/null @@ -1,238 +0,0 @@ -![logo light](assets/logo-light.svg#gh-light-mode-only) -![logo dark](assets/logo-dark.svg#gh-dark-mode-only) - -> We are building a world where creators and innovators can fully dedicate themselves to crafting extraordinary products and services, unburdened by the complexities of the underlying infrastructure. We foresee a future where intelligent systems seamlessly operate behind the scenes, tackling intricate, high-scale challenges with immense computational demands and vast data movements. - -To realize this, we are pioneering an open-source infrastructure layer for background AI workflows and agents that is robust, affordable, and effortless to use, empowering the scalable solutions and transformative tasks of today, tomorrow, and beyond. - -## Core Concepts -To have an intution of the first version of the platform, we would highly recommend watching the video below, this explains using our cluster apis with YML input, we are working on more modalities like pythonic control systems. - - - Cluster API YT - - -### Satellite -Satellites are the core building blocks for exosphere. They are lego blocks designed for a specific purpose: you can connect them together to create complex systems in a matter of minutes without worrying about the underlying infrastructure. - -They are pre-implemented serverless functions highly optimized for workflows and high volume batch processing, optimized for cost, reliability, developer velocity and ease of use. - -Our in-house optimization for workflows and batch processing can lead to significant cost savings, for example you can expect a cost per token saving of about 50-75% on LLMs like DeepSeek R1 70B, Gemma 3 27B, etc. - -Each of these satellites must satisfy the following properties: - -1. Should be idempotent and stateless. -2. Should have a unique identifier of the format `satellite/unique-project-name/satellite-name`, example: `satellite/exospherehost/deepseek-r1-distrill-llama-70b` -3. Should take a `config` parameter as an `object` to control or modify the behaviour. -4. Should be totally independent of any other satellite. -5. Should return a `list` of `objects`. -6. Should have following necessary fields: `parents`, `children`, `identifier`, `status`, `retries`, `delay`. Most of these fields are optional are set by the platform itself. -7. Should provide a clean interface for the user to check the status of the satellite and get output data. - -Further work is being done to allow users to bring their own satellites and use our core infrastructure to manage their lifecycle. - -### Cluster -A Cluster is a collection of satellites connected together to form a complete workflow: a series of satellities working together to achieve a common goal. - -Each of these clusters must satisfy the following properties: - -1. Should be a collection of satellites that are connected together to form a system. -2. Should have a unique identifier of the format `cluster/unique-project-name/cluster-name`, example: `cluster/aikin/structured-json` -3. Should define a necessary parameter of `SLA` denoting the maximum time to complete the cluster, **higher the SLA, lower the cost** as systems have more time to optimize for the task (currently supported: `6h`, `12h`, `24h`) -4. Should have a necessary `trigger` parameter to start the cluster, this can be a `cron` expression, or an `api-call` or other possible events. -5. Each cluster can also define `logs` parameter to configure log forwarding to a specific destination like `NewRelic`, `Kusto`, `CloudWatch` or any other logging service. -6. Each cluster can also define `failure` steps to handle the cluster in case of failure, this could again be a set of satellites to run in case of failure. - -Developers can define their own clusters using our cluster api, which supports cluster creation, deletion, status, logs and other operations. Currently we are supporting cluster creation through `YML` files or our APIs and SDKs. - -### Orbit -Orbit is the core compute platform capable of managing the lifecycle of satellites and clusters optimally across multiple computes including GPUs, CPUs, and other hardware. Further allowing developers to write their own satellites and plug-in with our core exosphere platform. - -## Example -Here is an example of using our cluster api to create a satellite cluster to get structured json from PDF files of quaterly financial reports. The workflow in the image could be represented as the `YML` file below. - -![Example Workflow](assets/example-workflow.png) - -```yaml -# define the version of the exosphere apis -version: 0.0.1b - -# using cluster api to create the cluster -cluster: - # maximum allowed to compute the cluster - # define the sla of the cluster (6h, 12h, 24h) - sla: 6h - - # define the name and description of the cluster for better understanding (optional) - title: Structured JSON from Quarterly Financial Reports - description: This cluster will take a list of PDF files from S3 and return a structured JSON output. - - # define the identifier of the cluster (project-name/cluster-name) - identifier: aikin/strucutred-pdfs - - # trigger for the cluster - trigger: - cron: "0 0 * * *" - - # define retries for each satellite, default is 5 - retries: 3 - - # define the secrets for the cluster, these are stored in a secure vault and only accessible by allowed satellites in this cluster - # still be sure to have minimum required permissions for each secret to avoid any security issues - secrets: - - AWS_ACCESS_KEY: "your-aws-access-key" - - AWS_SECRET_KEY: "your-aws-secret-key" - - API_BEARER_TOKEN: "your-api-bearer-token" - - NEW_RELIC_ACCOUNT_ID: "your-new-relic-account-id" - - NEW_RELIC_API_KEY: "your-new-relic-api-key" - - NEW_RELIC_APPLICATION_ID: "your-new-relic-application-id" - - FAILURE_S3_AWS_ACCESS_KEY: "your-failure-s3-aws-access-key" - - FAILURE_S3_AWS_SECRET_KEY: "your-failure-s3-aws-secret-key" - - # satellites in order to execute, each satellite returns a list of objects hence computational graph is formed and is executed in parallel. - satellites: - - name: Get files from S3 - uses: satellite/exospherehost/get-files-from-s3 - identifier: get-files-from-s3 - config: - bucket: aikin-financial-reports - prefix: sec - recursive: true - extension: pdf - secrets: - - AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} - - AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} - - name: Extract text from PDF - uses: satellite/exospherehost/parse-pdf-with-docling - identifier: parse-pdf-with-docling - config: - language: en - output-format: markdown-string - extract-images: false - - name: Get structured json from markdown using DeepSeek - uses: satellite/exospherehost/deepseek-r1-distrill-llama-70b - identifier: deepseek-r1-distrill-llama-70b - retries: 5 - config: - temperature: 0.5 - max-tokens: 1024 - output-format: json - output-schema: | - { - "company": string, - "quarter": string, - "year": string, - "revenue": number, - "net-income": number, - "gross-profit": number, - "operating-income": number, - "net-income-margin": number, - "gross-profit-margin": number, - "operating-income-margin": number, - } - input: - prompt: | - Parse the following quarterly financial report and return a structured json output as defined in the output-schema, report text is provided below: - ${{satellites.parse-pdf-with-docling.output}} - - name: Call Webhook to send the structured json to Aikin API - uses: satellite/exospherehost/call-webhook - identifier: call-webhook - config: - url: https://api.aikin.com/v1/financial-reports - method: POST - headers: - - Authorization: Bearer ${{ secrets.API_BEARER_TOKEN }} - body: - - data: ${{satellites.deepseek-r1-distrill-llama-70b.output}} - file-path: $${{satellites.get-files-from-s3.output.file-path}} - - name: Delete success file from S3 - uses: satellite/exospherehost/delete-file-from-s3 - identifier: delete-file-from-s3 - config: - bucket: aikin-financial-reports - file-path: $${{satellites.get-files-from-s3.output.file-path}} - secrets: - - AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} - - AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} - - - # define steps to handle logs for this cluster - logs: - satellites: - - name: Send logs to NewRelic - uses: satellite/exospherehost/send-logs-to-new-relic - identifier: send-logs-to-new-relic - config: - account-id: ${{ secrets.NEW_RELIC_ACCOUNT_ID }} - api-key: ${{ secrets.NEW_RELIC_API_KEY }} - application-id: ${{ secrets.NEW_RELIC_APPLICATION_ID }} - log-level: info - - # define steps to handle failure for this cluster - failure: - # run from failed steps from this satellite - from: parse-pdf-with-docling - satellites: - - name: Move to failure bucket - uses: satellite/exospherehost/move-to-s3 - identifier: move-to-failure-bucket - config: - origin-source: s3 - origin-bucket: aikin-financial-reports-failure - origin-file-path: $${{satellites.get-files-from-s3.output.file-path}} - destination-source: s3 - destination-bucket: aikin-financial-reports-failure - destination-file-path: failed/quaterly-financial-reports/$${{satellites.get-files-from-s3.output.file-name}} - secrets: - - ORIGIN_AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} - - ORIGIN_AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} - - DESTINATION_AWS_ACCESS_KEY: ${{ secrets.FAILURE_S3_AWS_ACCESS_KEY }} - - DESTINATION_AWS_SECRET_KEY: ${{ secrets.FAILURE_S3_AWS_SECRET_KEY }} - - name: Send failure notification on PagerDuty - uses: satellite/exospherehost/send-pagerduty-alert - identifier: send-pagerduty-alert - config: - pagerduty-api-key: ${{ secrets.PAGERDUTY_API_KEY }} - pagerduty-service-id: ${{ secrets.PAGERDUTY_SERVICE_ID }} - input: - message: | - Cluster ${{cluster.identifier}} failed at ${{cluster.trigger}} for file $${{satellites.get-files-from-s3.output.file-path}} with error ${{satellites.get-files-from-s3.output.error}}, file has been moved to failure bucket with path $${{satellites.move-to-failure-bucket.output.file-uri}} -``` - -This could also be represented as a pythonic control using our SDK/APIs, checkout [documentation](https://docs.exosphere.host) for more details. - -## Documentation -For more information, please refer to our [documentation](https://docs.exosphere.host). - -### Steps to build the Documentation locally -1. Install UV: Follow the official instructions [here](https://docs.astral.sh/uv/#installation). -2. Clone this repository, use command `git clone https://github.com/exospherehost/exospherehost.git` -3. Install dependencies by navigating to `docs` folder and executing `uv sync` -4. Use the command `uv run mkdocs serve` while `docs` folder being your working path. - -### Contribute to Documentation -We encourage contributions to the documentation page, you can simply add a new PR with the `documentation` label. - -## Open Source Commitment - -We believe that humanity would not have been able to achieve the level of innovation and progress we have today without the support of open source and community, we want to be a part of this movement and support the open source community. In following ways: - -1. We will be open sourcing majority of our codebase for exosphere.host and making it available to the community. We welcome all sort of contributions and feedback from the community and will be happy to collaborate with you. -2. For whatever the profits which we generate from exosphere.host, we will be donating a portion of it to open source projects and communities. If you have any questions, suggestions or ideas. -3. We would further be collaborating with various open source student programs to provide support, encourage and mentor the next generation of open source contributors. - -Please feel free to reach out to us at [nivedit@exosphere.host](mailto:nivedit@exosphere.host). Lets push the boundaries of possibilities for humanity together! - -## Contributing -We welcome community contributions. For guidelines, refer to our [CONTRIBUTING.md](/CONTRIBUTING.md). Further we are thankful to all the contributors helping us to simplify infrastructure starting with the process of building and deploying AI workflows and agents. - -![exosphere.host Contributors](https://contrib.rocks/image?repo=exospherehost/exospherehost) - -## Star History - - - - - Star History Chart - - From 669d439c8cad309f40c6cbef90654ba3d4d40142 Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 20:53:53 +0530 Subject: [PATCH 11/15] Update docs/docs/exosphere/create-graph.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- docs/docs/exosphere/create-graph.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/docs/exosphere/create-graph.md b/docs/docs/exosphere/create-graph.md index c0df6ab2..2e635b86 100644 --- a/docs/docs/exosphere/create-graph.md +++ b/docs/docs/exosphere/create-graph.md @@ -125,8 +125,7 @@ Use the `${{ ... }}` syntax to map outputs from previous nodes: - **`${{ node_identifier.outputs.field_name }}`**: Maps output from a specific node - **`initial`**: Static value provided when the flow is triggered -- **Direct values**: String, number, or boolean values - +- **Direct values**: String values. In v1, numbers/booleans must be string-encoded (e.g., "42", "true"). ## Creating Graph Templates The recommended way to create graph templates is using the Exosphere Python SDK, which provides a clean interface to the State Manager API. From 1fafc4c4acfec8e5727f59c66209786f131eeddc Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 20:55:10 +0530 Subject: [PATCH 12/15] Update docs/docs/exosphere/architecture.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- docs/docs/exosphere/architecture.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/docs/exosphere/architecture.md b/docs/docs/exosphere/architecture.md index 5239ddbb..0a534e5c 100644 --- a/docs/docs/exosphere/architecture.md +++ b/docs/docs/exosphere/architecture.md @@ -24,10 +24,9 @@ CREATED → QUEUED → EXECUTING → EXECUTED/ERRORED → SUCCESS 1. **CREATED**: State is initialized with inputs and dependencies 2. **QUEUED**: State is ready for execution and waiting for a runtime 3. **EXECUTING**: State is currently being processed by a runtime -4. **EXECUTED**: State completed successfully with outputs +4. **EXECUTED**: State finished (with outputs) — terminal for that state 5. **ERRORED**: State failed during execution -6. **SUCCESS**: State and all its dependencies are complete - +6. **SUCCESS**: Workflow/branch-level success once all dependent states complete ## Fanout Mechanism From d729df7bab0293895e03735d619f0ede4aaaf141 Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 21:14:50 +0530 Subject: [PATCH 13/15] comments --- docs/docs/exosphere/architecture.md | 9 ++++---- docs/docs/exosphere/create-graph.md | 16 +++++++------- docs/docs/exosphere/create-runtime.md | 25 +++++++--------------- docs/docs/exosphere/getting-started.md | 8 +++---- docs/docs/exosphere/state-manager-setup.md | 2 +- docs/docs/exosphere/trigger-graph.md | 4 ++-- 6 files changed, 27 insertions(+), 37 deletions(-) diff --git a/docs/docs/exosphere/architecture.md b/docs/docs/exosphere/architecture.md index 5239ddbb..3e834d07 100644 --- a/docs/docs/exosphere/architecture.md +++ b/docs/docs/exosphere/architecture.md @@ -18,15 +18,14 @@ Exosphere is built around a **state-based execution model** where workflows are Each state in Exosphere follows a well-defined lifecycle: ``` -CREATED → QUEUED → EXECUTING → EXECUTED/ERRORED → SUCCESS +CREATED → QUEUED → EXECUTED/ERRORED → SUCCESS ``` 1. **CREATED**: State is initialized with inputs and dependencies 2. **QUEUED**: State is ready for execution and waiting for a runtime -3. **EXECUTING**: State is currently being processed by a runtime -4. **EXECUTED**: State completed successfully with outputs -5. **ERRORED**: State failed during execution -6. **SUCCESS**: State and all its dependencies are complete +3. **EXECUTED**: State completed successfully with outputs +4. **ERRORED**: State failed during execution +5. **SUCCESS**: State and all its dependencies are complete ## Fanout Mechanism diff --git a/docs/docs/exosphere/create-graph.md b/docs/docs/exosphere/create-graph.md index c0df6ab2..b61db16c 100644 --- a/docs/docs/exosphere/create-graph.md +++ b/docs/docs/exosphere/create-graph.md @@ -134,12 +134,12 @@ The recommended way to create graph templates is using the Exosphere Python SDK, ```python hl_lines="5-9 23-27" from exospherehost import StateManager -async def create_flow_template(): +async def create_graph_template(): # Initialize the State Manager state_manager = StateManager( namespace="MyProject", - state_manager_uri=STATE_MANAGER_URI, - key=STATE_MANAGER_SECRET + state_manager_uri=EXOSPHERE_STATE_MANAGER_URI, + key=EXOSPHERE_API_KEY ) # Define the graph nodes @@ -168,7 +168,7 @@ async def create_flow_template(): # Run the function import asyncio -asyncio.run(create_flow_template()) +asyncio.run(create_graph_template()) ``` ## Input Mapping Patterns @@ -225,8 +225,8 @@ The state manager validates your graph template: async def get_graph_template(): state_manager = StateManager( namespace="MyProject", - state_manager_uri=STATE_MANAGER_URI, - key=STATE_MANAGER_SECRET + state_manager_uri=EXOSPHERE_STATE_MANAGER_URI, + key=EXOSPHERE_API_KEY ) try: @@ -249,8 +249,8 @@ The state manager validates your graph template: async def update_graph_template(): state_manager = StateManager( namespace="MyProject", - state_manager_uri=STATE_MANAGER_URI, - key=STATE_MANAGER_SECRET + state_manager_uri=EXOSPHERE_STATE_MANAGER_URI, + key=EXOSPHERE_API_KEY ) # Updated graph nodes diff --git a/docs/docs/exosphere/create-runtime.md b/docs/docs/exosphere/create-runtime.md index 4fffd695..680c9939 100644 --- a/docs/docs/exosphere/create-runtime.md +++ b/docs/docs/exosphere/create-runtime.md @@ -56,8 +56,8 @@ The `Runtime` class is the core component that manages the execution environment namespace="MyProject", name="MyRuntime", nodes=[MyNode], - state_manager_uri=STATE_MANAGER_URI, - key=STATE_MANAGER_SECRET, + state_manager_uri=EXOSPHERE_STATE_MANAGER_URI, + key=EXOSPHERE_API_KEY, batch_size=32, workers=8, poll_interval=2 @@ -81,7 +81,7 @@ The `Runtime` class is the core component that manages the execution environment - **`state_manager_uri`** (str | None): URI of the state manager service. If not provided, uses `EXOSPHERE_URI` environment variable. - **`key`** (str | None): API key for authentication. If not provided, uses `EXOSPHERE_KEY` environment variable. - **`batch_size`** (int): Number of states to fetch per poll. Defaults to 16. -- **`workers`** (int): Number of concurrent worker tasks. Defaults to 4. +- **`workers`** (int): Number of concurrent worker threads. Defaults to 4. - **`state_manager_version`** (str): State manager API version. Defaults to "v0". - **`poll_interval`** (int): Seconds between polling for new states. Defaults to 1. @@ -90,8 +90,8 @@ The `Runtime` class is the core component that manages the execution environment Create a `.env` file in your project root: ```bash -STATE_MANAGER_URI=https://your-state-manager.exosphere.host -STATE_MANAGER_SECRET=your-api-key +EXOSPHERE_STATE_MANAGER_URI=https://your-state-manager.exosphere.host +EXOSPHERE_API_KEY=your-api-key ``` Then load it in your code: @@ -119,16 +119,7 @@ runtime = Runtime( ) ``` -### 2. Registration - -Nodes are automatically registered with the state manager when the runtime starts: - -```python -# This happens automatically when you call start() -await runtime._register() -``` - -### 3. Execution +### 2. Execution The runtime starts polling for states and executing nodes: @@ -260,9 +251,9 @@ spec: - name: runtime image: your-registry/exosphere-runtime:latest env: - - name: STATE_MANAGER_URI + - name: EXOSPHERE_STATE_MANAGER_URI value: "https://your-state-manager.exosphere.host" - - name: STATE_MANAGER_SECRET + - name: EXOSPHERE_API_KEY valueFrom: secretKeyRef: name: exosphere-secrets diff --git a/docs/docs/exosphere/getting-started.md b/docs/docs/exosphere/getting-started.md index 89ee4d31..28f43f7b 100644 --- a/docs/docs/exosphere/getting-started.md +++ b/docs/docs/exosphere/getting-started.md @@ -12,14 +12,14 @@ Set up your environment variables for authentication: === ".env File" ```bash - STATE_MANAGER_URI=your-state-manager-uri - STATE_MANAGER_SECRET=your-api-key + EXOSPHERE_STATE_MANAGER_URI=your-state-manager-uri + EXOSPHERE_API_KEY=your-api-key ``` === "Environment Variables" ```bash - export STATE_MANAGER_URI="your-state-manager-uri" - export STATE_MANAGER_SECRET="your-api-key" + export EXOSPHERE_STATE_MANAGER_URI="your-state-manager-uri" + export EXOSPHERE_API_KEY="your-api-key" ``` Refer: [Getting State Manager URI](./state-manager-setup.md) diff --git a/docs/docs/exosphere/state-manager-setup.md b/docs/docs/exosphere/state-manager-setup.md index bfd2c284..d15e7242 100644 --- a/docs/docs/exosphere/state-manager-setup.md +++ b/docs/docs/exosphere/state-manager-setup.md @@ -141,7 +141,7 @@ The state manager uri and key would be configured accordingly while setting up n services: state-manager: - image: ghcr.io/exospherehost/state-manager:latest + image: ghcr.io/exospherehost/exosphere-state-manager:latest ports: - "8000:8000" environment: diff --git a/docs/docs/exosphere/trigger-graph.md b/docs/docs/exosphere/trigger-graph.md index 09643452..5e42d8ae 100644 --- a/docs/docs/exosphere/trigger-graph.md +++ b/docs/docs/exosphere/trigger-graph.md @@ -13,8 +13,8 @@ The recommended way to trigger graphs is using the Exosphere Python SDK, which p # Initialize state manager state_manager = StateManager( namespace="MyProject", - state_manager_uri=STATE_MANAGER_URI, - key=STATE_MANAGER_SECRET + state_manager_uri=EXOSPHERE_STATE_MANAGER_URI, + key=EXOSPHERE_API_KEY ) # Create trigger state From e21e85a9185ea786284603565c0128099749d0ab Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 21:25:34 +0530 Subject: [PATCH 14/15] Update documentation for clarity and consistency - Removed duplicate logo images from README.md. - Updated terminology from "Flow definitions" to "Graph definitions" in README.md. - Added a note in create-graph.md regarding storing secrets securely. - Replaced references to "Examples" and "Concepts" with "Architecture" in dashboard.md and trigger-graph.md for better navigation. - Removed the "Examples" section from register-node.md to streamline content. - Corrected "re-use" to "reuse" in register-node.md for consistency. --- README.md | 6 ++---- docs/docs/exosphere/create-graph.md | 3 +-- docs/docs/exosphere/dashboard.md | 6 ++---- docs/docs/exosphere/register-node.md | 13 +------------ docs/docs/exosphere/state-manager-setup.md | 9 ++------- docs/docs/exosphere/trigger-graph.md | 3 +-- 6 files changed, 9 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 88281e8c..ed178ae3 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ ![logo light](assets/logo-light.svg#gh-light-mode-only) ![logo dark](assets/logo-dark.svg#gh-dark-mode-only) -![logo light](assets/logo-light.svg#gh-light-mode-only) -![logo dark](assets/logo-dark.svg#gh-dark-mode-only) [![Docs](https://img.shields.io/badge/docs-latest-success)](https://docs.exosphere.host) [![Last commit](https://img.shields.io/github/last-commit/exospherehost/exospherehost)](https://github.com/exospherehost/exospherehost/commits/main) [![PyPI - Version](https://img.shields.io/pypi/v/exospherehost)](https://pypi.org/project/exospherehost/) @@ -73,7 +71,7 @@ This allows developers to deploy production agents that can scale beautifully to - ### Define your first flow - Flows are then described connecting nodes with relationships in json objects. Exosphere runs flows as per defined trigger conditions. See [Flow defintions](https://docs.exosphere.host) to see more examples. + Flows are then described connecting nodes with relationships in json objects. Exosphere runs flows as per defined trigger conditions. See [Graph definitions](https://docs.exosphere.host) to see more examples. ```json { "secrets": {}, @@ -99,7 +97,7 @@ This allows developers to deploy production agents that can scale beautifully to For comprehensive documentation and guides, check out: -- **[Getting Started Guide](https://docs.exosphere.host/exosphere/getting-started/) +- **[Getting Started Guide](https://docs.exosphere.host/exosphere/getting-started)** - **[State Manager Setup Guide](docs/docs/exosphere/state-manager-setup.md)**: Step-by-step instructions for running the Exosphere backend locally or in production. - **[Dashboard Guide](docs/docs/exosphere/dashboard.md)**: Learn how to set up and use the Exosphere web dashboard. - **[Architecture](docs/docs/exosphere/architecture.md)**: Understand core ideas on building graphs like fanout and unite. diff --git a/docs/docs/exosphere/create-graph.md b/docs/docs/exosphere/create-graph.md index 1a2e73a5..21e4933b 100644 --- a/docs/docs/exosphere/create-graph.md +++ b/docs/docs/exosphere/create-graph.md @@ -148,7 +148,7 @@ async def create_graph_template(): # Define secrets secrets = { - ... + ... # Store real values in a secret manager or environment variables, not in code. } try: @@ -293,5 +293,4 @@ The Exosphere dashboard provides visual representation of your graphs. Checkout ## Next Steps - **[Trigger Graph](./trigger-graph.md)** - Learn how to execute your workflows -- **[Examples](./examples.md)** - See real-world graph examples - **[Dashboard](./dashboard.md)** - Use the Exosphere dashboard for monitoring diff --git a/docs/docs/exosphere/dashboard.md b/docs/docs/exosphere/dashboard.md index b0c173ff..83cae101 100644 --- a/docs/docs/exosphere/dashboard.md +++ b/docs/docs/exosphere/dashboard.md @@ -153,11 +153,9 @@ View graph runs and debug each node that was created. For additional help: - Check the [State Manager Setup](./state-manager-setup.md) guide -- Review [Concepts](./concepts.md) for workflow understanding -- See [Examples](./examples.md) for usage patterns +- Review [Architecture](./architecture.md) for workflow understanding ## Next Steps -- **[Examples](./examples.md)** - See real-world usage examples -- **[Concepts](./concepts.md)** - Learn about fanout, units, inputs, outputs, and secrets +- **[Architecture](./architecture.md)** - Learn about fanout, units, inputs, outputs, and secrets - **[State Manager Setup](./state-manager-setup.md)** - Complete backend setup guide diff --git a/docs/docs/exosphere/register-node.md b/docs/docs/exosphere/register-node.md index 941b58b3..70eafb1c 100644 --- a/docs/docs/exosphere/register-node.md +++ b/docs/docs/exosphere/register-node.md @@ -63,15 +63,6 @@ class Secrets(BaseModel): encryption_key: str ``` -## Examples - -For node implementation examples, see the **[Node Implementation Examples](./examples/node-examples/index.md)** section, which includes: - -- **[Nodes](./examples/node-examples/basic-nodes.md)** - Fundamental patterns and simple node implementations -- **[Integration](./examples/node-examples/integration-nodes.md)** - Nodes that integrate with external services and systems - -These examples demonstrate common patterns, best practices, and real-world use cases for creating Exosphere nodes. - ## Node Validation The runtime automatically validates your nodes: @@ -133,7 +124,7 @@ Runtime( ### Namespace Organization -Organise nodes to a namespace to re-use them across flows in that namespace +Organise nodes to a namespace to reuse them across flows in that namespace ```python hl_lines="3 10" # Development namespace @@ -153,7 +144,5 @@ Runtime( ## Next Steps -- **[Node Implementation Examples](./node-examples/index.md)** - Comprehensive examples of node implementations - **[Create Graph](./create-graph.md)** - Learn how to connect nodes into workflows - **[Trigger Graph](./trigger-graph.md)** - Execute and monitor your workflows -- **[Examples](./examples.md)** - See real-world workflow examples and use cases diff --git a/docs/docs/exosphere/state-manager-setup.md b/docs/docs/exosphere/state-manager-setup.md index d15e7242..6e1dbfdb 100644 --- a/docs/docs/exosphere/state-manager-setup.md +++ b/docs/docs/exosphere/state-manager-setup.md @@ -225,13 +225,9 @@ The state manager provides a health check endpoint: curl http://localhost:8000/health ``` -Response: +Response: 200 ```json -{ - "status": "healthy", - "timestamp": "2024-01-01T00:00:00Z", - "version": "0.1.0" -} +{"message": "OK"} ``` ### Getting Help @@ -246,4 +242,3 @@ Response: - **[Dashboard Setup](./dashboard.md)** - Set up the web dashboard for monitoring - **[Node Development](./register-node.md)** - Learn how to create and register nodes - **[Graph Creation](./create-graph.md)** - Build workflows using graph templates -- **[Examples](./examples.md)** - See real-world usage examples diff --git a/docs/docs/exosphere/trigger-graph.md b/docs/docs/exosphere/trigger-graph.md index 5e42d8ae..cc217ec0 100644 --- a/docs/docs/exosphere/trigger-graph.md +++ b/docs/docs/exosphere/trigger-graph.md @@ -51,5 +51,4 @@ For more details on using the Exosphere dashboard see the **[Dashboard Guide](./ ## Next Steps - **[Dashboard](./dashboard.md)** - Use the Exosphere dashboard for monitoring -- **[Examples](./examples.md)** - See real-world triggering examples -- **[Concepts](./concepts.md)** - Learn about fanout, units, inputs, outputs, and secrets +- **[ARchitecture](./architecture.md)** - Learn about fanout, unites From 192f75f4f5e78a22c24fc3e3cbcf0b279d58e0c0 Mon Sep 17 00:00:00 2001 From: Nikita Agarwal Date: Sun, 24 Aug 2025 21:34:45 +0530 Subject: [PATCH 15/15] Update documentation for accuracy and consistency - Clarified terminology in create-graph.md, changing "in this flow" to "in this graph." - Updated environment variable names in create-runtime.md for state manager URI and API key for better clarity. - Adjusted import statements in register-node.md to include BaseNode for improved context. - Standardized parameter naming in state-manager-setup.md by changing "api_key" to "key." --- docs/docs/exosphere/create-graph.md | 4 ++-- docs/docs/exosphere/create-runtime.md | 4 ++-- docs/docs/exosphere/register-node.md | 5 ++++- docs/docs/exosphere/state-manager-setup.md | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/docs/exosphere/create-graph.md b/docs/docs/exosphere/create-graph.md index 21e4933b..11d20395 100644 --- a/docs/docs/exosphere/create-graph.md +++ b/docs/docs/exosphere/create-graph.md @@ -103,7 +103,7 @@ Define the nodes in your workflow with their inputs and next nodes: - **`node_name`**: The class name of the node (must be registered) - **`namespace`**: The namespace where the node is registered -- **`identifier`**: Unique identifier for the node in this flow +- **`identifier`**: Unique identifier for the node in this graph - **`inputs`**: Input values for the node - **`next_nodes`**: Array of node identifiers that this node connects to @@ -124,7 +124,7 @@ Use the `${{ ... }}` syntax to map outputs from previous nodes: **Mapping Syntax:** - **`${{ node_identifier.outputs.field_name }}`**: Maps output from a specific node -- **`initial`**: Static value provided when the flow is triggered +- **`initial`**: Static value provided when the graph is triggered - **Direct values**: String values. In v1, numbers/booleans must be string-encoded (e.g., "42", "true"). ## Creating Graph Templates diff --git a/docs/docs/exosphere/create-runtime.md b/docs/docs/exosphere/create-runtime.md index 680c9939..30cd0807 100644 --- a/docs/docs/exosphere/create-runtime.md +++ b/docs/docs/exosphere/create-runtime.md @@ -78,8 +78,8 @@ The `Runtime` class is the core component that manages the execution environment ### Optional Parameters -- **`state_manager_uri`** (str | None): URI of the state manager service. If not provided, uses `EXOSPHERE_URI` environment variable. -- **`key`** (str | None): API key for authentication. If not provided, uses `EXOSPHERE_KEY` environment variable. +- **`state_manager_uri`** (str | None): URI of the state manager service. If not provided, uses `EXOSPHERE_STATE_MANAGER_URI` environment variable. +- **`key`** (str | None): API key for authentication. If not provided, uses `EXOSPHERE_API_KEY` environment variable. - **`batch_size`** (int): Number of states to fetch per poll. Defaults to 16. - **`workers`** (int): Number of concurrent worker threads. Defaults to 4. - **`state_manager_version`** (str): State manager API version. Defaults to "v0". diff --git a/docs/docs/exosphere/register-node.md b/docs/docs/exosphere/register-node.md index 70eafb1c..00a178ee 100644 --- a/docs/docs/exosphere/register-node.md +++ b/docs/docs/exosphere/register-node.md @@ -68,6 +68,9 @@ class Secrets(BaseModel): The runtime automatically validates your nodes: ```python hl_lines="19" +from exospherehost import BaseNode +from pydantic import BaseModel + # ✅ Valid node class ValidNode(BaseNode): class Inputs(BaseModel): @@ -103,7 +106,7 @@ class InvalidNode(BaseNode): Nodes are automatically registered when you start your runtime: ```python hl_lines="14" -from exospherehost import Runtime +from exospherehost import Runtime, BaseNode # Create your nodes class Node1(BaseNode): diff --git a/docs/docs/exosphere/state-manager-setup.md b/docs/docs/exosphere/state-manager-setup.md index 6e1dbfdb..9ea5c593 100644 --- a/docs/docs/exosphere/state-manager-setup.md +++ b/docs/docs/exosphere/state-manager-setup.md @@ -118,7 +118,7 @@ The state manager uri and key would be configured accordingly while setting up n name="YourWorkflow", nodes=[YourNodes], state_manager_uri="https://api.exosphere.host", - api_key="your-production-api-key" + key="your-production-api-key" ).start() ```